Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何防止在屏幕外绘制XNA组件?_C#_Performance_Xna_Drawablegamecomponent - Fatal编程技术网

C# 如何防止在屏幕外绘制XNA组件?

C# 如何防止在屏幕外绘制XNA组件?,c#,performance,xna,drawablegamecomponent,C#,Performance,Xna,Drawablegamecomponent,我正在用XNA做一个2d游戏。 使用可拖动游戏组件时,哪一个性能更好 1.当某个组件不在屏幕上时,将其从组件列表中删除,当其在屏幕上显示时,将其添加 2.当屏幕外不运行绘图功能时(通过使用“唤醒”布尔字段和 关于draw函数中所有内容的if语句) 目前我正在使用方法2,效果很好。这很方便,因为组件的绘图顺序不会改变(如果我删除并重新添加它们,它会改变,我需要更多的代码来管理) 事实上,我刚刚想到,如果它不在组件列表中,它将不会更新,我需要其他东西来跟踪它是否在屏幕上 另外,我没有配备分析器的vi

我正在用XNA做一个2d游戏。 使用可拖动游戏组件时,哪一个性能更好

1.当某个组件不在屏幕上时,将其从组件列表中删除,当其在屏幕上显示时,将其添加

2.当屏幕外不运行绘图功能时(通过使用“唤醒”布尔字段和 关于draw函数中所有内容的if语句)

目前我正在使用方法2,效果很好。这很方便,因为组件的绘图顺序不会改变(如果我删除并重新添加它们,它会改变,我需要更多的代码来管理) 事实上,我刚刚想到,如果它不在组件列表中,它将不会更新,我需要其他东西来跟踪它是否在屏幕上


另外,我没有配备分析器的visual studio的高级版本,所以我只是想问一下,人们从他们的经验中是怎么想的

在使用SpriteBatch时,CPU性能的一个有时被忽略的概念是如何批处理Sprite的。而且使用可绘制的游戏组件并不容易有效地批量处理精灵

基本上,绘制精灵的GPU并不慢&将所有精灵组织成一批的CPU并不慢。缓慢的部分是CPU必须与GPU通信它需要绘制什么(发送批处理信息)。调用spriteBatch.Draw()时,CPU到GPU的通信不会发生。调用spriteBatch.End()时会发生这种情况。因此,效率低下的原因是调用spriteBatch.End()的频率较低。(当然,这意味着调用Begin()的次数要少一些)。另外,尽量少用spriteSortMode.Imediate,因为它会立即导致CPU将每个sprites信息发送到GPU(慢速)

因此,如果您在每个游戏组件类中调用Begin()&End(),并且有许多组件,那么您将花费大量不必要的时间,并且您可能会节省更多的时间来制定更好的批处理方案,而不是担心屏幕外的精灵


旁白:GPU自动忽略其像素着色器中的屏幕外精灵。因此,在CPU上剔除屏幕外精灵不会节省GPU时间…

您不需要昂贵的探查器来确定在测试中哪个更快
秒表
就足够了。探查器将帮助解释为什么一个比另一个快(即,此算法的哪些部分速度慢,哪些部分占用的内存最多,我需要麻烦优化此部分,等等)。我相信选择2会更快。您使用了多少
DrawableGameComponent
s?如果你使用了大量的实例,你可能是误用了它。@Guye这个问题是否让你担心CPU性能或GPU性能?@Seth-是的,我使用了很多可绘制的游戏组件。构成墙壁的每个方块都是一个可绘制的游戏组件。。你能再解释一下吗?非常感谢!信息量很大。。另外,仅供参考,我的游戏已按程序生成房间级别。我对140个房间做了一次压力测试,在我做任何性能编码之前,它非常慢。然后我就这样做了,只画出了您当前所在的房间(我的帖子中的方法2),性能又回到了完美状态,因为您的答案是所有的cpu,这在运行在与visual studio斗争的craptop上是有意义的!)我想我会听从你的建议,重新设计一点,使我的开始和结束语句更有效。我想说的是,仅仅因为你使用的是drawablegamecomponents,并不意味着你不能使用相同的spritebatch.begin()。如果您将base.draw放在spritebatch中,您可以从主游戏文件中调用begin,然后在组件中进行所有绘制,然后再在游戏文件中调用spritebatch.end。@Tophatcher我想提一下,但当我意识到如果有一些3d可绘制组件和一些2d组件,那就不行了。