我可以存储D3D9纹理,以便它们不消耗进程内存,也不需要“丢失的设备”处理?

我有一个使用大量纹理内存的OpenGL应用程序。 纹理存储在系统内存中时,该纹理内存不是我应用程序进程内存的一部分。

当这个应用程序被移植到D3D并且纹理上传到D3DPOOL_MANAGED池时, 进程内存与纹理内存成正比,并且由于内存不足而导致应用程序崩溃(在OpenGL中,即使整个系统内存利用率增加, 进程内存仍然很低)

我不想切换到D3DPOOL_DEFAULT ,因为当设备重置时,我将不得不重新加载所有纹理。 是否有一个可行的解决scheme,让我的D3D9应用程序将系统纹理内存放在我的进程旁边的其他地方,类似于OpenGL?

编辑:所以我刚刚了解IDirect3DDevice9Ex 。 原来使用这个接口代替IDirect3DDevice9使得DirectX在纹理内存方面的工作与opengl完全一样(系统内存与我的纹理使用量成正比,而不是进程内存)。 所以这是我的一个select。 但是,我仍然想知道是否有任何选项,因为IDirect3DDevice9Ex不能在XP上工作。

如果不希望纹理由系统内存支持,请不要使用D3DPOOL_MANAGED 。 使用D3DPOOL枚举的其他成员 (并相应地更改您的代码)。

通常这意味着selectD3DPOOL_DEFAULT并处理设备重置。 你其实没有其他的select,那就是D3D9的工作原理。 如果您可以容忍IDirect3DDevice9Ex ,这将改变您丢失的设备行为( 请参阅此处和此处 ),但是也请注意,根本不能使用IDirect3DDevice9Ex D3DPOOL_MANAGED

你也可以考虑转向D3D 10+的更激进的步骤(但是这也将花费你的XP支持)。

如果你使用的是D3D9Ex是Vista +,那么你应该完全没有理由不使用D3D11(不要打扰10;没有支持10的系统不支持11如果最新的,最新的服务包被安装)。 您可以在D3D11中使用较低的function级别 ,这样您的游戏仍然可以在较旧的硬件上运行。

请注意,根据蒸汽硬件调查 ,只有6.4%的用户甚至在运行XP(令人困惑的是,还有14%的用户使用了支持DX10 / 11的GPU,并运行在XP上)。 如果你的目标是北美,XP可以被认为是遗物。 一些其他市场仍然有更高的XP安装率,但他们也往往有较旧的硬件。

至于直接回答你的问题:不。 D3D要求内存在您的进程空间中进行管理,或根本不进行。 如果没有管理,那么你必须处理丢失的设备。

对于什么是值得的,即使使用D3D10 / 11 / GL,您仍然应该处理移除的设备问题。 丢失的设备是XP的遗迹(当操作系统试图坚持给予GPU的进程总体控制权时,可能需要将其扳回)。 删除/重置设备可能包含驱动程序崩溃和重新启动。 如果你处理移除的设备,你将不得不处理重新加载资源。 这是您可以提供给用户的更好的function之一; 我记得无主之地管理让我的GPU由于硬件问题频繁locking,Windows将检测到locking的GPU,然后重置(将屏幕变黑并冻结系统几秒钟),然后无主之地将继续甚至发生了。 大多数其他游戏只是死了,所有的进展都失去了。

请注意,GL没有标准的方法来检测移除/重置设备,这可能是因为大多数GL实现都会导致内核崩溃(这是用户喜欢在Vista +上使用D3D编写的游戏的原因之一) :系统会更稳定)。 移动平台倾向于通过某种方式来增加设备的资源和多任务模式(这基本上是D3D9丢失设备的情况; PC上已经存在,但仍然在手机上运行,​​尽管是在供应商专有蜜蜂)。

绝对最好的想法是更新你的引擎,以便能够处理需要重新加载资产的需求。 那么你可以在任何平台或API(除了桌面GL之外)处理丢失的设备的任何变化或几乎删除/重置设备。

首先要考虑的是:XP支持真的很重要吗? 你有没有真正分析你的潜在客户群,并确定XP支持是你需要的东西? 还是仅仅基于直觉? 除非你有数据支持,否则失去XP支持可能是你可以轻易承担的事情。

如果您的进程地址空间不足(我假设这意味着您正在构建一个32位应用程序),那么您的程序已经有相当繁重的硬件要求。 在这里你需要面对一个现实,那就是大多数仍然在XP机器上的人也会使用旧的硬件。 此硬件可能无法支持您的程序的要求 。 一些供应商甚至可能没有XP驱动程序可用于您的程序所需的硬件types(例如,AMD似乎不再为HD6000系列笔记本电脑卡做XP驱动程序)。 你需要在这里得到你的要求现实。

基于这一点,我怀疑你希望继续支持XP是一个人为的限制,你自己。 我希望你能够重新考虑这个问题,至less要做一些研究(你可能已经做了,但是在你的问题中没有提到),以确定它是否是你所需要的。

关于OpenGL和D3D的内存使用情况,我的猜测 (这只是一个猜测),就是D3D将系统内存备份存储在用户空间中,而你的GL驱动程序将其存储在内核空间中。

我在上面说了“你的GL驱动程序”,因为这导致我进入第二件事情:因为GL驱动程序完全由硬件供应商实现,所以不同的GL驱动程序可能会有不同的performance。 您的驱动程序可能与您使用的内存容量相符,您的程序的用户可能与不同的供应商使用不同的硬件,而硬件可能不一样。

我在这里说的是,在你自己的机器上,GL和D3D之间的区别比你的手更大。 你有一个问题,也可能会阻止你的程序在GL下的其他人的机器上工作。

这里的根本原因是你正在使用大量的纹理内存。 有处理这个问题的标准方法:使用压缩纹理,在低内存情况下使用较低分辨率纹理,卸载不再需要的纹理,实现纹理stream。 除了重新考虑XP的要求,这是你可能需要处理的东西。