Skip to content

Commit

Permalink
Debugger: Sprite Viewer - Slightly improve refresh performance by avo…
Browse files Browse the repository at this point in the history
…iding redrawing sprites that haven't changed
  • Loading branch information
SourMesen committed Dec 1, 2023
1 parent 9caf6b7 commit 8411896
Showing 1 changed file with 18 additions and 3 deletions.
21 changes: 18 additions & 3 deletions UI/Debugger/ViewModels/SpritePreviewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@ public class SpritePreviewModel : ViewModelBase

[Reactive] public NullableBoolean UseSecondTable { get; set; }

private UInt32[] _rawPreview = new UInt32[64 * 64];

[Reactive] public DynamicBitmap? SpritePreview { get; set; }
[Reactive] public double SpritePreviewZoom { get; set; }

Expand Down Expand Up @@ -79,13 +81,26 @@ public unsafe void Init(ref DebugSpriteInfo sprite, DebugSpritePreviewInfo previ
}

fixed(UInt32* p = sprite.SpritePreview) {
bool needUpdate = false;

if(SpritePreview == null || SpritePreview.PixelSize.Width != sprite.Width || SpritePreview.PixelSize.Height != sprite.Height) {
SpritePreview = new DynamicBitmap(new PixelSize(Width, Height), new Vector(96, 96), PixelFormat.Bgra8888, AlphaFormat.Premul);
needUpdate = true;
}

int len = Width * Height;
for(int i = 0; i < len; i++) {
if(_rawPreview[i] != p[i]) {
needUpdate = true;
}
_rawPreview[i] = p[i];
}

int spriteSize = Width * Height * sizeof(UInt32);
using(var bitmapLock = SpritePreview.Lock()) {
Buffer.MemoryCopy(p, (void*)bitmapLock.FrameBuffer.Address, spriteSize, spriteSize);
if(needUpdate) {
int spriteSize = len * sizeof(UInt32);
using(var bitmapLock = SpritePreview.Lock()) {
Buffer.MemoryCopy(p, (void*)bitmapLock.FrameBuffer.Address, spriteSize, spriteSize);
}
}
}

Expand Down

0 comments on commit 8411896

Please sign in to comment.