4

私が開発しているゲームで、最近いくつかのラグスパイクに遭遇しました。それは一貫していて、ほぼ同時に起こります。javaプロファイラーjvisualvmを使用すると、特定のスレッドが再起動するように見えると同時に発生することがわかりました(AWT-EventQueue-0):

スレッド変更チャネルの画像

それ以外に、ヒープの使用、プロセッサの使用、メモリスペース、またはメソッドの使用ではなく、目に見える原因はありません。オブジェクトの配列を描画するときにが発生することがありConcurrentModificationExceptionますが、これはかなりのラグがある場合にのみ発生するはずであり、私のゲームはほとんど集中的ではありません。

プロジェクトに最近変更を加えたことを覚えていませんが、最近次のことを実行しました。

  • Javaを最新バージョンに更新しました
  • JDK7の最新バージョンをダウンロードしました(ただし、このプロジェクトでは使用されていません)
  • JDK7をインストールした結果として発生したEclipseのバグを修正しました(eclipse.iniの256mの制限を削除しました)

32ビットXPでEclipseIndigo-service-1を実行しています。私のプロセッサはほとんど使用されていません。

4

1 に答える 1

5

Event Dispatch Thread (EDT) でやりすぎているようです。AWT-Event-Queue-0 は EDT のようです。さらに、あなたの最後のコメントは言う

...コンポーネントに直接ではなく、最初にゲームボードを画像に描画したときにのみラグスパイクが発生するようです。

計算の一部を他のスレッドにプッシュする必要がありますが、これにはゲーム ボードの描画が適しているようです。また、あなたが持っている可能性のあるAI。

キーボードとマウスのハンドラーは EDT で実行され、グラフィックスの更新も EDT で実行する必要があります。ただし、EDT の外部で (現在行っているように) 画像に事前レンダリングすることはできます。また、BlockingQueue を介して、キーボードとマウスのイベントを別のスレッドに送信できます。

もう 1 つできることは、ゲームの更新レートをフレームの更新レートから切り離すことです。

しかし、詳細がなければ、これ以上のアドバイスはできません。

更新:(について少し読んでくださいConcurrentModificationException

これは、次の 2 つの原因で発生する可能性があります。

  1. 読み取り中のスレッドとは別のスレッドでコレクション (ArrayList など) を更新しています。また
  2. 上記のコレクションを繰り返し処理し、ループで更新しています。

ポイント 2 は簡単に修正できます。しかし、残念ながら、このような短いスペースでスレッド セーフを教えることはできません。

于 2013-03-17T00:26:20.587 に答える