我对XNA和3D没有任何经验,但是我可以给你一些有关2D游戏的建议。我在今年年初花了一些时间在XNA中创建一个tile引擎,并且也思考过同样的问题。我觉得简短的答案是:如果你关注性能,将你的tiles组合成一个更大的sprite是一个好主意。但是,如果你感兴趣的话,还有更长的答案。
通常情况下,当涉及到性能优化时,答案几乎总是“不要这么做”。如果你确定需要优化性能,接下来的答案几乎总是“暂时不要这么做”。最后,如果你尝试优化性能,最重要的事情是使用基准测试来收集更精确的性能度量值以便于在更改之前和之后进行比较。否则,你不知道是否成功了!
现在,与2D游戏相关的另一件事是,我发现我的tile引擎性能越好,切换纹理的次数越少。例如,假设我有一块草地tile和一块碎石tile。如果它们是内存中的两个单独的纹理,如果我先绘制一块草地tile,然后一块碎石tile,再绘制一块草地tile到屏幕上,GPU将会加载草地纹理,然后切换到加载碎石纹理,再切换回草地纹理来绘制另一块草地tile。这会很快降低性能!最简单的方法是使用sprite sheet,将你的草地和碎石tiles放入一个纹理中,并告诉SpriteBatch在同一纹理的不同区域绘制每个tile。
还有一件事要考虑,就是你要在屏幕上绘制多少个tile。我记不太清了,但我曾一次性绘制数千个tile(在缩小的视图中)。我注意到,当我使用更大的tile并且绘制数量较少时,也就是你在问题中提到的建议时,性能也得到了改善。尽管这种改进没有前面那段描述的那么明显,但我仍然建议你测量不同实现的性能变化。此外,如果你只绘制几十个或几百个tile,现在可能没有必要去优化它(参见第二段)。
为了证明我的说法,这里有Shawn Hargreaves关于纹理交换、sprite sheet等的一篇帖子链接。如果你搜索该主题,XNA论坛和Shawn Hargreaves的博客上可能会有更好的帖子。
http://forums.xna.com/forums/p/24254/131437.aspx#131437
更新:
既然你更新了你的问题,那我也来更新一下我的回答。我决定对一些示例进行基准测试,以便让你了解性能差异可能是什么样的。在我的Draw()函数中,我有以下内容:
GraphicsDevice.Clear(Color.CornflowerBlue);
Stopwatch sw = new Stopwatch();
sw.Start();
spriteBatch.Begin();
#if !DEBUG
spriteBatch.Draw(tex, new Rectangle(0, 0,
GraphicsDevice.Viewport.Width,
GraphicsDevice.Viewport.Height),
Color.White);
#else
for (int i = 0; i < 128; i++)
for (int j = 0; j < 72; j++)
{
Rectangle r = new Rectangle(i * 10, j * 10, 10, 10);
spriteBatch.Draw(tex, r, r, Color.White);
}
#endif
spriteBatch.End();
sw.Stop();
if (draws > 60)
{
numTicks += sw.ElapsedTicks;
}
draws++;
if (draws % 100 == 0)
Console.WriteLine("avg ticks: " + numTicks / (draws - 60));
base.Draw(gameTime);
在“#if !DEBUG”语句中删除感叹号,以在两种方法之间切换。我跳过了前60个绘制操作,因为它们包括一些初始设置(不太确定是什么),并且会使平均值产生偏差。我下载了一个1280x720的图像,对于顶部测试用例,我只绘制了一次。对于底部测试用例,我将一个源图像分成了大小为128x72的瓷砖,就像你在问题中提到的那样。以下是结果。
绘制一个图像:
avg ticks: 68566
avg ticks: 73668
avg ticks: 82659
avg ticks: 81654
avg ticks: 81104
avg ticks: 84664
avg ticks: 86626
avg ticks: 88211
avg ticks: 87677
avg ticks: 86694
avg ticks: 86713
avg ticks: 88116
avg ticks: 89380
avg ticks: 92158
绘制 128x72 像素的图块:
avg ticks: 7902592
avg ticks: 8052819
avg ticks: 8012696
avg ticks: 8008819
avg ticks: 7985545
avg ticks: 8028217
avg ticks: 8046837
avg ticks: 8291755
avg ticks: 8309384
avg ticks: 8336120
avg ticks: 8320260
avg ticks: 8322150
avg ticks: 8381845
avg ticks: 8364629
正如您所看到的,它们之间存在几个数量级的差异,因此这非常重要。测试这种类型的内容非常简单,我建议您为您特定的设置运行自己的基准测试,以考虑我可能忽略的一些因素。