文艺青年最爱的你正在创建一个新的Texture2D
实例(1x1像素)的每次调用到DrawMiniMap
方法称为dummyTexture
。这是一个坏主意,因为纹理需要每次发送到GPU(然后进行处理和收集)。添加一个名为dummyTexture
的字段,并在LoadContent
内完全初始化它。
但请阅读帖子的其余部分,了解如何识别这些问题。
您的Update
方法正在以60fps调用,但对于Draw
方法也不一定是这样。因为默认情况下Game.IsFixedTimeStep
设置为true
,所以一旦Monogame发现Draw
花费的时间超过预期完成时间,您的Draw
方法将跳过帧。
由于您现在编写游戏逻辑的方式,这是Monogame确保所有更新都在固定时间步骤中完成的唯一方法。
为了更好地了解发生了什么,首先为Draw
方法fps创建一组额外的fps变量,并在屏幕上呈现两个值。你会看到Update
是以60 fps的速度绘制的,但是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; }
...
有了这个地方很容易找准问题的方法内Draw
,并得到你的FPS回到60
此外,通过设置IsFixedTimeStep
到false
,你可以同时获得Update
和Draw
被称为在继承,但是你Update
帧速率会降得很 - 这意味着你应该改变你的所有更新逻辑使用gameTime.ElapsedGameTime
而不是假设固定的步骤:
protected override void Initialize()
{
// use variable time step
this.IsFixedTimeStep = false;
this.TargetElapsedTime = TimeSpan.FromSeconds(1/60.0);
this.graphics.SynchronizeWithVerticalRetrace = true;
...
我更喜欢所有项目中的可变时间步长,特别是当您发现XNA sometimes takes up 100% CPU time on one core when the default value of Game.IsFixedTimeStep
is used,但是准备好进行一些重构时。
至于为什么框架正在跳过,它似乎是DrawMiniMap
方法是有问题的。对此进行评论可以在我的机器上获得60 fps更新+ 60 fps的提取率。
经进一步检查,原来你正在创建一个新的Texture2D
实例(1x1像素)呼吁dummyTexture
每次调用此方法。这是一个坏主意。添加一个名为dummyTexture
的字段,并在LoadContent
内完全初始化它。通过使tileColour
成为Tile
类的成员,以避免在每次迭代中进行大量的if
测试,但也可能会稍微加快此方法的速度,但可能有许多此类优化,可能不需要,除非您要部署到移动设备。
Micky,什么部分将是有用的?昨天晚上我进行了一些测试,当游戏第一次启动时,它似乎变得更糟,并且在滚动一下之后几乎停止,就好像它在第一次加载纹理时看到它们并且在该点之后正常工作。 – user3208483
在.NET游戏中出现口吃可能是由于踢入GC引起的。请查看Shawn Hargreaves和Riemer在其各自的XNA博客中的提示。至于启动滞后,您是否做过任何形式的按需加载资产? – MickyD
谢谢,我会仔细研究一下。没有我输入的按需加载,想知道XNA是否自己做,但我确信事实并非如此? – user3208483