在编写DirectX应用程序时,显然需要支持用户通过快速且无错误的方式通过 Alt - Tab 暂停应用程序。确保这一点的最佳做法是什么?需要解决的问题包括:
有趣的技巧和陷阱也很好听。
答案 0 :(得分:43)
我会假设你使用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]
当应用程序从全屏模式失去焦点时,图形设备会丢失。 Microsoft提供了一篇关于如何处理此问题的文章:http://msdn.microsoft.com/en-us/library/bb174717(VS.85).aspx本文还有一个丢失的设备教程:http://www.codesampler.com/dx9src/dx9src_6.htm
DirectInput也可能有设备丢失错误状态,这里有一个关于此的链接:http://www.toymaker.info/Games/html/directinput.html
DirectSound也可能有设备丢失错误状态,本文有代码处理:http://www.eastcoastgames.com/directx/chapter2.html
3]
我会确保永远不会禁用Alt-Tab。当应用程序处于非活动状态时,您可能希望获得最小的CPU负载,因为用户可能是Alt-Tabbed,因为他们想要执行其他操作,因此您可以完全暂停应用程序,或减少每秒渲染的帧数。如果应用程序被最小化,您当然也不需要渲染任何东西。在考虑网络游戏之后,我最好的解决方案是你仍然应该减少每秒渲染的帧数以及处理的网络数据包的数量,甚至可能丢掉许多进入的数据包,直到重新激活游戏。
4]
老实说,如果你想将目标操作系统限制在Vista及更新版本,我会坚持使用DirectX 9.0c(或DirectX 10),如果可能的话:) :( / p>
最后,DirectX sdk有许多教程和示例:http://www.microsoft.com/downloads/details.aspx?FamilyID=24a541d6-0486-4453-8641-1eee9e21b282&displaylang=en
答案 1 :(得分:2)
我们完全不使用全屏DirectX设备解决了这个问题 - 而是使用了带有最顶部标志的全屏窗口来隐藏任务栏。如果您使用Alt-Tab,则可以删除该标志并最小化窗口。窗口保持纹理资源的活跃性。
但是,由于“锁定屏幕”,Ctrl + Alt + Delete,远程桌面连接,用户切换或类似操作,此方法无法处理设备丢失事件。但是这些不需要非常快速或有效地处理(至少在我们的应用中就是这种情况)
答案 2 :(得分:2)
所有严肃的D3D应用程序都应该能够处理丢失的设备,因为这可能由于各种原因而发生。
在Vista下的DX10中,有一个新的“超时检测和恢复”功能,这使我常常重置图形设备,这会导致您的应用丢失设备。随着驱动程序的成熟,这似乎正在改善,但无论如何你都需要处理它。
答案 3 :(得分:1)
在DX8和9(以及10?)中如果使用D3DPOOL_MANAGED创建资源(主要是顶点和索引缓冲区和纹理),它们将在丢失的设备上保留,不需要重新加载。这是因为它们存储在系统内存中,DX运行时自动复制到视频内存中。但是,由于复制会产生性能成本,因此不建议用于快速更改顶点数据。当然,您首先要确定是否存在速度问题: - )