DirectX应用程序中Alt-Tab支持的最佳实践?
在编写DirectX应用程序时,显然希望通过Alt – Tab以快速和无错的方式支持用户挂起应用程序。 什么是确保这一点的最佳做法? 需要解决的事情包括:
- 检测应用程序何时被退出并返回的最佳方法。
- 什么DirectX资源丢失时,用户alt-tabs,和最好的办法来应付这一点。
- 为了支持alt-tab而在应用程序体系结构中要做的主要事情和要避免的事情。
- 主要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]
-
当应用程序从全屏模式失去焦点时,graphics设备会丢失。 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,因为他们想要做别的,所以你可以完全暂停应用程序,或减less每秒渲染的帧。 如果应用程序被最小化,你当然也不需要渲染任何东西。 在考虑一个networking游戏之后,我最好的解决scheme是,你还应该减less每秒渲染的帧数以及处理的networking数据包的数量,甚至可能丢掉许多进来的数据包,直到重新激活游戏。
4]
老实说,我会坚持使用DirectX 9.0c(或DirectX 10,如果你想限制你的目标操作系统为Vista和更新),如果可能的话:)
最后,DirectX sdk有许多教程和示例: http : //www.microsoft.com/downloads/details.aspx? FamilyID=24a541d6-0486-4453-8641-1eee9e21b282&displaylang=en
我们通过完全不使用全屏DirectX设备来解决这个问题 – 相反,我们使用了带有最顶级标志的全屏窗口来隐藏任务栏。 如果你的Alt-Tab超出了这个范围,你可以删除标志并最小化窗口。 纹理资源通过窗口保持活动状态。
但是,这种方法不能处理由于“locking屏幕”,Ctrl + Alt + Delete,远程桌面连接,用户切换或类似情况而发生的设备丢失事件。 但是这些并不需要非常快速或有效的处理(至less在我们的应用中就是这样)
所有严重的D3D应用程序都应该能够处理丢失的设备,因为这可能是由于各种原因而发生的。
在Vista下的DX10中,有一个新的“超时检测和恢复”function,使得我的graphics设备重置的经验非常普遍,这会导致您的应用程序丢失设备。 随着驾驶员的成熟,这似乎正在改善,但无论如何你需要处理。
在DX8和9(和10?)中,如果您使用D3DPOOL_MANAGED创build资源(主要是顶点和索引缓冲区和纹理),它们将保留在丢失的设备上,不需要重新加载。 这是因为它们存储在系统内存中,DX运行时自动复制到video内存。 但是,由于复制,会有性能成本,因此不推荐用于快速更改顶点数据。 当然,你会首先确定是否有速度问题:-)