5

この問題は非常に奇妙です。この問題は、すべてのプラットフォームで発生するわけではありません。MacOSXを使用しているGoogleChromeで発生しますが、Safariでは発生しません。Windowsを使用している友人の場合、GoogleChromeでは完全に機能します。MacOSXを使用している友人もいますが、彼の場合、Chrome、Safari、Firefoxで点滅します。私たちは両方ともMacOSXLionを持っています。リンクが表示されません。あなたはそれをテストして、それが起こるかどうか、そしてあなたのプラットフォームが何であるかを報告してください(それはせいぜい30秒以内に起こるはずです)?


このスレッドはOracleのフォーラムで見つけました。どうやら、これはMacOSXでよく知られている問題です。これは、Javaが子プロセスを作成し、Safariがこれをセキュリティ機能として許可していないためです。ただし、この問題はMacのChromeとFirefoxでも発生します(私はSafariでは発生しません)。図を見てください…これについて誰かの意見を聞いてうれしいです。


私は現在、小さなJava Tetrisゲームを作成していますが、問題は、アプレットバージョン(JAppletを拡張)で画面がときどき点滅することです。コンピューターのJFrameで実行すると、すべて正常に動作します。

アプレットは、次のサイトで表示および使用できます:http: //mtetris.herokuapp.com/(私は何も宣伝または宣伝しようとはしていません。問題が何であるかを実際に確認できるように配置しています)。

(アプレットが自動的にロードされない場合、つまりブラウザがアプレットをブロックし、ロードを許可するかどうかをユーザーに尋ねる場合、アプレットがマウスフォーカスを適切に取得しないという別の問題もあります。「開始レベル」の数値が適切に強調表示されない、それが理由です。)

これが私が試したもので、まばたきの問題を修正しなかったものです:

  • アプレットの背景、ルートペイン、コンテンツペイン、アプレット内のすべてのコンポーネントを黒に設定します。
  • アプレットのpaint()メソッドをオーバーライドし、その中でダブルバッファリングを実行します(何も改善されていないため、現在のコードでこの部分にコメントしました)
  • アプレットのupdate()メソッドをオーバーライドして直接呼び出す(この問題は、公式ドキュメントのメソッドの説明に従ってpaint()修正されました)

ソースコード全体は、このページのgithubにあります。JAppletを拡張するクラスはTetrisApplicationです。ソースコードはまだきれいではないので、ごめんなさい。


これが私がダブルバッファリングを実装した方法です

public class TetrisApplication extends JApplet {

    //  the dimension of the applet
    private Dimension dimension;
    // image used for double buffering
    Image offscreen;
    // the second buffer
    Graphics bufferGraphics;

    public void init() {
        super.init();
        dimension = getSize();
        offscreen = createImage(dimension.width, dimension.height);
        bufferGraphics = offscreen.getGraphics();
        ...
    }

    public void paint(Graphics g){
        bufferGraphics.clearRect(0, 0, dimension.width, dimension.height);
        super.paint(bufferGraphics);
        g.drawImage(offscreen, 0, 0, this);
    }
    ...
}
4

3 に答える 3

3

よりスムーズに描画するには、デフォルトでダブル バッファリングされるのpaintComponent()メソッドをオーバーライドします。JPanelこの回答では、例について説明します。

于 2012-04-26T02:50:14.543 に答える
0

フリックを停止するには、描画面をダブル バッファリングする必要があります。初めて正しく実装しましたか?

多分これが役立つでしょう: https://gamedev.stackexchange.com/questions/18661/how-do-i-prevent-flickering-when-drawing-to-a-jpanel

于 2012-04-25T22:11:56.367 に答える
0

GameControllerバックグラウンド スレッド ( 内SwingWorker) を使用して状態を更新していることに気付きました。paint()の更新中に同期の問題が発生している可能性がありますGamePanel

java.swing.Timerより良いアプローチは、すべてのフレームを起動し、状態の更新を引き起こす を使用して、すべてを EDT にプッシュすることrepaint()です。その後、同期の問題はありません。

于 2012-04-25T22:22:40.417 に答える