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秒
あなたのコードでは、JavaFXは1000Kイメージをレンダリングしますが、Swingは10Kイメージだけをレンダリングします。 –
両方の例で[SSCCE](http://sscce.org)を入力してください。テストが正しいかどうかわかります。 –
誤字を指摘してくれてありがとう:私は可読性のためにコードを編集しました。私は両方の例で数値をチェックし、結果は真である。 –