2017-03-24 11 views
0

私はSwingとJavaFXを使ってイメージをスクリーンにレンダリングしますが、予期せぬタイミングを得ています。コンポーネントのランダムな位置に1,000,000イメージをレンダリングするだけです。なぜJavaFXは長時間かかるのですか?JavaFXとスイングのレンダリング

結果:スイング:2.5秒。 JavaFX 8.5秒。以下のコード。

JavaFXでは、

public class JFXTest extends Application 
{ 
public static void main(String[] args) 
{ 
    launch(args); 
} 

@Override 
public void start(Stage theStage) 
{ 
    Group root = new Group(); 
    Scene theScene = new Scene(root); 
    theStage.setScene(theScene); 

    Canvas canvas = new Canvas(1000, 1000); 
    root.getChildren().add(canvas); 

    GraphicsContext gc = canvas.getGraphicsContext2D(); 

    new ResourceLoaderJFX(); 
    System.out.println("Running test"); 

    Random ran = new Random(); 

    ClassLoader classLoader = getClass().getClassLoader(); 
    URL url = classLoader.getResource("sky.png"); 
    Image image = new Image(url.toString()); 
    long t1 = System.nanoTime(); 
    for (int j=0; j<1000000; j++) { 
     int x = ran.nextInt(1000); 
     int y = ran.nextInt(1000); 
     gc.drawImage(image, x, y); 
    } 
    System.out.println("\n"); 
    long t2 = System.nanoTime()-t1; 
    System.out.println("Took " + (t2/1000000000.0) + " secs"); 
    System.out.println("Done"); 

    theStage.show(); 
} 
} 

Prism pipeline init order: d3d sw 
Using native-based Pisces rasterizer 
Using dirty region optimizations 
Not using texture mask for primitives 
Not forcing power of 2 sizes for textures 
Using hardware CLAMP_TO_ZERO mode 
Opting in for HiDPI pixel scaling 
Prism pipeline name = com.sun.prism.d3d.D3DPipeline 
Loading D3D native library ... 
D3DPipelineManager: Created D3D9Ex device 
    succeeded. 
Direct3D initialization succeeded 
(X) Got class = class com.sun.prism.d3d.D3DPipeline 
Initialized prism pipeline: com.sun.prism.d3d.D3DPipeline 
OS Information: 
Maximum supported texture size: 8192 
    Windows version 10.0 build 14393 
Maximum texture size clamped to 4096 
D3D Driver Information: 
    Intel(R) Iris(TM) Graphics 540 
    \\.\DISPLAY2 
    Driver igdumdim64.dll, version 20.19.15.4463 
    Pixel Shader version 3.0 
    Device : ven_8086, dev_1926, subsys_00151414 
    Max Multisamples supported: 4 
vsync: true vpipe: true 
Running test 

はSwingで8.230974466秒

を取った

public class SwingTest extends JPanel { 

public void init() { 
    setVisible(true); 
} 

public void runTest() { 
    System.out.println("Running test"); 
    BufferedImage bufferedImage=null; 
    try { 
     bufferedImage = ImageIO.read(new File("C:\\Users\\resources\\png\\sky.png")); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    long t1 = System.nanoTime(); 
    Random ran = new Random(); 
    for (int j=0; j<(1000000); j++) { 
     int x = ran.nextInt(1000); 
     int y = ran.nextInt(1000); 
     this.getGraphics().drawImage(bufferedImage, x, y, null); 
    } 
    long t2 = System.nanoTime()-t1; 
    System.out.println("Took " + (t2/1000000000.0) + " secs"); 
} 

public static void main(String[] args) { 
    SwingUtilities.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      JFrame f = new JFrame(); 
      SwingTest view= new SwingTest(); 
      view.init(); 
      f.add(worldViewPanel); 
      f.pack(); 
      f.setSize(new Dimension(1000,1000)); 
      f.setVisible(true); 
      f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      view.runTest(); 
     } 
    }); 
} 
} 

Connected to the target VM, address: '127.0.0.1:53764', transport: 'socket' 

は低い数字

ため、興味深いことに2.586923483秒

を取りました10

JavaFXの は、万枚の画像@ 0.02173174秒を取ったセカンドランは0.018200605秒

SWING 万枚の画像@ 0.138639497秒を取ったを取った、セカンドランは、あなたがここにbeensとリンゴを比較している0.13744251秒

+0

あなたのコードでは、JavaFXは1000Kイメージをレンダリングしますが、Swingは10Kイメージだけをレンダリングします。 –

+1

両方の例で[SSCCE](http://sscce.org)を入力してください。テストが正しいかどうかわかります。 –

+0

誤字を指摘してくれてありがとう:私は可読性のためにコードを編集しました。私は両方の例で数値をチェックし、結果は真である。 –

答えて

0

を取りました。 SwingではdrawImageを呼び出すと画像が実際にレンダリングされます。 JavaFXでは、イメージを描画するこのコマンドは、後で実行されるコマンドバッファに追加されます。

関連する問題