2

我正在为 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

4

1 回答 1

0

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

我有所有从 GameComponent 派生的自定义组件,它们被添加到主 Game 类的组件列表中。

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

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

第二个大问题,如下;我做了一门课,帮助我在屏幕上定位东西,相对的,百分比和类似的东西。父容器,对齐和 v-aligns 等。该类具有大小和向量的属性,但不是将计算值保存在支持字段中,而是在每次访问属性时重新计算它们。但是计算这样复杂的东西会使用引用(例如对父容器和子容器),这使得 CLR 非常困难,因为它有很多工作要做。

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

于 2012-02-23T17:29:51.513 回答