视网膜显示器上的慢速滞后Javafx性能

时间:2016-04-01 17:10:51

标签: java javafx retina

我有一个将像素写入画布的简单方法。 GrapicConte2D。一个int [] - pixelarray每帧都被随机化,并用PixelWriters setPixels() - Method进行更新。

我有一个双显示器设置,一个"常规"屏幕和macbook pro视网膜。将我的应用程序框架拖到我的"常规"屏幕一切对我来说都很好。但是把它放在我的MacBooks Retina显示器上它会变得非常迟钝。

我真的不知道出了什么问题。我几次检查我的代码,但似乎我无法帮助自己。

我会非常感谢每一个可以帮助我的建议。

由于

代码:

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 :(得分: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会更容易。