Xna:模拟Texture2D

2024-03-16

我正在编写 WinForms / Xna 应用程序,我需要某种方法来抽象出与我的控制器/模型代码中的 GraphicsDevice 的交互。

我创建了一个接口 IGraphicsService。我将用它来抽象诸如加载纹理之类的东西。但我不知道当我需要返回某种纹理信息时该怎么办。我应该创建一个包装Texture2D 的类吗?我担心这会带来不必要的开销。从长远来看,我希望能够创建某种 MockTexture2D。

这一切都是为了让我的应用程序更易于测试。我不太担心速度,但如果有一些解决方案不会产生太多开销,那就太好了,因为最终我想用它来使我的游戏更易于测试。有什么建议么?


我个人的观点是 GraphicsDevice 类太复杂而无法被模拟,尽管如此,无论谁做到了,都需要做更多的工作来实际指导模拟在他的测试中做正确的事情(尽管他肯定应该因为这一努力而获得奖牌: D)。

Visual Studio 的“提取接口”重构只能让您成功一半。也许代码生成器可以创建一个完全转发的模拟。如果您担心性能,只要您的模拟界面镜像真实的图形设备,您就可以做一些神奇的 #if..#endif 在发布版本中使用真实的 GraphicsDevice 并在调试版本中遍历该界面?

-

无论如何,对于我自己的单元测试,我实际上是在不可见的形式上为我的单元测试创​​建一个真实的图形设备。这工作得非常好,运行我的单元测试的构建代理在 VMware 虚拟机中的 Windows XP 上运行,并以 Gentoo Linux x64 作为主机操作系统。我正在使用着色器和渲染目标等测试实际渲染代码。就性能而言,我也无可抱怨 - 1300 个测试在 10 秒内执行。

这是我用来创建伪模拟图形设备服务的代码:MockedGraphicsDeviceService.cs https://devel.nuclex.org/framework/browser/testing/Nuclex.Testing.Xna/trunk/Source/MockedGraphicsDeviceService.cs?rev=1785及其单元测试:MockedGraphicsDeviceService.Test.cs https://devel.nuclex.org/framework/browser/testing/Nuclex.Testing.Xna/trunk/Source/MockedGraphicsDeviceService.Test.cs?rev=1785

当然,缺点是您无法检查此类伪模拟图形设备中的任何期望(例如,是否以宽度 234 和高度 456 调用 CreateTexture()?)。采用一些巧妙的类设计来充分隔离逻辑,以便我可以在不破坏其抽象的情况下测试我的图形类。至少我可以通过这种方式获得图形代码的测试覆盖率:)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Xna:模拟Texture2D 的相关文章

随机推荐