§ 2.6 疑难解答
希望本章不会有太多的难题。本章只涉及了两个主要问题:单元测试和Sprites。或许在Xbox 360上运行游戏您还有些问题,我已经在第一章的结尾处写了一些提示和技巧;如果您仍然有Xbox 360设定的问题,可以去查看。
另一个问题大多数人都不会提出,但对于少数对异常处理,尤其是对XNA异常没经验的人来说却会提出,那就是要理解为什么会抛出异常,并且要如何正确解决它。要随时紧盯着异常,试着回顾完整的堆栈跟踪,查看是否有带有详细描述信息的内部异常。
就像 Managed DirectX,有时您会得到来自底层 DirectX Framework 的异常,有时候它会令人困惑。试着到 Internet 和 MSDN 查找对应错误代码的帮助信息。在这些情况下,上下文背景通常要比错误信息本身更重要。比如,在编译一个 Shader 失败之后,您可能会得到奇怪的错误编码,此时应该确定Shader文件是否存在,是否能够被正确编译,您的硬件能否处理它,而不是试图查明这些错误编码什么意思。有一个用来检查Shader文件是否有效的好工具,它就是来自于 Nvidia 的 FX Composer。
如果您在使用单元测试的时候陷入麻烦,也请阅读下一章的“疑难解答”部分,因为它也讨论了很多单元测试。几乎始终要记住,此处您使用的单元测试和标准程序没有什么区别;同种方式对待它们。要像对待最终的应用程序一样对它们进行Debug 并一步步地跟踪。
最后,是一些在XNA中使用Sprites的提示:
如果您在其他精灵的上面渲染很多Sprites,会出现很多XNA按随机排序显示的后果,以及使用不同Texture时的问题,而且背景Sprite有时会掩盖被该在它前面的一切。就像您在XNA Pong游戏中看到的,通过额外的SpriteBatch方法调用来渲染背景。这样它就被独立出来,不会干扰游戏或者菜单中的其他Sprite。
试着一次性渲染所有的Sprite,尤其是当您可以使用混合模式对它们进行排序的时候。如果你高效调用一次SpriteBatch,渲染所有的Sprite会使速度快很多。查看作为范例的DrawSprites方法。如果您使用不同的混合模式,比如附加光源效果,并且其他所有的Sprite使用Alpha混合,试图分两个过程来渲染,先渲染Alpha混合物体,然后在顶部添加光源。这样做您的游戏效能会提升200%-300%。
要考虑分辨率问题,以及如何处理不同的宽度和高度;您可以在Initialize方法中借助下面两行代码来获取当前使用的分辨率:
width = graphics.GraphicsDevice.Viewport.Width;
height = graphics.GraphicsDevice.Viewport.Height;
不能强制使用某个特定的分辨率;因为在Xbox 360上它可能根本不工作,在Windows平台上也只能使用一个建议分辨率。例如,您想在PC上测试720p 16:9(1024×768)分辨率,您必须要有一台支持这个分辨率的显示器,可以是窗口模式(windowed mode)或者支持测试的全屏模式(fullscreen mode)。在游戏主类(在本章中是PongGame类)的构造器中添加下面两行代码,把分辨率预设为720p。通过检查先前描述的宽度和高度,你能判断。你可以通过中使用先前方式获取的宽度和高度,来检查Initialize方法是否正确工作。
graphics.PreferredBackBufferWidth = 1280;
graphics.PreferredBackBufferHeight = 720;
在XNA中不支持字体——要显示文本,您既可以像本游戏那样建立已经包含文本的纹理,也可以像第五章那样编写自己的字体支持。对于这两种解决方案您都要在屏幕上使用Sprite来渲染文本或者每次渲染一个字母。
在XNA中Sprite并不是唯一显示2D数据的方式;您可以编写自己的Shader,甚至可以实现比Sprite类更多的高级特效。作为一个例子,可以查看第五章,看到如何借助Shaders渲染2D线条。
发布时间:2008/6/24 下午3:31:00 阅读次数:4826