平局期间的滚动滞后

时间:2016-03-08 09:15:08

标签: xna 2d monogame

我已经开始使用xna / monogame开发新游戏了。我之前设计了一些2D游戏,但决定制作一个对我来说很新的等距。我一直在使用reimers等距瓷砖引擎教程,大多数最简单的绘图代码都是这个版本的副本。

当在地图上滚动时,屏幕上会出现口吃,我只能将其描述为滞后。我已经安装了一个FPS计数器并保持稳定60,所以我认为这是某种图形问题。

我已经尝试评论绘图代码的各个部分以缩小问题范围,但似乎无法取得任何进展,但是几周前这种情况并没有发生,所以我对自己添加的东西很有信心,也许关于导致它的tilesets的问题?

任何建议都表示赞赏。我没有把任何代码放在这里,因为它变成了一个相当大的项目而且我不知道要关注哪个领域但我已经上传了整个项目here如果有人善于调查

1 个答案:

答案 0 :(得分:3)

Tl; dr您正在{{1>}方法的每次调用上创建一个名为Texture2D的新dummyTexture实例(1x1像素)。这是一个坏主意,因为纹理需要每次都发送到GPU(然后处理和收集)。添加名为DrawMiniMap的字段,并在dummyTexture内完全初始化。

但请阅读帖子的其余部分,了解如何识别这些问题。

您的LoadContent方法是以60fps调用的,但对于Update方法也不一定如此。由于默认情况下Draw设置为Game.IsFixedTimeStep,因此只要Monogame发现true花费的时间比预期更长,您的Draw方法就会跳过帧。

由于您现在正在编写游戏逻辑的方式,这是Monogame确保所有更新都按固定时间步骤完成的唯一方法。

为了更好地了解正在发生的事情,首先为Draw方法fps创建一组额外的fps变量,然后在屏幕上渲染这两个值。您会看到Draw以60 fps绘制,但Update低于该值。

Draw

有了这个,就可以很容易地找出protected override void Draw(GameTime gameTime) { // similar to what you have inside `Update` drawFpsTimer += gameTime.ElapsedGameTime; drawFpsCount++; if (drawFpsTimer >= TimeSpan.FromSeconds(1)) { drawFpsTimer = TimeSpan.FromSeconds(0); drawFps = drawFpsCount; drawFpsCount = 0; } ... 中有问题的方法,并将你的fps恢复到60.

此外,通过将Draw设置为IsFixedTimeStep,您可以连续调用falseUpdate,但您的Draw帧速率会下降也是 - 这意味着您应该更改所有更新逻辑以使用Update而不是假定固定步骤:

gameTime.ElapsedGameTime

我更倾向于在我的所有项目中使用变量时间步,尤其是当您发现XNA sometimes takes up 100% CPU time on one core when the default value of Game.IsFixedTimeStep is used时,但是为那时的某些重构做好准备。

至于为什么正在跳过这些帧,似乎是protected override void Initialize() { // use variable time step this.IsFixedTimeStep = false; this.TargetElapsedTime = TimeSpan.FromSeconds(1 / 60.0); this.graphics.SynchronizeWithVerticalRetrace = true; ... 方法存在问题。评论这个在我的机器上提供60 fps更新+ 60 fps绘制率。

经过进一步检查,结果表明您正在每次调用此方法时创建一个名为DrawMiniMap的新Texture2D实例(1x1像素)。这是一个坏主意。添加名为dummyTexture的字段,并在dummyTexture中对其进行完全初始化。您也可以通过使LoadContent成为tileColour类的成员来稍微加速此方法,以避免在每次迭代时进行一堆Tile测试,但是可能有很多这样的优化,并且除非您要部署到移动设备,否则可能不需要。

相关问题