§8.4Rocket Commander游戏
关于post-screen shaders我们已经说了很多了,现在没剩下多少篇幅留给Rocket Commander游戏。这没关系,因为Rocket Commander已经推出一年有余,有很多教程,其中包括非常受欢迎的Coding4Fun网上的视频教程系列。
没必要再次重复了,Rocket Commander也在Managed DirectX NET 1.1上被编写,游戏本身运行在NET 2.0。Managed DirectX与XNA有些不同——很多事情可以容易移植,但所有字体渲染,sprite处理等等是完全不同的,一些功能,如动画模型仍不能被XNA支持(至少不容易导入)。
因此,XNA版本的Rocket Commander只展示基本引擎,但它仍很棒很有趣,即使在Xbox 360上用Xbox 360手柄控制。本节仅讨论从MDX迁移到XNA。如果你想了解更多请访问网站www.RocketCommander.com,查看视频教程、阅读源代码和文件、并玩其中一个Mod游戏。
XNA的性能
没有人相信XNA的性能有多好,主要的原因是大部分XNA游戏只是简单的2D游戏,不关心性能、3D硬件和shader效果。另外一个原因是,很多人认为将DirectX包装成MDX或XNA,最终还是重定向调用的DirectX基础框架,这会导致性能下降。但你能在XNA中少些很多代码,而且写起来更简单,这一点相当重要。特别是如果你想要做跨Windows和Xbox 360平台的游戏时,只使用C++实现所有功能工作量很大。相比一个经验丰富的XNA团队,您可能需要两倍的程序员才能完成同样的工作,而且更有可能会遇到诸如内存问题、指针管理、非托管环境中的全面管理等问题。
以前我已证明,大多数程序员错误认为MDX比DirectX慢得多并不对。如果您的代码占用了100%的GPU和100%的CPU,您可能根本就没法编出游戏,这只是一个压力测试。即使在这种情况下托管的DirectX也能达到几乎相同的性能(98%~99%),但这对于真正的游戏并不重要,因为你没有时间去优化每一个行代码。相反你把重点放在重要部分,并努力使最常被使用的10%~20%代码工作得尽可能快。给其余80%~90%进行优化花费5倍时间性能却只提升百分之几。
你应把关注游戏本身。玩家不关心游戏运行在59或58帧,他只想要一个有趣的游戏,如果你允许不同的设置,他甚至能让分辨率最小、关闭效果去获得更高的帧率。今天太多的游戏只侧重于画面(像我在这本书中做的那样,但至少我也展示了许多酷游戏的想法,希望您能使用基本代码写出自己的游戏,而不是长时间编写游戏引擎而不制作自己的游戏)。
Rocket Commander的代码被高度优化,当我开发的第一个版本时我做了大量的性能测试后。整个游戏编码占用了四个星期,如果你只有这点时间,你很难实现最佳的shader效果。但我仍然设法在配有Shader Model 2.0显卡的中端计算机实现了超过每秒100帧的帧频,高分辨率下能同时显示5000的小行星(换句话说,每秒超过3000万多边形),同时包括碰撞测试和其他一些效果。低端PC,即便完全没有shader支持,仍然能够运行游戏。它看起来不够漂亮,但很不错了。
今天的电脑变得更快,CPU有多个内核,可以被用来在同一时间执行不同任务。Xbox 360有三个核心和6个线程,它们执行所有您需要的的游戏代码。我不知道今天的任何一个Xbox 360游戏是否确实需要这一强大的CPU能力,GPU也很快,但在高分辨率下仍然是GPU将阻止您获得更好的帧速率。
Rocket Commander游戏是一个很好的例子,展示了如何将工作分为两个内核。物理计算和预测试要占用一半的CPU时间(有时甚至更多),渲染效果占用另一半CPU时间。物理可以并行处理,因为所有物理计算检查两个小行星受否相交,如果相交则反弹(见图8月20日),并确保他们不再相交。
下一帧将更新新的物理位置、运动矢量等等,有点坏处是,因为物理计算的是下一帧而不是当前帧(因为大多数小行星将根据物理计算被渲染了,再渲染新的位置已为时过晚)。正如您所看到图8-20,你不必检查每一个小行星,只需检查临近的,还可以把它们放在区域中进一步,在原始版本的Rocket Commander中能提高1/10的性能。
Rocket Commander XNA版本比原来的更好。在Xbox(或PC)上能达到HDTV 1080p的分辨率,并仍使用所有图形效果,使用全屏反锯齿,并在高帧率中同时显示数千颗小行星。
从MDX迁移到XNA
Rocket Commander基本引擎与XnaGraphicEngine类似,在一些地方有更多的功能,如动画模型、渲染大量小行星的优化处理等。例如小行星都使用相同的shader和材质以一个非常有效率的方式被渲染。但其他一些功能,XnaGraphicEngine比Rocket Commander更容易和更好,如字体和sprite管理等。你还可以插入新的shader去改变Rocket Commander的视觉效果。
请注意,一些原版本有的功能,如动画模型支持或镜头眩光occlusion测试在XNA中无法实现。occlusion测试在XNA框架丢失了。我猜想这是因为很难以相同的方式工作在PC和Xbox 360,镜头眩光效果有破绽:当一个小行星挡住前面的阳光是,眩光也不会消失和淡入淡出。动画模型可以通过custom model processing(自定义模型处理过程)或为模型采用一种新的格式实现。但为了移植简单,你当然不希望再导出每个模型并一一加以测试。
网络代码在Xbox 360版本中也被剔除,因为在Xbox 360没有System.Net命名空间。Windows版本仍能通过网络服务从互联网服务器上发送和接收最高分数。各关卡和其他游戏数据是100%兼容的,MOD版本也能被移植到XNA上。欢迎更多的Rocket Commander MOD版本,特别是对XNA框架。我总是很高兴地接收到电子邮件告诉我成功事例。
在2006年底,我在网站上发表了一篇很长的文章,比较了MDX与XNA并讨论了使用XNA的优缺点。如果你以前学习过MDX,想知道XNA是否值得学习,去看看那篇文章。在Rocket Commander XNA版本中又增加了点新功能,特别是更多的单元测试和多线程,我马上就要谈到,但源代码减少了10%以上,这表明你可以移植了一个项目使它更简单。如果你刚开始新的XNA项目,效果是显而易见的。
使用线程来改进性能
Rocket Commander XNA版本在Windows和Xbox 360上性能都很好,尤其是当只是做一些基准测试时是绝对完美的。GPU是用到了极限,没有任何理害怕托管代码。Windows的性能尤其好。我所有的游戏和程序即使在低分辨率,一个线程时也完全是要使用GPU的。
在Xbox 360性能有所损失,你必须考虑很多事情,这是因为文档不多。举例来说,在Xbox 360最糟糕的事是每一帧都产生新的数据,即使你只是建立一个迭代器执行foreach循环,它也会影响性能。但Xbox 360的优点是您手头有三个核心(和6个硬件线程)让您来优化性能,对于Rocket Commander游戏来说能极大地优化游戏循环,因为物理和更新线程占用了近50%的CPU时间,这在电脑上并不重要,因为是GPU拖慢了性能(见图8-21),但在Xbox 360上使用多个线程上帧速率几何能增加一倍。
结果与截图
Rocket Commander XNA版本是比原始版本运行得更好,支持Xbox 360和XNA框架。归功于多线程,你能容易地将物理和渲染引擎分开处理,游戏比以前性能好很多,物理效果更好,渲染引擎有更多时间渲染更多小行星,如果你喜欢还可以添加其他很酷的效果。
XNA版本和原始版本看上去类似,您只有通过缺失的功能(如动画模型和镜头眩光occlusion检查),或只在看游戏中的新文字加以区别。我在主菜单添加了XNA的图标显示区别(见图8-22)。
希望你玩得愉快。Rocket Commander原始版本是免费提供的,你可以自己改造。图8-23是Rocket Commander截图。
发布时间:2008/9/24 上午10:15:15 阅读次数:6183