現在のFPSを表示するコンポーネントを作成しました。
その最も重要な部分は次のとおりです。
public override void Update(GameTime gameTime)
{
elapseTime += (float)gameTime.ElapsedRealTime.TotalSeconds;
frameCounter++;
if (elapseTime > 1)
{
FPS = frameCounter;
frameCounter = 0;
elapseTime = 0;
}
base.Update(gameTime);
}
public override void Draw(GameTime gameTime)
{
spriteBatch.Begin();
spriteBatch.DrawString(font, "FPS " + ((int)FPS).ToString(), position, color, 0, origin, scale, SpriteEffects.None, 0);
spriteBatch.End();
base.Draw(gameTime);
}
ほとんどの場合は問題なく動作しますが、最近問題が発生しました。
次のコードをゲームのUpdateメソッドに入れると、奇妙なことが起こり始めます。
if (threadPath == null || threadPath.ThreadState != ThreadState.Running)
{
ThreadStart ts = new ThreadStart(current.PathFinder.FindPaths);
threadPath = new Thread(ts);
threadPath.Priority = ThreadPriority.Highest;
threadPath.Start();
}
このコードの主なアイデアは、常に異なるスレッドでpathFindingアルゴリズムを実行することです。
奇妙なことに、FPSが大幅に低下することがあることは明らかですが、表示されるFPSは1秒に1回よりも頻繁に変化します。このコードを理解していれば、FPSは1秒に1回以上頻繁に変更することはできません。
誰かが私に何が起こっているのか説明できますか?
2010年3月26日編集
Drawメソッドのコードも掲載しました。
2010年3月31日編集Venesectrixの質問への回答
1)固定または可変の時間ステップで実行していますか?
IsFixedTimeStepおよびSynchronizeWithVerticalRetraceがtrueに設定されています。
2)これが発生したときにXNAウィンドウを移動していましたか?
いいえ
3)XNAウィンドウにフォーカスがありましたか?
はい
4)それはどれほど目立ちましたか(つまり、更新が速すぎて読めない、または更新が1秒以上かろうじて)?
私は更新を読むことができました、FPSは1秒間に約3回更新していました。
5)そして、これはすべて、そこにあるスレッドコードでのみ発生しますか?
はい