Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaFX画布GraphicsContext.drawImage_Java_Canvas_Javafx - Fatal编程技术网

JavaFX画布GraphicsContext.drawImage

JavaFX画布GraphicsContext.drawImage,java,canvas,javafx,Java,Canvas,Javafx,我正在为UI使用JavaFX制作一个地图编辑器,并使用自定义画布绘制用户绘制地图的组件 这是我在地图编辑器中嵌入的画布组件 public class EditorEngine extends Canvas { public Level level; public MouseHandler mouse; @SuppressWarnings("unchecked") public EditorEngine(Level level, ReadOnlyDoublePr

我正在为UI使用JavaFX制作一个地图编辑器,并使用自定义画布绘制用户绘制地图的组件

这是我在地图编辑器中嵌入的画布组件

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!");
            }
        }
    }
}
调用两个或三个tile会有一点延迟,任何接近5个tile的地方都会完全冻结应用程序。我100%认为这是问题所在,因为它在没有该行的情况下运行100%良好,但一旦它添加回(在调试模式下)并保存,软件立即冻结


有人知道为什么会这样吗?谢谢

别客气。这是我的一个错误,我完全忽略了这一点。t、 sprite是我自己的LazySprite类,只有在需要时才从硬盘加载sprite。事实证明,加载后我忘了将其布尔值“initialized”设置为true,因此它每一帧都从我的HDD加载一次tileset。

对其进行了性能修复。它在Java8中工作得更好吗?另外,在渲染每个帧之前运行(或
fillRect
)方法是否有助于提高性能?实际上,我现在正在使用Java 8,在渲染任何可以看到的内容之前,我已经在使用clearrect了
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);