Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 手动控制何时重新绘制屏幕_C#_Xna_Xbox360_Xna 4.0 - Fatal编程技术网

C# 手动控制何时重新绘制屏幕

C# 手动控制何时重新绘制屏幕,c#,xna,xbox360,xna-4.0,C#,Xna,Xbox360,Xna 4.0,我想为XNA做一个基于旋转的类似roguelike的引擎。我基本上是将游戏移植到以前使用基于SDL的类似roguelike的库libtcod的工作中。如何修改基本XNA模板,使游戏不必在每一帧重新绘制屏幕,而是在我需要的时候重新绘制屏幕?正确的方法是在需要将后缓冲区绘制到屏幕上时调用GraphicsDevice.Present() 现在这里的困难在于Game类自动为您调用Present(特别是在Game.EndDraw中),这是您不希望它做的事情。幸运的是,Game提供了许多防止调用Presen

我想为XNA做一个基于旋转的类似roguelike的引擎。我基本上是将游戏移植到以前使用基于SDL的类似roguelike的库libtcod的工作中。如何修改基本XNA模板,使游戏不必在每一帧重新绘制屏幕,而是在我需要的时候重新绘制屏幕?

正确的方法是在需要将后缓冲区绘制到屏幕上时调用
GraphicsDevice.Present()

现在这里的困难在于
Game
类自动为您调用Present(特别是在
Game.EndDraw
中),这是您不希望它做的事情。幸运的是,
Game
提供了许多防止调用Present的方法:

最好的方法是重写
BeginDraw
并使其返回false,以防止绘制帧(包括防止调用
Draw
EndDraw
),如下所示:

protected override bool BeginDraw()
{
    if(readyToDraw)
        return base.BeginDraw();
    else
        return false;
}
其他替代方法是调用或覆盖
EndDraw
,这样它在准备在屏幕上显示帧之前不会调用
base.EndDraw()


就我个人而言,我只需绘制每一帧。

您不需要从Game类继承,它是完全可选的。您可以编写自己的类,该类仅在需要时重新绘制屏幕。不过,类中有一些有用的代码,因此您可以使用Reflector从中复制代码,然后更改其逻辑。

为什么要这样做?真的,我很好奇。嗯,当你有一个游戏,它的图形直到用户按下一个键才改变时,一遍又一遍地重新计算和重新绘制似乎有点傻。