当GC开始时,Xna Xbox框架

时间:2012-02-21 09:40:17

标签: garbage-collection xna frame-rate xbox

我正在为XBOX开发一个应用程序(XNA游戏),这是一个非常简单的应用程序。起始页包含具有移动gif图像的图块。那些gif图像实际上都是png图像,每个图块都会加载一次,并放入一个数组中。然后,使用定义的延迟,播放这些图像(使用每次延迟通过时增加的计数器)。

这一切都很好,但是,我注意到GIF图像移动中每x秒有一些小的延迟。然后我开始添加一些基准测试内容:

http://gyazo.com/f5fe0da3ff81bd45c0c52d963feb91d8

正如你所看到的,对于这样一个简单的程序,FPS非常低(这是在调试中,当从Xbox自己运行应用程序时,我获得了平均62fps)。 2个重要设置:     Graphics.SynchronizeWithVerticalRetrace = false;     IsFixedTimeStep = false;

将isFixedTimeStep更改为true会增加延迟。设置磁贴有旋转的轮子,你可以看到轮子每x秒返回一点。 SynchronizeWVR的计数相同,也会增加延迟。

我注意到滞后和垃圾收集器开始之间的联系,每次启动时都会出现延迟......

不要介意MAX HMU(堆内存使用情况),因为这需要启动量,平均值更加真实。

这是性能监视器的另一个屏幕,但是我不太了解这个工具,第一次使用它...希望它有所帮助:

http://gyazo.com/f70a3d400657ac61e6e9f2caaaf17587

1 个答案:

答案 0 :(得分:0)

经过一番研究后,我找到了罪魁祸首。

我有自定义组件,这些组件都来自GameComponent,并且被添加到主Game类的Component列表中。

这是一个(总共2个)主要问题,导致更新不需要更新的所有内容。 (绘制方法是唯一一个记住页面状态的人,只有在需要时才绘制)。 我通过使用不同的“屏幕”(或我称之为的页面)来修复此问题,这是从GameComponent派生的唯一组件。

然后我只更新活动的页面,并且该页面上的自定义组件也会更新。问题已解决。

第二个大问题是: 我做了一个课程,帮助我在屏幕上定位东西,相对来说,百分比和类似的东西。父容器,对齐和v对齐等 对于尺寸和尺寸,该类具有属性。向量,但我没有在计数值中保存计算值,而是在每次访问属性时重新计算它们。但计算像这样的复杂东西使用引用(例如父和子容器),这使得CLR很难,因为它有很多工作要做。

我现在将整个定位类重建为一个功能齐全的优化类,在必要时使用不同的标志重新计算,而不是20fps的下降,我现在平均得到170 + fps!