Debugger: PPU viewer performance fixes

This commit is contained in:
Souryo 2017-03-24 12:14:33 -04:00
parent 6929abd771
commit feb4fc6ac3
4 changed files with 66 additions and 26 deletions

View file

@ -33,6 +33,8 @@ namespace Mesen.GUI.Debugger.Controls
private int _tilePosX = -1;
private int _tilePosY = -1;
private bool _forceChrRefresh = false;
public ctrlChrViewer()
{
InitializeComponent();
@ -58,8 +60,10 @@ namespace Mesen.GUI.Debugger.Controls
}
}
public void RefreshViewer()
public void RefreshViewer(bool refreshPreview = false)
{
_forceChrRefresh = true;
UpdateDropdown();
PictureBox[] chrBanks = new PictureBox[] { this.picChrBank1, this.picChrBank2 };
@ -111,7 +115,7 @@ namespace Mesen.GUI.Debugger.Controls
}
}
this.RefreshPreview(_tileIndex, _bottomBank);
this.RefreshPreview(_hoverTileIndex >= 0 ? _hoverTileIndex : _tileIndex, _hoverTileIndex >= 0 ? _hoverBottomBank : _bottomBank);
this.RefreshPalettePicker();
}
@ -182,10 +186,16 @@ namespace Mesen.GUI.Debugger.Controls
int tileX = Math.Min(e.X / 16, 15);
int tileY = Math.Min(e.Y / 16, 15);
_hoverBottomBank = sender == this.picChrBank2;
_hoverTileIndex = tileY * 16 + tileX;
RefreshViewer();
RefreshPreview(_hoverTileIndex, _hoverBottomBank);
bool bottomBank = sender == this.picChrBank2;
int tileIndex = tileY * 16 + tileX;
if(_forceChrRefresh || bottomBank != _hoverBottomBank || tileIndex != _hoverTileIndex) {
_hoverBottomBank = sender == this.picChrBank2;
_hoverTileIndex = tileY * 16 + tileX;
RefreshViewer();
RefreshPreview(_hoverTileIndex, _hoverBottomBank);
_forceChrRefresh = false;
}
}
private void picChrBank_MouseDown(object sender, MouseEventArgs e)
@ -242,13 +252,18 @@ namespace Mesen.GUI.Debugger.Controls
private void picTile_MouseMove(object sender, MouseEventArgs e)
{
_tilePosX = Math.Max(0, Math.Min(e.X / 16, 7));
_tilePosY = Math.Max(0, Math.Min(e.Y / 16, 7));
int x = Math.Max(0, Math.Min(e.X / 16, 7));
int y = Math.Max(0, Math.Min(e.Y / 16, 7));
RefreshPreview(_tileIndex, _bottomBank);
if(x != _tilePosX || y != _tilePosY) {
_tilePosX = x;
_tilePosY = y;
if(_drawing) {
DrawPixel(e.Button == MouseButtons.Left, _tilePosX, _tilePosY);
RefreshPreview(_tileIndex, _bottomBank);
if(_drawing) {
DrawPixel(e.Button == MouseButtons.Left, _tilePosX, _tilePosY);
}
}
}

View file

@ -20,6 +20,7 @@ namespace Mesen.GUI.Debugger.Controls
private byte[][] _attributeData = new byte[4][];
private Bitmap _gridOverlay;
private Bitmap _nametableImage = new Bitmap(512, 480);
private int _currentPpuAddress = -1;
public ctrlNametableViewer()
{
@ -42,6 +43,8 @@ namespace Mesen.GUI.Debugger.Controls
public void RefreshViewer()
{
_currentPpuAddress = -1;
int xScroll, yScroll;
InteropEmu.DebugGetPpuScroll(out xScroll, out yScroll);
@ -146,10 +149,6 @@ namespace Mesen.GUI.Debugger.Controls
int baseAddress = 0x2000 + nametableIndex * 0x400;
DebugState state = new DebugState();
InteropEmu.DebugGetState(ref state);
int bgAddr = state.PPU.ControlFlags.BackgroundPatternAddr;
int tileX = Math.Min(e.X / 8, 63);
int tileY = Math.Min(e.Y / 8, 59);
int shift = (tileX & 0x02) | ((tileY & 0x02) << 1);
@ -161,12 +160,22 @@ namespace Mesen.GUI.Debugger.Controls
tileY -= 30;
}
int ppuAddress = (baseAddress + tileX + tileY * 32);
if(_currentPpuAddress == ppuAddress) {
return;
}
_currentPpuAddress = ppuAddress;
DebugState state = new DebugState();
InteropEmu.DebugGetState(ref state);
int bgAddr = state.PPU.ControlFlags.BackgroundPatternAddr;
int tileIndex = _tileData[nametableIndex][tileY*32+tileX];
int attributeData = _attributeData[nametableIndex][tileY*32+tileX];
int attributeAddr = baseAddress + 960 + ((tileY & 0xFC) << 1) + (tileX >> 2);
int paletteBaseAddr = ((attributeData >> shift) & 0x03) << 2;
this.txtPpuAddress.Text = (baseAddress + tileX + tileY * 32).ToString("X4");
this.txtPpuAddress.Text = _currentPpuAddress.ToString("X4");
this.txtNametable.Text = nametableIndex.ToString();
this.txtLocation.Text = tileX.ToString() + ", " + tileY.ToString();
this.txtTileIndex.Text = tileIndex.ToString("X2");

View file

@ -16,6 +16,7 @@ namespace Mesen.GUI.Debugger.Controls
{
private byte[] _paletteRam;
private byte[] _palettePixelData;
private int _paletteIndex = -1;
public ctrlPaletteViewer()
{
@ -35,6 +36,8 @@ namespace Mesen.GUI.Debugger.Controls
public void RefreshViewer()
{
_paletteIndex = -1;
GCHandle handle = GCHandle.Alloc(this._palettePixelData, GCHandleType.Pinned);
try {
Bitmap source = new Bitmap(4, 8, 4*4, System.Drawing.Imaging.PixelFormat.Format32bppArgb, handle.AddrOfPinnedObject());
@ -57,19 +60,24 @@ namespace Mesen.GUI.Debugger.Controls
{
int tileX = Math.Min(e.X / 32, 31);
int tileY = Math.Min(e.Y / 32, 31);
int tileIndex = tileY * 4 + tileX;
this.txtColor.Text = _paletteRam[tileIndex].ToString("X2");
this.txtPaletteAddress.Text = (0x3F00 + tileIndex).ToString("X4");
if(tileIndex != _paletteIndex) {
_paletteIndex = tileIndex;
Bitmap tile = new Bitmap(64, 64);
using(Graphics g = Graphics.FromImage(tile)) {
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor;
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.None;
g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.Half;
g.DrawImage(picPalette.Image, new Rectangle(0, 0, 64, 64), new Rectangle(tileX*32, tileY*32, 32, 32), GraphicsUnit.Pixel);
this.txtColor.Text = _paletteRam[tileIndex].ToString("X2");
this.txtPaletteAddress.Text = (0x3F00 + tileIndex).ToString("X4");
Bitmap tile = new Bitmap(64, 64);
using(Graphics g = Graphics.FromImage(tile)) {
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor;
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.None;
g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.Half;
g.DrawImage(picPalette.Image, new Rectangle(0, 0, 64, 64), new Rectangle(tileX*32, tileY*32, 32, 32), GraphicsUnit.Pixel);
}
this.picColor.Image = tile;
}
this.picColor.Image = tile;
}
}
}

View file

@ -19,6 +19,7 @@ namespace Mesen.GUI.Debugger.Controls
private int _selectedSprite = -1;
private bool _largeSprites;
private int _spritePatternAddr;
private bool _forceRefresh;
public ctrlSpriteViewer()
{
@ -42,6 +43,8 @@ namespace Mesen.GUI.Debugger.Controls
public void RefreshViewer()
{
_forceRefresh = true;
GCHandle handle = GCHandle.Alloc(_spritePixelData, GCHandleType.Pinned);
try {
Bitmap source = new Bitmap(64, 128, 4*64, System.Drawing.Imaging.PixelFormat.Format32bppArgb, handle.AddrOfPinnedObject());
@ -114,7 +117,12 @@ namespace Mesen.GUI.Debugger.Controls
int tileY = Math.Min(e.Y / 64, 63);
int ramAddr = ((tileY << 3) + tileX) << 2;
if(ramAddr / 4 == _selectedSprite && !_forceRefresh) {
return;
}
_forceRefresh = false;
_selectedSprite = ramAddr / 4;
int spriteY = _spriteRam[ramAddr];