这是我的问题...我怀疑我的 C# 屏幕保护程序中存在仅使用托管代码的 GDI 资源泄漏。错误:多次操作后出现"内存不足"。我使用 VS Prof 2013 Update 4 进行编译,并在 Windows 7 64 位下运行。我尽可能使用处置和非静态例程。这是我的问题:
- 作为屏幕保护程序,我什至无法使用JITdebugger(应用程序加载过程只是挂起)
- Deleaker是用于C++的工具,而不是C# 详细的互联网链接适用于Windows 9x/Windows 2000(MSDN杂志,
- 2001年)或Windows 2000/Windows XP(也称为MSDN杂志)
- 无法下载 GDIObj(显然不可用)
- 我可以在任务管理器中显示"GDO 对象",但屏幕保护程序使用整个屏幕并在运行时覆盖它
- 。还有来自NirSoft的GDIview(资源管理器.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);
}
}
我的应用程序显示
- GCI计数稳定在38和42之间
- 稳定的用户计数介于 18 和 19 之间
直到故意(用户-)引发崩溃,之后它显示
- 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();
可以使用第二个系统远程调试 C# 代码。
如果您只有一台机器可用,则可以使用虚拟机系统创建第二个系统,例如 Oracle 的免费 Virtual Box(我推荐这个)或其他一些 VM 软件。您将需要有效的 Windows 许可证,因为即使您的 VM 软件正在模拟计算机,新操作系统也会将其计为真实计算机。如果您有 MSDN 订阅,则可以获取额外的操作系统许可证密钥,用于调试和开发目的。
将产品放在该 VM 上,在 VM 上安装 Visual Studio 远程错误程序,启动它并确保可以从主机的 Visual Studio 访问它(通过使用附加到主机的 Visual Studio 的进程)。现在,您已准备好进行远程调试。
让屏幕保护程序在 VM 上启动。启动后,通过使用远程调试器附加到屏幕保护程序来启动主机 VS 调试。现在设置断点和观察点,并正常调试。
如果您有第二个可用的窗口框,则不需要虚拟机软件。只需在第二台Windows计算机上安装您的产品(屏幕保护程序),在其上安装Visual Studio远程调试工具集,启动远程调试器,将其设置为允许您访问它,启动首选计算机的Visual Studio,等待屏幕保护程序在第二台计算机上启动,从Visual Studio附加,设置断点, 监视项目,并正常调试。