这是我的问题......我怀疑我的C#屏幕保护程序存在GDI资源泄漏,仅使用托管代码。错误:“在多次操作后内存不足”。我使用VS Prof 2013 Update 4进行编译,并在Windows 7 64位下运行。我尽可能使用Dispose和非静态例程。以下是我的问题:
- 由于是屏幕保护程序,我甚至无法使用JIT debugger(应用程序加载进程停止响应)。 - Deleaker是一个C++工具,而不是C#。 - 详细的网页链接适用于Windows 9x / Windows 2000(来自2001年的MSDN杂志)或Windows 2000 / Windows XP(同样是MSDN杂志)。 - 无法下载GDIObj(显然不可用)。 - 我可以在任务管理器中显示“GDO对象”,但是屏幕保护程序在运行时使用整个屏幕并覆盖它。 - ...还有NirSoft的GDIview(Explorer.exe奇怪地具有最高数量的GDI对象)。
因此,我的问题是...
- 开发人员是否不再使用Visual Studio C#具有GDI资源泄漏的问题? - GDI+能否用于持续更新屏幕?(在仿真应用程序中) - 开发人员是否不再使用GDI / GDI+进行2.5D?(= 多层2D) - 如果是这样,哪种技术最适合仿真类型的应用程序
- 永久运行(理论上) - 定期更新整个屏幕中的某些部分(文本和图形) - 实时运行(可以容忍100毫秒差异,但必须与无线电钟保持同步)。 - 高分辨率图形(以1920x1080格式的像素为单位),即不使用DirectX的低分辨率游戏;不使用单精度GPU算术。
C#几乎很有效!
在感激您的创造性回应之际......
第一次更新
我按照以下方式在C#中实现了GetGuiResources(代码摘录):
- 由于是屏幕保护程序,我甚至无法使用JIT debugger(应用程序加载进程停止响应)。 - Deleaker是一个C++工具,而不是C#。 - 详细的网页链接适用于Windows 9x / Windows 2000(来自2001年的MSDN杂志)或Windows 2000 / Windows XP(同样是MSDN杂志)。 - 无法下载GDIObj(显然不可用)。 - 我可以在任务管理器中显示“GDO对象”,但是屏幕保护程序在运行时使用整个屏幕并覆盖它。 - ...还有NirSoft的GDIview(Explorer.exe奇怪地具有最高数量的GDI对象)。
因此,我的问题是...
- 开发人员是否不再使用Visual Studio C#具有GDI资源泄漏的问题? - GDI+能否用于持续更新屏幕?(在仿真应用程序中) - 开发人员是否不再使用GDI / GDI+进行2.5D?(= 多层2D) - 如果是这样,哪种技术最适合仿真类型的应用程序
- 永久运行(理论上) - 定期更新整个屏幕中的某些部分(文本和图形) - 实时运行(可以容忍100毫秒差异,但必须与无线电钟保持同步)。 - 高分辨率图形(以1920x1080格式的像素为单位),即不使用DirectX的低分辨率游戏;不使用单精度GPU算术。
C#几乎很有效!
在感激您的创造性回应之际......
第一次更新
我按照以下方式在C#中实现了GetGuiResources(代码摘录):
using System.Diagnostics;
using System.Runtime.InteropServices;
static class FreeMem
{
[DllImport("user32.dll")]
static extern uint GetGuiResources(IntPtr hProcess, uint uiFlags);
public static int GetGuiResourcesGDICount()
{
return (int)GetGuiResources(Process.GetCurrentProcess().Handle, 0);
}
public static int GetGuiResourcesUserCount()
{
return (int)GetGuiResources(Process.GetCurrentProcess().Handle, 1);
}
}
我的应用程序显示:
- GCIcount 在 38 到 42 之间保持稳定
- UserCount 在 18 到 19 之间保持稳定
直到故意(由用户)引发崩溃之后,它显示:
- GCIcount = 62
- UserCount = 35
即没有什么戏剧性的变化。
请注意,我经常在一个 1920 x 1080 像素的位图上执行以下操作:
Graphics grTemp = Graphics.FromImage(HighlightedTZ.p_bmpC);
grTemp.DrawImage(DayNight.p_bmp, new Rectangle(0, 0, DayNight.p_bmp.Width, DayNight.p_bmp.Height));
grTemp.Dispose();