0

Java Swing を使用してゲームを作成していますが、ゲームを実行してから 10 分ほど経過すると、グラフィックが大幅に遅れることに気付きました。ゲーム ループは、一定の FPS で実行されていると報告しています。

現在、ゲームループが発生すると再描画も呼び出されるようにしています。グラフィックを同期しないと、描画されるさまざまな部分が非常に遅くなり、画面に表示されます。タスク マネージャーは、使用するメモリはほぼ同じであることを示していますが、CPU 使用率は時間の経過とともに徐々に増加します。推測する必要があるとすれば、正しく描画するために Swing を使用していないということです。

私が現在描画に使用しているプロセスは次のようなものです。

  • Graphics2D オブジェクトをキャストする
  • スーパー ペイント グラフィックス オブジェクト
  • すべてのオブジェクトは、そのグラフィック オブジェクトを使用してグラフィックを描画します。
  • ツールキットの同期
  • グラフィックを破棄する

パネルはsetDoubleBuffered(true).

何が間違っているのでしょうか?

編集:

SSCCE を遅延させることができなかったので、戻って各描画関数を再テストしたところ、

    int ilen = drawActorQueue.size();
    for (int i = 0; i < ilen; i++)
    {
        GameActor oo = drawActorQueue.get(i);
        oo.draw(g2d, viewX, viewY);
    }

問題を引き起こしているようです。

drawActorQueue には実際には 2 種類のオブジェクトへのポインターが含まれており、GameActor は単なる基本クラスであるためだと思います。

これは当てはまりますか?インターフェイスを使用するか、リストを代わりに2つの子オブジェクトの特定の配列を指すようにすることで修正できると思います。

編集: !@#$%^ 信じられないほど愚かで、リストをクリアしていないのは私だけでした。再び疲れ果てたときは、コーディングやデバッグを行うことはありません。

4

2 に答える 2

2

アプリでメモリ リークや GC が頻繁に行われていないことを確認してください。詳細な GC ログをオンにしてプログラムを実行し、問題があるかどうかを確認します。

于 2013-02-05T09:05:19.003 に答える
1

プロファイラーをアプリケーションにアタッチします。

たとえば、visualvm. ホットスポットは、「サンプリング」ですぐに現れるはずです。

visualvm の本当に優れている点は、問題が実際に発生しているときに実際にアタッチでき、問題が発生する前にフル スピードで実行できることです。

また、メモリ消費と GC アクティビティのグラフも表示されます。アプリケーションが短時間に大量のメモリを大量に消費する場合は、それを削減できるかどうかを確認する必要があります。

visualvmは非常に強力な Java 用の無料ツールであり、誰もがツールボックスに入れるべきであり、パフォーマンスの問題が発生したときに最初に参照する場所です。

于 2013-02-05T09:07:15.763 に答える