最近在尝试用javafx写一个简单的2D游戏,没有仔细学过FX和多线程,就闭门造车一次。
在制作过程中,发现当移动射击等操作越来越多、主页面图形变化逐渐丰富的时候,开始出现卡顿,最后有概率地出现Not on java FX Application问题,接着出现NullPointerException导致程序崩溃。逐步排查后发现可能是并发问题,之前一直没有考虑到并发,而是简单地使用Platform.runlater(new Runnable(public void run{}))来解决Not on FX application的问题。
虽然无法确认,但是并发问题有最大的嫌疑性。
为了验证并解决问题,受数据库的启发,写了一个执行中心类(HandleCenter)。
原理就是现将用数组存储起来,再进行批量依次操作。
我把每一次要进行图形变换的方法,例如
Platform.runLater(new Runnable() {
public void run() {
if(d.getId()==c.getId()) Main.pane.getChildren().remove(d);
}
});
直接看run的重写:在Main的pane里面直接删除Node d
解决:
把删除d的操作存储起来
PaintCenter.deleteBacth(d);