我有一个将像素写入画布的简单方法。 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);
}
}
答案 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会更容易。