39

在编写 DirectX 应用程序时,显然需要支持用户通过Alt-Tab以一种快速且无错误的方式暂停应用程序。确保这一点的最佳实践是什么?需要解决的问题包括:

  1. 检测应用程序何时被 alt-tabbed 退出以及何时返回的最佳方法。
  2. 当用户使用 alt-tabs 时会丢失哪些 DirectX 资源,以及解决此问题的最佳方法。
  3. 为了 alt-tab 支持,在应用程序架构中要做的主要事情和要避免的事情。
  4. 适用于上述内容的主要 DirectX 版本之间的任何显着差异。

有趣的技巧和陷阱也很值得一听。

4

4 回答 4

44

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

1]

本文有助于窗口过程中的窗口事件检测窗口何时失去或获得焦点,您可以在主窗口上处理此问题: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]

老实说,如果可能的话,我会坚持使用 DirectX 9.0c(或 DirectX 10,如果您想将目标操作系统限制为 Vista 和更新版本):)

最后,DirectX sdk 有大量教程和示例:http ://www.microsoft.com/downloads/details.aspx?FamilyID=24a541d6-0486-4453-8641-1eee9e21b282&displaylang=en

于 2009-06-09T21:56:12.430 回答
2

我们通过完全不使用全屏 DirectX 设备解决了这个问题 - 相反,我们使用带有最顶部标志的全屏窗口来隐藏任务栏。如果您使用 Alt-Tab 退出,您可以删除标志并最小化窗口。纹理资源由窗口保持活动状态。

但是,这种方法不能处理由于“锁定屏幕”、Ctrl+Alt+Delete、远程桌面连接、用户切换或类似原因而发生的设备丢失事件。但是这些不需要非常快速或有效地处理(至少在我们的应用程序中是这样)

于 2009-06-16T20:26:53.833 回答
2

所有严肃的 D3D 应用程序都应该能够处理丢失的设备,因为这可能由于多种原因而发生。

在 Vista 下的 DX10 中,有一个新的“超时检测和恢复”功能,在我的经验中,重置图形设备很常见,这会导致您的应用程序丢失设备。随着驱动程序的成熟,这似乎正在改善,但无论如何您都需要处理它。

于 2009-06-17T13:46:22.013 回答
1

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

于 2009-06-16T02:09:59.470 回答