我制作了一个 XNA 图像查看器,但它总是重新绘制场景,即使它没有改变,而且它让我的上网本烧得很厉害,所以我希望它在没有任何变化时暂停绘制。
将帧速率降低到 1 是保持凉爽的一种方法,但会导致输出滞后。
如何在没有输入的情况下防止重绘?
这个问题解决了,但又发现了另一个问题——当窗口聚焦时,游戏会消耗大量CPU,但当窗口聚焦时,只占用1%左右的CPU。有关如何解决其他问题的详细信息,请参阅此问题:
如何在没有任何值得计算的事情发生的情况下减少 XNA 游戏 CPU 使用率? https://stackoverflow.com/q/16704284/1306322
您可以使用游戏.SupressDraw http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.game.suppressdraw.aspx用于此目的的方法。来自链接的评论:
在 Update 期间调用此方法可防止在下次调用 Update 之前调用任何 Draw 方法。如果更新后显示未发生变化,则可以在小型设备上使用此方法以节省电池寿命。例如,如果屏幕是静态的,没有背景动画,则可以在更新期间检查玩家输入以确定玩家是否正在执行任何操作。如果未检测到输入,此方法允许游戏跳过绘制直到下一次更新。
例如,以下代码只会调用Draw
功能一次。当我测试这个时,我注意到 CPU 使用率很高(70%),而不使用SuppressDraw
称呼。使用时SupressDraw
,CPU 使用率急剧下降(降至 15% 以下)。您的数字可能会有所不同。
public class Game1 : Microsoft.Xna.Framework.Game
{
...
private bool _drawn = false;
protected override void Update(GameTime gameTime)
{
if (_drawn)
SuppressDraw();
}
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);
spriteBatch.Begin();
/* draw stuff here */
spriteBatch.End();
_drawn = true;
}
...
}
注意SupressDraw
只压制一个Draw
称呼。为了防止更多的电话Draw
,你必须不断地打电话SupressDraw
in Update
。希望这是有道理的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)