当加载新的FXML并设置BorderPane的中心时,应用程序会短暂“冻结”,无论是来自时间轴还是来自图像视图中的gif,现有动画都将停止.我正在使用此代码更改centerView:
@FXML
public void handleChangeView(ActionEvent event) {
Task loadTask = new Task<>() {
@Override
public Parent call() throws IOException {
String changeButtonID = ((ToggleButton) event.getSource()).getId();
Parent newOne = getFxmls().get(changeButtonID);
if (newOne == null) {
FXMLLoader loader = new FXMLLoader(getClass().getResource("/view/" + changeButtonID + ".fxml"));
newOne = loader.load();
getFxmls().put(changeButtonID, newOne);
}
return newOne ;
}
};
loadTask.setOnSucceeded(e -> {
getMainUI().setCenter(loadTask.getValue());
});
loadTask.setOnFailed(e -> loadTask.getException().printStackTrace());
Thread thread = new Thread(loadTask);
thread.start();
}
虽然这确保了在加载时保持UI响应的工作,但是当中心舞台第一次显示时,存在明显的滞后.查看CPU配置文件:
我不确定延迟是来自初始化函数运行还是加载元素.这是程序的GIF,你可以看到可见的延迟:
通过在VLC中加载并逐帧进行,延迟在30 fps视频中看起来是5或6帧,这意味着大约200ms的延迟意味着动画冻结超过50ms左右的初始化方法. (也许整个加载方法会冻结动画?)
问题是,在这期间可以保持动画流畅吗?
// ********* EDIT ********** //
所以我经历了这个项目并尽可能多地删除了一些方法和类,将整个游戏减少到了6个最小的类.我仍然有按下字符按钮(‘你’按钮)的延迟.有了这样一个极小的例子,我迷失了可能是错的.我已将此上传到谷歌驱动器供任何人查看.