2013-01-23 53 views
5

我在XNA制作2D游戏。 当使用可绘制的游戏组件时哪一个性能更好?如何防止XNA组件在屏幕外时画图?

1.当组件不在屏幕上时,将它从组件列表中删除,并在屏幕上将其添加。

2,当其离屏幕不要运行它的绘制函数(通过使用“苏醒”布尔字段和 如果周围绘制函数声明的一切)

我使用的那一刻方法2,它工作正常。其方便的组件的抽屉不会改变(如果我删除并重新添加它们,我将需要更多代码来管理它) 事实上,它只是发生在我身上,如果它不在组件列表中更新和我需要别的东西来跟踪它是否在屏幕上或不是..

另外我没有与探查器的视觉工作室的花哨版本,所以我只是问在这里,人们认为他们的经验是什么

+1

您不需要昂贵的分析器来确定哪个测试速度更快'Stopwatch'足够好。分析器将帮助解释为什么*一个比另一个更快(即,该算法的哪些部分很慢,什么消耗最多的内存,是否需要优化此部分等等)。 – Servy

+2

我会相信选择2会更快。 – Cyral

+2

您使用多少个'DrawableGameComponent'?如果你正在使用它的很多实例,你可能会误用它。 –

回答

5

在使用SpriteBatch时,CPU性能有时会被忽略,这是你如何去配合你的精灵。而使用可绘制的游戏组件并不能轻松地有效地分批精灵。

基本上,绘制精灵的GPU并不慢&将所有精灵组织成批次的CPU并不慢。缓慢的部分是当CPU必须向GPU传达需要绘制的内容时(向其发送批处理信息)。当您调用spriteBatch.Draw()时,此CPU与GPU通信不会发生。它发生在你调用spriteBatch.End()时。因此,低效率的结果是不经常调用spriteBatch.End()。 (当然这也意味着不太经常调用Begin())。此外,使用spriteSortMode.Imediate非常谨慎,因为它立即导致CPU发送每个精灵信息到GPU(慢))。

所以,如果你在每场比赛的组件类()开始&()结束,并有许多组件,你是不必要的花费自己很多的时间,你可能会节省更多的时间想出一个更好的配料方案比担心屏幕外的精灵。

另外:无论如何,GPU自动忽略来自其像素着色器的离屏精灵。所以剔除CPU上的屏幕外精灵不会节省GPU时间...

+0

非常感谢!非常翔实..此外,就我而言,我的游戏程序化地生成了由房间组成的关卡。我在140个房间进行了压力测试,之后我进行了一些表演编码,结果很慢。然后我做了它,所以只有你现在的房间被绘制(方法2在我的文章中)而性能又回到了完美,根据你的答案,这是所有的CPU,这是有道理的,因为这是在一个craptop运行与视觉工作室斗争! :)我想我会遵循你的建议,并重新设计一点,使我的开始和结束语句保持更多 –

+0

我想说,仅仅因为你使用drawablegamecomponents,并不意味着你不能使用相同的spritebatch.begin()。如果你将你的base.draw放置在spritebatch中,你可以从你的主游戏文件开始调用,然后在你的组件中完成所有的绘图,然后再次在Game文件中创建spritebatch.end。 – TopHatHacker

+0

@TopHatHacker我想提到,但没有意识到如果有一些3D可绘制组件和一些2D组件,那么这是行不通的。 –