###前提・実現したいこと
こちらの質問でCanvasへの再描画についてお聞きした時と最終的に実現したいことは同じです.
再描画についての基本的な部分はTimelineを使うことで実装できたのですが,繰り返しの間隔を短くした時,描画が追いつかず,固まったような状態になります.
できたら繰り返しの処理を下記のように実装したいと思っています.
1.物体の座標の再計算
2.その座標を用いての描画処理
3.【描画処理が終わった後】に規定の空白時間を設け,1に戻る.
このように繰り返しの処理を行いたいのですが,なにか良い方法があればご教授願いたいです…
現状のTimelineでの処理だと,厳密に「上記の1や2の処理が終わった後」での繰り返しになるわけではなく,計算処理量が大きくなるにつれ,「1,2の処理中」に繰り返し処理が起こる可能性があるため,処理落ちのような状態が発生していると思うのですが…
上記の処理をJavaFXで実装するためのヒントや,あるいは処理落ちが起こらない別の方策がございましたらお力をお貸しくださいお願いします.
###発生している問題・エラーメッセージ
間隔を短くした時,表示が追いつかない状態になる.
###該当のソースコード
こちらの質問で示したソースコードに,教えて頂いたTimelineの処理を実装したものです.
Java
1//FXTest2.fxml 2 3<?xml version="1.0" encoding="UTF-8"?> 4 5<?import javafx.scene.canvas.Canvas?> 6<?import javafx.scene.layout.AnchorPane?> 7 8<AnchorPane xmlns="http://javafx.com/javafx/9" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sim.FXTest2Controller"> 9 <children> 10 <AnchorPane layoutX="-98.0" layoutY="-90.0" prefHeight="500.0" prefWidth="500.0"> 11 <children> 12 <Canvas fx:id="Canvas" height="348.0" layoutX="115.0" layoutY="109.0" width="270.0" AnchorPane.leftAnchor="115.0" AnchorPane.topAnchor="109.0" /> 13 </children> 14 </AnchorPane> 15 </children> 16</AnchorPane> 17
Java
1//FXTest2Controller.java 2 3package sim; 4 5 6import javafx.fxml.FXML; 7import javafx.fxml.Initializable; 8import java.net.URL; 9import java.util.ResourceBundle; 10import javafx.scene.paint.Color; 11import javafx.scene.canvas.GraphicsContext; 12import javafx.scene.canvas.Canvas; 13 14public class FXTest2Controller implements Initializable { 15 @FXML Canvas Canvas; 16 GraphicsContext gc; 17 18 public void initialize(URL location, ResourceBundle resources) { 19 20 gc = Canvas.getGraphicsContext2D(); 21 22 Timeline timeline = new Timeline( 23 new KeyFrame( 24 Duration.millis(30)), 25 (event) -> { 26 27 //ここで物体の座標計算をしたとみてください 28 29 draw(); 30 }) 31 ); 32 timeline.setCycleCount(Timeline.INDEFINITE); // 無限に繰り返す 33 timeline.start(); // 開始 34 } 35 36 public void draw() { 37 38 //ここで描画処理を行っています 39 40 } 41} 42 43
Java
1//Main.java 2 3package sim; 4 5import javafx.application.Application; 6import javafx.stage.Stage; 7import javafx.scene.Scene; 8import javafx.scene.canvas.Canvas; 9import javafx.scene.canvas.GraphicsContext; 10import javafx.scene.layout.AnchorPane; 11import javafx.scene.paint.Color; 12import javafx.fxml.FXMLLoader; 13import javafx.fxml.FXML; 14 15public class Main extends Application { 16 17 @Override 18 public void start(Stage primaryStage) { 19 20 try { 21 AnchorPane root = (AnchorPane)FXMLLoader.load(getClass().getResource("FXTest2.fxml")); 22 Scene scene = new Scene(root,400,400); 23 scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm()); 24 primaryStage.setScene(scene); 25 primaryStage.show(); 26 } catch(Exception e) { 27 e.printStackTrace(); 28 } 29 } 30 31 public static void main(String[] args) { 32 launch(args); 33 } 34}
###試したこと
ひとまずTimelineのループ時間を十分長く取れば処理落ちは起こりませんでした.
ただ,プログラム内部のループ時間によって処理落ちが発生するのはあまり望ましくないと思っていますので,この方法以外での手法をお聞きしたいです…
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/10/28 04:25 編集
2017/10/28 04:14
2017/10/28 04:18
2017/10/28 07:53
2017/10/28 07:57