10

わかりました、SSCCE の必要性を理解したので、(私の最初の) SSCCE を作成しました。

200 行未満のコードで問題を再現することができました。私のシステムでは、このデモは完全にコンパイルされ、実行されました (ちらつきだけが残っていました)。関係のないものはすべて剥ぎ取りました。つまり、基本的には、スクリーン マネージャーとゲーム マネージャーの 2 つのソース ファイルがあります。

画面マネージャー: http://pastebin.com/WeKpxEXW

ゲームマネージャー: http://pastebin.com/p3C5m8UN

このコードは、次の make ファイルを使用してコンパイルできます (Linux の Windows 用の移植バージョンの make を使用します): CC = javac BASE = nl/jorikoolstra/jLevel CLASS_FILES = classes/$(BASE)/Game/GameMain.class classes/$ (BASE)/Graphics/ScreenManager.class

jLevel: $(CLASS_FILES)
    @echo Done.

classes/%.class : src/%.java
    @echo Compiling src/$*.java to $@ [command: $(CC) src/$*.java ] ...
    @$(CC) -Xlint:unchecked -d classes -classpath src src/$*.java

ソースファイルがディレクトリに配置され/src、クラスがディレクトリに配置されます/classes

バイトコードにコンパイルした後、次の .bat ファイルを使用してゲームを開始できます。

@set STARUP_CLASS=nl.jorikoolstra.jLevel.Game.GameMain
@set ARGUMENTS=1280 1024 32
@java -cp classes;resources %STARUP_CLASS% %ARGUMENTS%

ARGUMENT変数は自分の画面設定に依存し、ゲームが画面に適切な解像度で表示されるように変更する必要があることに注意してください。

4

6 に答える 6

7

ちらつく理由がわかりました----

BufferStrategypaint()コンポーネントのメソッドとは別のペイント ジョブを実行しており、異なるGraphicsオブジェクトを使用しているように見え、異なるレートで更新されている -

whenpaint()が前に呼び出された場合はshow()問題ありません。しかし

の後にpaint()が呼び出されるshow()と、コンポーネントが最初の空白の外観に再描画されるため、点滅が発生します。


ちらつきをなくすのは非常に簡単です: ( ) のオーバーライドpaint()メソッドは、何もする必要がないためです (ペイントをより正確に制御できます)。JFrameGameMainBufferStrategy

@Override
public void paint (Graphics g) {}

それで全部です。(私はそれをテストしましたが、うまく動作します。これが役立つことを願っています:))


=====更新=====

メソッドをオーバーライドする代わりに、 ( )paint()を呼び出すsetIgnoreRepaint(true)ことをお勧めします。このメソッドは、そのような目的のために設計されています。それを使用してください!JFrameGameMain

private GameMain(String ... args)
{
    setIgnoreRepaint(true);
    .....
}
于 2013-02-03T14:15:06.237 に答える
1

アニメーション付きのクロスプラットフォーム Java AWT ベースのプログラムがあります。JavaBufferStrategyドキュメントのサンプルコードに厳密に従うまで、フラッシュの問題がありました。ただし、私はあなたのようにフルスクリーンではなく、Swing 階層に埋め込まれた AWT Canvas を使用しています。興味があれば、ここでコードを見ることができます。

もう 1 つ注意すべき点は、AWT パイプラインはパフォーマンスを向上させるために OpenGL プリミティブを使用しており、OpenGL のサポートには多くのビデオ ドライバーでバグがあることです。お使いのプラットフォーム用の最新バージョンのドライバーをインストールしてみてください。

于 2013-02-02T19:27:06.060 に答える
1

透明な背景のGIFイメージをレンダリングする Java に問題がありました。それが問題かもしれません。

于 2013-02-03T02:15:45.913 に答える
0

SCCSE なしであなたの質問に答えるのはかなり難しいと思います。RepaintManagerResetter が何をするのかも気になります。

背景色を 0xFF00FF のような派手な色に設定して、描画が行われる前に誰かが背景を「クリア」したかどうかを確認したい場合があります。ちらつき画像が紫色の場合は、ゴミや古い画像が含まれている場合は、おそらくダブル バッファリングです。

いずれにせよ、誰も絵を描く人が自分自身を期待しないようにしようと思います. まず、ネイティブ Windows コードがウィンドウの背景を描画しないようにします。これを一度設定します。

/*
 * Set a Windows specific AWT property that prevents heavyweight components 
 * from erasing their background. 
 */
System.setProperty("sun.awt.noerasebackground", "true");

また、JFrame でこれをオーバーライドしていることを確認してください (Swing コンポーネントを使用している場合)。

@Override
public void paintComponent(Graphics G)
{
  // do not call super.pC() here
  ...
}

それでも問題が解決しない場合は、コードの実際の例を提供してください。そうすれば、人々は問題を再現できます。

于 2013-02-02T19:13:04.187 に答える