在编写DirectX应用程序时,显然希望支持用户通过 alt-标签 以某种方式 快速无误. 。确保这一点的最佳实践是什么?需要解决的问题包括:

  1. 检测您的应用程序何时被列出的最佳方法。
  2. 当用户Alt-Tabs以及应对此问题的最佳方法时,DirectX资源将丢失。
  3. 为了获得Alt-TAB支持的目的,在应用程序体系结构中要做的主要工作和要避免的事情。
  4. 主要DirectX版本适用于上述内容之间的任何显着差异。

有趣的技巧和陷阱也很高兴听到。

有帮助吗?

解决方案

我会假设您是为了我的答案而使用的C ++,但是如果您负担得起C#,XNA(http://creators.xna.com/)是一个出色的游戏平台,可为您处理所有这些问题。

1]

本文有助于窗口过程中的Windows事件,以检测窗口何时丢失或获得焦点,您可以在主窗口上处理此操作: http://www.functionx.com/win32/lesson05.htm. 。另外,在此处查看WM_ACTIVATEAPP消息: http://msdn.microsoft.com/en-us/library/ms632614(vs.85).aspx

2]

3]

我会确保永远不要禁用Alt-Tab。您可能需要最小的CPU负载,而应用程序不活动,因为用户可能会贴上Alt-tabbed,因为他们想做其他事情,因此您可以完全暂停应用程序,或者减少每秒呈现的帧。如果将应用程序最小化,您当然也不需要渲染任何内容。在考虑了网络游戏之后,我最好的解决方案是,您仍然应该减少每秒呈现的帧以及处理的网络数据包的数量,甚至可能会丢弃许多包装的数据包,直到重新激活游戏为止。

4]

老实说,如果您想将目标操作系统限制在Vista和更新的情况下,我只会坚持DirectX 9.0C(或DirectX 10):)

最后,DirectX SDK有许多教程和样本: http://www.microsoft.com/downloads/details.aspx?familyid=24A541D6-0486-0486-4453-8641-1EEEEEEEE9E9E21B282&displaylang=en

其他提示

我们通过完全不使用全屏DirectX设备来解决它 - 相反,我们使用了带有最高标志的全屏窗口来隐藏任务栏。如果您从中使用tab,则可以删除标志并将窗口最小化。窗口将质地资源保留。

但是,此方法无法处理由于“锁定屏幕”,CTRL+ALT+DELETE,远程桌面连接,用户交换或类似的设备丢失事件。但是这些不需要非常快速或有效地处理(至少在我们的应用中就是这种情况)

所有严重的D3D应用程序都应该能够处理丢失的设备,因为这是出于各种原因可能发生的事情。

在Vista下的DX10中,有一个新的“超时检测和恢复”功能,这使我在我的经验中很常见图形设备可以重置,这将为您的应用程序造成丢失的设备。这似乎正在进步,因为驱动程序成熟,但无论如何您都需要处理它。

在DX8和9(以及10?)中,如果您使用d3dpool_maned创建资源(主要是顶点和索引缓冲区和纹理),它们将持续到丢失的设备上,并且不需要重新加载。这是因为它们存储在系统内存中,并且DX运行时副本自动将其副本存储到视频内存中。但是,由于复制而导致的性能成本,因此不建议快速更改顶点数据。当然,您将首先介绍以确定是否存在速度问题:-)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top