gpt4 book ai didi

JavaFX canvas GraphicsContext.drawImage 巨大的滞后

转载 作者:太空宇宙 更新时间:2023-11-04 15:10:04 25 4
gpt4 key购买 nike

我正在制作一个 map 编辑器,使用 JavaFX 作为 UI,并使用自定义 Canvas 来绘制用户绘制 map 的组件。

这是我嵌入到 map 编辑器中的 Canvas 组件

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);

对两个或三个图 block 调用此方法会有点滞后,并且在任何接近 5 个以上图 block 的地方都会完全卡住应用程序。我 100% 认为这是问题所在,因为没有该行它运行 100% 正常,但一旦将其添加回来(在 Debug模式下)并保存,软件立即卡住。

有人知道为什么会发生这种情况吗?谢谢

最佳答案

没关系。这是我的一个错误,我完全忽略了这一点。 t.sprite 是我自己的 LazySprite 类,一个仅在需要时才从 HDD 加载的 Sprite 。事实证明,我在加载后忘记将其 boolean 值“initialized”设置为 true,因此它每帧都会从我的 HDD 加载图 block 集。

关于JavaFX canvas GraphicsContext.drawImage 巨大的滞后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21444287/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com