如果我在 Processing 的设置方法中绘制地图并完全停止 运行 中的 draw(),我的地图不应该至少绘制一次吗?

If I draw a map in Processing's setup method and stop draw() from running at all, shouldn't my map be drawn at least once?

我有一个旧项目涉及使用展开地图和处理来绘制,好吧...地图哈哈。该项目运行良好,但我正在检查一些东西以帮助同事并遇到一些我不太了解的东西。

我的问题如下:如果我在 Processing 的 draw() 方法中调用 Unfolding Map 的 draw() 方法(map.draw()),一切正常,一切都在不断重绘,我可以正确地与应用程序交互等等。但是,如果我在 Processing 的 setup() 方法中执行 map.draw(),然后从 运行ning 中避免 Processing 的 draw() 方法,地图不应该绘制一次然后一切都关闭下来了吗?

相反,当我在 setup() 中 运行 map.draw() 然后强制一切停止时,它什么也没有画,一次也没有。

此外,我已经尝试了一次 运行ning Processing 的 draw() 方法,并且在 Processing 的 draw() 方法中只调用了一次 map.draw(),使用 noLoop()setup() 的末尾。我的项目真的很长,所以我只是post一些代码来测试我的这个小问题。

private static final boolean offline = false;
public static String mbTilesString = "/Users/roy/IdeaProjects/UnfoldingMaps/data/blankLight-1-3.mbtiles"
private UnfoldingMap map;

public void setup() {
    size(900, 700, OPENGL);

    if (offline) {
        this.map = new UnfoldingMap(this, 200, 50, 650, 600, new MBTilesMapProvider(mbTilesString));
    } else {
        this.map = new UnfoldingMap(this, 200, 50, 650, 600, new Microsoft.RoadProvider());
    }

    MapUtils.createDefaultEventDispatcher(this, this.map);

    noLoop(); // draw() gets called only once
}

public void draw() {
    this.map.draw();
}

我希望地图绘制一次,然后一切都停止。 相反,我得到以下信息:

您所说的一切都是有道理的,您的期望是正确的。您可以通过绘制矩形而不是地图来确认该行为。

我最好的猜测是展开地图与 noLoop() 功能不兼容。我假设展开地图有一些依赖于绘制循环的内部逻辑:异步加载地图图块、响应用户输入等。

您可以通过在 setup() 函数中执行类似的操作来探索行为:

noLoop();

for(int i = 0; i < 100; i++){
  draw();
}

这是一个 hack 旨在探索行为。我不建议这是一个修复。如果我这样做,我会看到地图已部分加载:

这告诉我,展开地图在某种程度上依赖于 draw() 被多次调用来处理加载。这是有道理的,因为加载是异步的,并且随着时间的推移在后台发生。这可能与加载图像后需要在 Processing 的主线程上绘制有关。如果您想确定,可以查看展开地图的 the source 以了解其内部行为。

如果您真的需要将 noLoop() 与展开地图一起使用,您可以使用 delay() 功能的 hack。或者您可以查看 the documentation 的展开地图;也许我们错过了一个有用的功能。或者您可以修改源代码以获得您想要的行为。或者,也许您可​​以使用 PGraphics 或其他东西将某些东西放在一起。

但大多数情况下,我认为您应该避免将 noLoop() 与展开地图一起使用。