Optimize GDI+ control rendering, maybe fix GDI+ rendering on Linux?

This commit is contained in:
CasualPokePlayer 2024-05-16 16:40:52 -07:00
parent 84fd85c749
commit ea068cf70d
2 changed files with 25 additions and 15 deletions

View File

@ -14,13 +14,19 @@ namespace BizHawk.Bizware.Graphics.Controls
RenderTarget = createControlRenderTarget(GetControlRenderContext);
SetStyle(ControlStyles.UserPaint, true);
SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
SetStyle(ControlStyles.Opaque, true);
SetStyle(ControlStyles.UserMouse, true);
DoubleBuffered = true;
BackColor = Color.Black;
}
private (SDGraphics Graphics, Rectangle Rectangle) GetControlRenderContext()
=> (CreateGraphics(), ClientRectangle);
{
var graphics = CreateGraphics();
graphics.CompositingMode = CompositingMode.SourceCopy;
graphics.CompositingQuality = CompositingQuality.HighSpeed;
return (graphics, ClientRectangle);
}
/// <summary>
/// The render target for rendering to this control
@ -38,12 +44,25 @@ namespace BizHawk.Bizware.Graphics.Controls
}
public override void Begin()
=> RenderTarget.CreateGraphics();
{
}
public override void End()
{
}
protected override void OnHandleCreated(EventArgs e)
{
base.OnHandleCreated(e);
RenderTarget.CreateGraphics();
}
protected override void OnHandleDestroyed(EventArgs e)
{
base.OnHandleDestroyed(e);
RenderTarget.Dispose();
}
protected override void OnResize(EventArgs e)
{
base.OnResize(e);
@ -51,17 +70,6 @@ namespace BizHawk.Bizware.Graphics.Controls
}
public override void SwapBuffers()
{
if (RenderTarget.BufferedGraphics == null)
{
return;
}
using var g = CreateGraphics();
// not sure we had proof we needed this but it cant hurt
g.CompositingMode = CompositingMode.SourceCopy;
g.CompositingQuality = CompositingQuality.HighSpeed;
RenderTarget.BufferedGraphics.Render(g);
}
=> RenderTarget.BufferedGraphics?.Render(RenderTarget.CurGraphics);
}
}

View File

@ -19,9 +19,11 @@ namespace BizHawk.Bizware.Graphics
if (_getControlRenderContext != null)
{
CurGraphics?.Dispose();
CurGraphics = null;
}
BufferedGraphics?.Dispose();
BufferedGraphics = null;
}
private readonly Func<BufferedGraphicsContext> _getBufferedGraphicsContext;