1.6 自定义游戏循环时间
问题
你想改变调用Update和Draw方法的默认时间间隔。
解决方案
Update 方法默认是每秒钟更新60次,而Draw方法则没有限制,但最大为屏幕刷新率。通过改变Game类的TargetElapsedTime和IsFixedTimeStep静态属性和GraphicsDevice类的SynchronizeWithVerticalRetrace的属性,你就可以改变默认的行为。
工作原理
改变Update频率
默认情况下Update每秒更新60次,或者说每隔16.667毫秒更新一次。你可以通过改变TargetElapsedTime变量改变更新频率: this.TargetElapsedTime = TimeSpan.FromSeconds(1.0f / 100.0f); 当调用到这行代码时,XNA会以每秒100次的频率调用Update方法。你也可以让XNA不按固定时间间隔调用Update方法,要做到这点,需要将Is FixedTimeStep变量设置为false:
this.IsFixedTimeStep = false;
使用IsRunningSlowly
你可以指定Update的更新频率,但如果频率太高,XNA将无法达到,在这种情况下,gameTime. IsRunningSlowly 变量会被设置为true:
Window.Title = gameTime.IsRunningSlowly.ToString();
注意:你应该将gameTime参数传递到Update方法而不是Draw方法去判断gameTime. IsRunningSlowly。
改变Draw频率
当运行程序时,XNA会以尽可能大的频率调用Draw方法,只由下面两个规则限制:
- 没有必要将调用Draw的频率大于屏幕刷新频率。如果屏幕刷新频率只有每秒100次,每秒绘制110次是无用的。在PC和Xbox360平台上,,屏幕刷新率是由PC屏幕和它的设置决定的,Zune 30每秒刷新60次,其他Zune设备每秒刷新30次。
- Update方法每秒调用60次。如果游戏计算量太大,Draw方法调用次数会变少以保证Update方法可以每秒调用60次。
在某些情况中,以最大频率调用Draw方法是有用的,例如当决定你的游戏的最大帧频率时,你可以将graphics.SynchronizeWithVerticalRetrace变量设置为true:
graphics.SynchronizeWithVerticalRetrace = false;
注意:你必须在Game1的构造函数顶部加入这行代码,因为XNA需要在创建GraphicsDevice 之前知道这个设置。
理解Update和Draw方法调用频率的重要性
因为你将更新逻辑放置在Update方法中,Update频率的减少会导致游戏中的所有物体变慢,这非常令人讨厌。
当Draw调用频率小于屏幕刷新频率时,只有游戏的视觉表现会暂时受影响,游戏帧频率暂时由每秒100帧降到80帧不容易察觉。
因此,如前所述,如果必要,XNA会降低Draw的频率以保证Update能以每秒60帧的频率调用。