更新:ここにスタッターを示すビデオをアップロードしました:http://intninety.co.uk/xnastutter.mp4 1920x1080で表示していない場合は、ビデオをよく見る必要があるかもしれませんが、そこに表示されます2秒ごとに移動する場合はかなりはっきりとしたスタッターです。ビデオ自体が途切れないように、Webブラウザーではなく、Windows Media Playerで表示して、実際のスタッターが表示されないようにすることをお勧めします。
少し前に始めたプロジェクトを最近手に入れましたが、それでも問題を解決するのに苦労しています!
現在、画面上に1つのスプライトがあり、方向キーを使用して移動する非常に単純なアプリケーションがあります。問題は約2秒ごとで、ゲームが途切れ、スプライトが後方にジャンプしてから非常に速く前方に戻るように見えます。
スプライト自体は55x33のビットマップであるため、大きなものではなく、使用されているコードは次のとおりです。うまくいけば、これで問題の可能性についていくつかのアイデアを思いつくことができます。吃音がどのように見えるかを正確に確認するためにビデオが必要な場合は、1つをまとめて、必要に応じてどこかにアップロードできます。
コードでわかるように、フレーム間で失われた時間は、発生した場合に移動を大きくすることで補いますが、そのドロップは時間的に非常に一貫して発生しているため、どこかで何か間違ったことをしていると思います。
私はいくつかの異なるマシンで試しましたが、問題はそれらすべてで解決しません。誰かが何かアイデアを持っているか、それがどこにあるのかを知ることができれば、それを指摘していただければ幸いです。
ありがとう :)
ゲームのコンストラクターグラフィックスデバイスマネージャーのセットアップ
graphics = new GraphicsDeviceManager(this);
graphics.IsFullScreen = true;
graphics.SynchronizeWithVerticalRetrace = false;
graphics.PreferredBackBufferWidth = 1920;
graphics.PreferredBackBufferHeight = 1080;
Content.RootDirectory = "Content";
this.IsFixedTimeStep = false;
ゲームの更新メソッドからのコード
KeyboardState keyboard = Keyboard.GetState();
GamePadState gamePad = GamePad.GetState(PlayerIndex.One);
if (keyboard.IsKeyDown(Keys.Escape)) {
this.Exit();
}
if ((keyboard.IsKeyDown(Keys.Left)) || (gamePad.DPad.Left == ButtonState.Pressed))
{
this.player.MoveLeft((float)gameTime.ElapsedGameTime.TotalMilliseconds);
} else if ((keyboard.IsKeyDown(Keys.Right)) || (gamePad.DPad.Right == ButtonState.Pressed))
{
this.player.MoveRight((float)gameTime.ElapsedGameTime.TotalMilliseconds);
}
if ((keyboard.IsKeyDown(Keys.Up)) || (gamePad.DPad.Up == ButtonState.Pressed))
{
this.player.MoveUp((float)gameTime.ElapsedGameTime.TotalMilliseconds);
} else if ((keyboard.IsKeyDown(Keys.Down)) || (gamePad.DPad.Down == ButtonState.Pressed))
{
this.player.MoveDown((float)gameTime.ElapsedGameTime.TotalMilliseconds);
}
base.Update(gameTime);
上記の更新メソッドに見られる「移動」メソッド
public void MoveLeft(float moveBy)
{
this.position.X -= (moveBy * this.velocity.X);
}
public void MoveRight(float moveBy)
{
this.position.X += (moveBy * this.velocity.X);
}
public void MoveUp(float moveBy)
{
this.position.Y -= (moveBy * this.velocity.Y);
}
public void MoveDown(float moveBy)
{
this.position.Y += (moveBy * this.velocity.Y);
}
ゲームの描画方法
GraphicsDevice.Clear(Color.CornflowerBlue);
spriteBatch.Begin();
spriteBatch.Draw(this.player.Texture, this.player.Position, null, Color.White, this.player.Rotation, this.player.Origin, 1.0f, SpriteEffects.None, 0.0f);
spriteBatch.End();
base.Draw(gameTime);
編集:言及するのを忘れました、Moveメソッドで使用される速度オブジェクトはVector2です