我正在使用JavaFX为UI创建地图编辑器,并使用自定义画布绘制用户绘制地图的组件。
这是我在地图编辑器中嵌入的画布组件
public class EditorEngine extends Canvas {
public Level level;
public MouseHandler mouse;
@SuppressWarnings("unchecked")
public EditorEngine(Level level, ReadOnlyDoubleProperty widthProperty, ReadOnlyDoubleProperty heightProperty) {
super(widthProperty.getValue(), heightProperty.getValue());
this.level = level;
level.engine = this;
this.widthProperty().bind(widthProperty);
this.heightProperty().bind(heightProperty);
this.mouse = new MouseHandler(this);
Duration frameDuration = Duration.millis(1000 / 42);
@SuppressWarnings("rawtypes")
KeyFrame frame = new KeyFrame(frameDuration, new EventHandler() {
@Override
public void handle(Event event) {
update();
render();
}
});
new Timeline(60).setCycleCount(Animation.INDEFINITE);
TimelineBuilder.create().cycleCount(Animation.INDEFINITE).keyFrames(frame).build().play();
}
public int tick = 0;
public void update() {
tick++;
if (level != null) {
level.update();
}
mouse.update();
}
public void render() {
GraphicsContext g = getGraphicsContext2D();
g.clearRect(0, 0, getWidth(), getHeight());
g.fillRect(mouse.mx - 5, mouse.my - 5, 10, 10); //for testing and stuff
if (level != null) {
level.render(g);
}
}
}
但这不是问题发生的地方。看一下我的Level.draw方法
public void render(GraphicsContext g) {
for (int i = 0; i < w; i++) {
for (int j = 0; j < h; j++) {
if (getTile(i, j) == null) continue;
Tileset t = Project.current.world.getTileset(tiles[j * w + i].tileset);
if (t.sprite != null) {
g.drawImage(t.sprite.get(), tiles[index(i, j)].sprite % t.w, tiles[index(i, j)].sprite / t.w, 16, 16, i * 16, j * 16, 16, 16);
} else {
System.out.println("Warning: Tileset.sprite == null!");
}
}
}
}
这是错误的一行
g.drawImage(t.sprite.get(), tiles[index(i, j)].sprite % t.w, tiles[index(i, j)].sprite / t.w, 16, 16, i * 16, j * 16, 16, 16);
调用两个或三个磁贴将会滞后一点,任何接近5个磁贴的地方都会完全冻结应用程序。我100%认为这是问题所在,因为它在没有该行的情况下运行100%,但只要它将其添加回来(在调试模式下)并保存,软件立即冻结。
有人会知道为什么会这样吗?感谢
答案 0 :(得分:0)
没关系。这是我的错误,我完全忽视了这一点。 t.sprite是我自己的LazySprite类,只有在需要时才从硬盘加载的精灵。事实证明,我忘了在加载后将其布尔“初始化”设置为true,因此它每隔一帧就会从我的硬盘加载tileset。