Debugger: PPU viewer performance fixes
This commit is contained in:
parent
6929abd771
commit
feb4fc6ac3
4 changed files with 66 additions and 26 deletions
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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];
|
||||
|
|
Loading…
Add table
Reference in a new issue