这是我的问题......我怀疑我的 C# 屏幕保护程序中的 GDI 资源泄漏只使用托管代码。错误:多次操作后出现“内存不足”。我使用 VS Prof 2013 Update 4 编译并在 Windows 7 64bit 下运行。我尽可能使用Dispose和非静态例程。这是我的问题:
- 作为一个屏幕保护程序,我什至无法使用 JITdebugger(应用程序加载过程只是挂起)
- Deleaker 是 C++ 的工具,而不是 C#
- 详细的 Internet 链接适用于 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# 几乎成功了!
感谢您的创造性反应...
更新 1
我在 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 之间
- 18 到 19 之间的稳定 UserCount
直到故意(用户)引发的崩溃,然后才显示
- GCI 计数 = 62
- 用户数 = 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();