我正在开发一款 XNA 游戏。现在是我仔细考虑架构的时候了。直到今天,我一直以这种方式实现我自己的绘制方法:
public void Draw(SpriteBatch sb, GameTime gameTime)
{
sb.Begin();
// ... to draw ...
sb.End();
}
我在挖掘 DrawableGameComponent 时发现 Draw 方法是这样的:
public void Draw(GameTime gameTime)
{
// ...
}
首先,我知道SpriteBatch可以在Begin和End之间收集许多Texture2D,因此对它们进行排序或使用相同的Effects进行绘制很有用。
我的问题是关于通过 SpriteBatch 的性能和成本。在 DrawableGameComponent 中,如果游戏对象的 spritebatch 是公共的,则可以调用该游戏对象的 spritebatch。
有什么建议,xna-game 程序员应该做什么?
谢谢指教。
的严重缺点之一DrawableGameComponent
是你被锁定在它提供的方法签名中。虽然本身并没有什么“错误”,但DrawableGameComponent
,不要将其视为“一种真正的建筑“。 你是过得更好 https://gamedev.stackexchange.com/a/9209/288将其视为可能的示例建筑学 https://stackoverflow.com/a/5459955/165500.
如果您发现自己需要通过SpriteBatch
(或其他任何东西)到“游戏组件”的绘制方法 -最好的办法is将其作为参数传递。其他的事情都很复杂。
显然这意味着你不能使用XNA提供的GameComponent
系统,你必须做出自己的选择。但这几乎是微不足道的:在最基本的层面上,它只是一些具有适当虚拟方法的基本类型的列表。
当然,如果你必须使用GameComponent
- 或者你的游戏非常简单(例如:原型),你并不真正关心架构 - 那么你基本上可以使用any你喜欢的方法SpriteBatch
到你的绘制方法。它们都有缺点。
可能下一个架构上最稳健的方法是传递你的SpriteBatch
实例到每个组件的构造函数中。这使您的组件与游戏类分离。
另一方面,如果您将架构抛之脑后,我建议您将MyGame.spriteBatch
field public static
。这是允许在任何地方访问它的最简单的方法。它很容易实现,并且在以后需要时/如果需要的话也很容易清理。
回答你关于表现的问题:与通过考试有关的任何事情SpriteBatch
around 对性能的影响几乎可以忽略不计(提供调用的顺序Draw
/Begin
/End
保持不变)。别担心。
(如果你看到SpriteBatch whatever
在代码中,它代表一个引用。参考是一个 32 位值(在 32 位程序中,所有 XNA 游戏都是如此)。这与一个相同的大小int
or a float
。它非常小,而且传递/访问/等等都很便宜。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)