Я создаю базовую стратегическую стратегию пространства в реальном времени, которая требует очень большой карты, но будет отображать только небольшую часть карты за раз. Я обнаружил, что это очень легко сделать с видовым окном с использованием imageview. К сожалению, для просмотра изображений требуется изображение, которое нужно передать, и я использовал холст, чтобы нарисовать все спрайты на фоне. Я использую моментальный снимок для получения изображения полностью визуализированной сцены и передачи этого изображения, чтобы я мог использовать видовое окно, но это привело к серьезному снижению производительности. Без использования моментального снимка игра работает со скоростью 60 кадров в секунду, однако при использовании моментального снимка fps всегда 15 или ниже. Использование моментального снимка не было проблемой, когда сцена была 1024x512, но теперь она 4096x2048. Есть ли лучший способ использовать просмотр изображений и просмотр 60 раз в секунду без использования моментального снимка? Пример код, что я делаю ниже:javafx моментальный снимок с низкой производительностью
Group trueRoot = new Group(); //shown image
Group root = new Group(); //invisible unedited image
Canvas canvas = new Canvas(4096, 2048); //unedited canvas
root.getChildren().add(canvas);
GraphicsContext gc = canvas.getGraphicsContext2D();
Scene scene2 = new Scene(trueRoot);
primaryStage.setScene(scene2);
WritableImage sceneImage = root.snapshot(new SnapshotParameters(), null); //snapshot of fully rendered root scene
ImageView imageView = new ImageView(sceneImage); //imageView can be used to resize or crop
Rectangle2D viewportRect = new Rectangle2D(0, 0, 1024, 512); //for cropping
imageView.setViewport(viewportRect); //for cropping
trueRoot.getChildren().add(imageView); //also for resizing/cropping
new AnimationTimer() {
public void handle(long currentNanoTime) {
//simple animated background
if (cloudTimer == 16384)
cloudTimer = 0;
else
cloudTimer++;
gc.drawImage(stars, 0, 0);
gc.drawImage(clouds1, cloudTimer % 16384, 0);
gc.drawImage(clouds1, (cloudTimer % 16384) - 8192, 0);
gc.drawImage(clouds2, (cloudTimer/2) % 16384, 0);
gc.drawImage(clouds2, ((cloudTimer/2) % 16384) - 8192, 0);
p1.update(p2, root);
p2.update(p1, root);
p1.render(gc, root);
p2.render(gc, root);
root.snapshot(new SnapshotParameters(), sceneImage); //takes root scene and hands it to trueRoot
}
}.start();
primaryStage.show();
полный код на https://github.com/WiredOverload/ObliterateEverything
Я знаю, что я мог бы использовать асинхронный снимок, чтобы избежать задержек остальной части коды, пока снимок происходит, но что все равно оставит игру со скоростью 15 кадров в секунду. Мы ценим любые предложения.
Спасибо, я постараюсь Внесите это в мой код. Если мне удастся правильно его поместить, я скажу, работает ли это или нет. – WiredOverload