我对XNA和3D没有任何经验,但我会给你一些关于2D游戏的建议。今年年初,我花了一些时间在XNA创建一个tile引擎,并想知道同样的事情。我认为这里的简短答案是肯定的,如果你担心性能问题,将你的图块合并成一个更大的精灵是一个好主意。然而,如果你有兴趣,答案会更长。
一般来说,当谈到性能优化时,答案几乎总是“不要这样做”。如果您确定需要优化性能,下一个答案几乎总是“不要这样做”。最后,如果您尝试优化性能,您可以做的最重要的事情就是使用基准来收集更改前后的性能的精确度量。没有这个,你不知道你是否成功了!
现在,与2D游戏相关的更多,我了解到,我看到了我的瓷砖引擎中更好的性能,更少的开关纹理。例如,假设我有一块草地砖和一块砾石砖。如果这些是内存中的两个独立纹理,并且我绘制草地砖,然后是砾石砖,然后将草地砖绘制到屏幕上,GPU将加载草纹理,然后将其切换为加载砾石纹理,然后切换草纹理回来绘制另一块草坪。这真的很快就会杀死你!解决这个问题的最简单方法是制作一个spritesheet,在这里你可以将你的草地和砾石砖放到一个纹理中,并且每次只告诉SpriteBatch从同一纹理的不同区域绘制。
要考虑的另一件事是你要在屏幕上一次绘制多少瓦片。我不记得具体,但我一次画数千瓦(在缩小视图)。我注意到,当我使用更大的瓷砖并提取更少的瓷砖时,正如您在问题中所暗示的那样,该性能也得到了改善。这并不像我在最后一段所描述的那样有很大的改进,我仍然会鼓励你衡量由不同实现产生的性能变化。另外,如果您只绘制了十几张或几百张图片,则可能不值得尝试优化目前的图片(请参阅第2段)。
就这么你知道我并没有完全做到这一点,这里是一个链接到肖恩哈格里夫斯的纹理交换,spritesheets等职位。有可能更好的帖子在XNA论坛以及肖恩哈格里夫斯的博客如果你搜索的话题。
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
正如你所看到的,有幅度差的一对夫妇为了在那里,所以这是很显著。测试这种事情非常简单,我建议您针对特定设置运行自己的基准测试,以考虑可能错过的内容。
很多很好的信息,但是我可能说我的问题很差。 *更新我的原始问题* – Vectovox 2009-11-03 14:29:53
我添加了一些测试数据,以便您可以了解两种不同方法的性能优势。 – Venesectrix 2009-11-04 06:14:16
非常感谢你。我肯定会自己做一些基准测试,因为你的结果是最有趣的。 (直到现在才完全知道)。 – Vectovox 2009-11-14 13:50:44