work around memory leak in captureOSD; probable original cause: SysdrawingRenderPanel

This commit is contained in:
goyuken 2012-10-02 21:28:14 +00:00
parent 56f58caf4d
commit c8849a8422
1 changed files with 16 additions and 8 deletions

View File

@ -3358,6 +3358,12 @@ namespace BizHawk.MultiClient
} }
} }
// workaround for possible memory leak in SysdrawingRenderPanel
RetainedViewportPanel captureosd_rvp;
SysdrawingRenderPanel captureosd_srp;
/// <summary> /// <summary>
/// sort of like MakeScreenShot(), but with OSD and LUA captured as well. slow and bad. /// sort of like MakeScreenShot(), but with OSD and LUA captured as well. slow and bad.
/// </summary> /// </summary>
@ -3368,18 +3374,20 @@ namespace BizHawk.MultiClient
// "dummy render" class that implements IRenderer, IBlitter, and possibly // "dummy render" class that implements IRenderer, IBlitter, and possibly
// IVideoProvider, and pass that to DisplayManager.UpdateSourceEx() // IVideoProvider, and pass that to DisplayManager.UpdateSourceEx()
var c = new RetainedViewportPanel(); if (captureosd_rvp == null)
{
captureosd_rvp = new RetainedViewportPanel();
captureosd_srp = new SysdrawingRenderPanel(captureosd_rvp);
}
// this size can be different for showing off stretching or filters // this size can be different for showing off stretching or filters
c.Width = Global.Emulator.VideoProvider.BufferWidth; captureosd_rvp.Width = Global.Emulator.VideoProvider.BufferWidth;
c.Height = Global.Emulator.VideoProvider.BufferHeight; captureosd_rvp.Height = Global.Emulator.VideoProvider.BufferHeight;
var s = new SysdrawingRenderPanel(c);
Global.DisplayManager.UpdateSourceEx(Global.Emulator.VideoProvider, s);
Bitmap ret = (Bitmap)c.GetBitmap().Clone(); Global.DisplayManager.UpdateSourceEx(Global.Emulator.VideoProvider, captureosd_srp);
s.Dispose(); Bitmap ret = (Bitmap)captureosd_rvp.GetBitmap().Clone();
c.Dispose();
return ret; return ret;
} }