【问题标题】:How to get Process ID and use EmptyWorkingSet on Windows?如何在 Windows 上获取进程 ID 并使用 EmptyWorkingSet?
【发布时间】:2014-10-03 00:39:11
【问题描述】:

我使用游戏引擎,随着游戏的进行,任何未使用的纹理,例如过去关卡中的纹理,似乎都不会自动清除。开发人员虽然声明 DirectX 不需要手动清除其纹理,它只是在不使用时自动将它们换掉。

但是,我的游戏似乎在每个不同级别都会增加其内存使用量。我仍在测试泄漏等,但是我想使用 EmptyWorkingSet winapi 函数来降低内存使用量。

我确实有应用程序的 HWND,如何获取它的进程 id 并使用 EmptyWorkingSet 清除未使用的内存?

【问题讨论】:

  • GetWindowThreadProcessId 返回创建窗口的进程的标识符。
  • 嗯,首先,EmptyWorkingSet 接受进程句柄,而不是进程 ID。其次,如果这是您自己的进程,那么GetCurrentProcess( 将提供句柄。第三,正如@DavidXu 指出的那样,这并没有真正的帮助。例如,纹理不计入工作集,因为它们驻留在 GPU 上,而不是主内存。

标签: c++ windows winapi memory-management process


【解决方案1】:

不要这样做。

EmptyWorkingSet() 不是灵丹妙药,它只会导致您的应用程序使用的内存在任务管理器查询时显得较低,但是内存只会被分页到磁盘,您会得到很多页面结果出现故障。 (双输局面)

解决此问题的唯一正确方法是修复内存泄漏。使用 valgrind 和 cachegrind 来定位问题,并确保在所有需要释放的地方释放内存。

此外,如果您看到的内存使用量上升是任务管理器中的物理内存,这不是 DirectX,因为 Direct3D 会将所有纹理信息存储在服务器内存中(即:VRAM)

【讨论】:

  • 啊,所以 DirectX 确实会处理这个问题。看来我确实有泄漏,现在我看到内存使用量大幅下降。感谢 VRAM 提示。
猜你喜欢
  • 2020-11-03
  • 2011-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-19
  • 2012-12-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多