2010-12-11 67 views
1

我想知道是否有办法降低运行速度(通话之间的更新和绘图时间)。在XNA中降低运行速度

我需要,因为它们出现过快调用的频率减慢,并有显示的结果是什么,我需要表现出很短的时间,这么短的实际用户看不到任何东西。

的目标是呈现什么代表我的应用程序的逻辑更慢的进度。

如果标题不明确,我参考XNA游戏框架。

+0

你想慢下来的游戏吗? – 2010-12-11 20:18:56

+1

您能否解释一下这意味着什么:*喜欢更慢地展示代表我的应用程序的逻辑的进度* – 2010-12-11 21:01:16

+1

您不应该依赖于更新/绘制被首先调用的速度,也不能保证它们'以恒定的速度呼叫。 – Doggett 2010-12-12 08:45:31

回答

4

我会建议你有你的更新方法里面的一些代码,更新你的游戏逻辑每x秒。

定义:现在

int millisecondsPerFrame = 1000 //Update every 1 second 
int timeSinceLastUpdate = 0 //Accumulate the elapsed time 

,您的更新,你可以有这样的:

timeSinceLastUpdate += gameTime.ElapsedGameTime.TotalMilliseconds; 
if(timeSinceLastUpdate >= millisecondsPerFrame) 
{ 
    timeSinceLastUpdate = 0; 

    //YOUR GAMES LOGIC GOES HERE 
} 

有了这个方法,你不要有整个程序慢下来。

+0

:)我喜欢你的解决方案,比我更自然。 – mjsr 2010-12-12 21:18:08

1

我在MSDN中找到了答案。首先,我需要将属性IsFixedTimeStep设置为true,然后我可以使用变量TargetElapsedTime(在更新调用时的比率)来播放默认值为1的变量TargetElapsedTime。/60秒,对于我需要显示的速度太快,所以我将它设置在1/2秒内,并添加两个键以在运行时修改此值。

IsFixedTimeStep = true; 
TargetElapsedTime = TimeSpan.FromSeconds(0.5); 

然后在更新方法,我可以用TargetElapsedTime起到加速和减速的更新要求:

if ((Keyboard.GetState().IsKeyDown(Keys.W))) 
{ 
    TargetElapsedTime += TimeSpan.FromSeconds(0.1f); 
} 
if ((Keyboard.GetState().IsKeyDown(Keys.S))) 
{ 
    if ((TargetElapsedTime - TimeSpan.FromSeconds(0.1f))>TimeSpan.Zero) 
    { 
     TargetElapsedTime -= TimeSpan.FromSeconds(0.1f);  
    } 

} 
0

我同意这里的其他答案。你并不是真的想减慢游戏的执行速度。这样做没有意义。再加上随着时间的推移,随着时间的推移,追踪设计变得越来越困难。

利用时间差的问题是,你永远不能确定多久你的更新方法将被调用。有许多因素可能会导致它运行得太快或太慢。如果您的游戏循环运行缓慢,即使只有一小部分,您可能会错过游戏中的整个记号。对于像体育比赛这样的事情来说,这会很糟糕。

而是使用计时器。 .NET有一个惊人的事件模型和一个预先构建的计时器类。它被初始化,并告诉它你想要循环的频率。每个循环都会触发您可以收听的事件。这有两个好处。首先,你可以放心,你的蜱会在接近或者当你提出要求时发射。其次,它不会在主游戏逻辑中运行,从而使您的程序能够以更好的方式进行组织。您甚至可以将多个事件绑定到定时器,这样您可以使用代码更加模块化。

尝试......

//create a new instance of a timer 
//and set it to 1000 millisecond interval(1 second) 
Timer t = new Timer(1000); 

//Add a listener to the elapsed event 
t.Elapsed += new ElapsedEventHandler(t_Elapsed); 

//start the timer 
t.Start(); 

void t_Elapsed(object sender, ElapsedEventArgs e) 
{ 
    // I am called each second 
}