我正在快速绘制一个tileset来可视化算法,所以我转向XNA为我做绘图。问题是它总是尽可能快地绘制,我想减慢速度,而不是每X毫秒绘制一次,其中X根据局部变量是任意的。例如,每100毫秒绘制一次。我尝试使用IsFixedTimeStep和TargetElapsedTime,但所有这些都是触发了正确数量的更新,但每隔X毫秒绘制一次,导致缺少所有中间步骤。
有谁知道怎么解决这个问题?这是我的绘图和更新方法:
protected override void Update(GameTime gameTime)
{
// Allows the game to exit
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
this.Exit();
// TODO: Add your update logic here
if (Mouse.GetState().LeftButton == ButtonState.Pressed)
{
_engine.SpreadFire();
}
if (Keyboard.GetState().IsKeyDown(Keys.Escape))
{
_engine.InitializeBoardStates(5);
SuppressDraw();
}
base.Update(gameTime);
}
/// <summary>
/// This is called when the game should draw itself.
/// </summary>
/// <param name="gameTime">Provides a snapshot of timing values.</param>
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);
spriteBatch.Begin();
for (var i = 0; i < _engine.BoardStates.Count; i++)
{
for (var j = 0; j < _engine.BoardStates[i].Count; j++)
{
var isOnFire = _engine.BoardStates[i][j];
this.spriteBatch.Draw(isOnFire ? LitTile : NormalTile, new Rectangle(j * 10, i * 10, 10, 10), Color.White);
}
}
spriteBatch.End();
base.Draw(gameTime);
}
(我也对我做错了和/或效率低下的小事采取任何建议。我今天下午才开始关注XNA。)
答案 0 :(得分:1)
如果您还没有画出(如X变量所示),是否有任何理由可以退出Draw例程?不过,只需在绘制时跟踪最后的drawTime即可。
答案 1 :(得分:0)
如果你在Update方法中尝试以下(或类似),我相信它会达到预期的效果,尽管我还没有测试过。
// This should restrict your code to running once per 100 ticks
if (gameTime.ElapsedGameTime.Ticks % 100 == 0)
{
if (Mouse.GetState().LeftButton == ButtonState.Pressed)
{
_engine.SpreadFire();
}
if (Keyboard.GetState().IsKeyDown(Keys.Escape))
{
_engine.InitializeBoardStates(5);
SuppressDraw();
}
}
然后您可以使用gameTime.ElapsedGameTime.TotalSeconds
或类似内容,这里是TimeSpan结构的MSDN documentation。同时将值更改为mod会影响更新的速度。