2016-04-01 11 views
0

私はキャンバスのGrapicConte2Dにピクセルを書き込む簡単な方法を持っています。 int [] - pixelarrayはフレームごとにランダム化され、PixelWriters setPixels() - メソッドで更新されています。網膜ディスプレイで遅い遅いJavafx-パフォーマンス

私は、デュアルモニターセットアップ、「通常の」スクリーンとmacbook pro網膜を持っています。アプリケーションフレームを私の「通常の」画面にドラッグすると、すべてがうまく動作します。しかし、それを私のMacBook Retina Displayに置くと、実際には遅くなる。

何が間違っているのか分かりません。私はコードを数回チェックしていましたが、私は自分自身を助けることはできないようです。

私は助けになる助言があれば非常に感謝しています。

おかげ

コード:

public class CanvasTest extends Application { 
    @Override 
    public void start(Stage primaryStage) throws Exception { 
     Random random = new Random(); 
     BorderPane root = new BorderPane(); 

     ScrollPane scrollPane = new ScrollPane(); 

     Canvas canvas = new Canvas(1280, 800); 
     GraphicsContext gc = canvas.getGraphicsContext2D(); 
     PixelWriter writer = gc.getPixelWriter(); 
     PixelFormat format = PixelFormat.getIntArgbInstance(); 

     int[] pixels = new int[(int) (canvas.getWidth() * canvas.getHeight())]; 



     scrollPane.setContent(canvas); 

     AnimationTimer timer = new AnimationTimer() { 
      @Override 
      public void handle(long now) { 
       for (int i = 0; i < pixels.length; i++) { 
        pixels[i] = (255 << 24) | random.nextInt(0xffffff); 
       } 


       writer.setPixels(0, 0, (int) canvas.getWidth(), (int) canvas.getHeight(), 
         format, pixels, 0, (int) canvas.getWidth()); 
      } 
     }; 

     root.setCenter(scrollPane); 
     primaryStage.setScene(new Scene(root,1280,800)); 
     primaryStage.show(); 

     timer.start(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 
+1

コードを投稿することはできますか?それは私たちがあなたを助けるのに役立ちます。 –

+0

ありがとうございます。コードの抜粋を掲載しましたが、役立つかどうかはわかりませんが、非常に簡単です。それは私のCanvasのコンストラクタで行われます。そして、私のキャンバスはBorderPaneにレイアウトされています。 – Adam

+0

あなたの網膜ディスプレイは非常に高い解像度であると推測していますので、このコードは通常のディスプレイよりも遅く動作します。そして、あなたのhandle()メソッドがAnimationTimerによって呼び出される頻度によっては、実際には非常に遅くなることがあります。特に、Random.nextInt()への3回の呼び出しで、すべてのピクセル、すべてのフレームで発生します。それはそこで進行している処理のヒープです。 – ManoDestra

答えて

1

私の最高の推測では、あなたのRetinaディスプレイは、より多くのピクセルの合計と高画素密度を有しているので、より多くの計算がフレームごとに行わなければならないことです。 GraphicsContext2Dを使用するように設定されていない場合は、OpenGLを調べます。

まだGraphicsContext2Dを使用したい場合は、乱雑さのサンプルを少なくして、あまり遅くならないようにします。すべてのピクセルにランダムな値を見つけるのではなく、他のピクセルごとにランダムな値を見つけて、近くのピクセルをその色に設定するだけです。それは少し悪く見えますが、それは遅れを減らすでしょう。ここでも、OpenGLはGPUレンダリングを使用しており、はるかに高速です。

代わりにこれを試してみてください:

for (int y = 0; y < height; y+=2) { 
    for (int x = 0; x < width; x+=2) { 
     int i = x + y * width; 
     screen[i] = (255 << 24) | (random.nextInt(256) << 16) | (random.nextInt(256) << 8) | random.nextInt(256); 
     screen[i+1] = screen[i]; // The pixel just to the right of the current one 
     screen[i+width] = screen[i]; // The pixel just below the current one 
     screen[i+width+1] = screen[i]; // The pixel one to the right and one below this one 
    } 
} 

注:幅と高さが、なぜこのような場合には、多くのピクセルと、それを使用する方がはるかに簡単であることが2で割り切れる場合にのみ動作しますが代わりにGPU。

+0

ご回答いただきありがとうございます。いいアイデアですが、私の問題はピクセルのレンダリングという事実ではないと私は思っていますが、これはコンポーネントの使用が不十分であることです。私の更新されたコードを見てください。私はそれがscrollPaneのためだと思う。それは私がそれにキャンバスを読み込むとき、私のアプリケーションを遅くする。 – Adam

関連する問題