我有一个旧的项目,涉及使用展开地图和处理绘制,well...maps哈哈。该项目运行良好,但我正在检查一些东西,以帮助一个同事,并遇到了一些我不太明白的事情。
我的问题如下:如果我在处理的draw()方法中调用draw()的draw()方法(map.draw()),一切都会正常工作,所有的东西都会被不断地重新绘制,并且我可以正确地与应用程序和诸如此类的东西交互。但是,如果我在处理的setup()方法中执行setup(),然后避免处理的draw()方法永远运行,那么映射不是应该被绘制一次然后所有的东西都关闭吗?
相反,当我在map.draw()中运行setup(),然后强制停止所有操作时,它不会绘制任何东西,甚至一次都不会。
另外,我尝试过只运行一次Processing的draw()方法,在处理的draw()方法中只调用map.draw()一次,方法是在setup()的末尾使用noLoop()。我的项目真的很长,所以我只会发布一些代码来测试我的这个小问题。
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();
}我希望这张地图只绘制一次,然后一切都停止。相反,我得到以下信息:

发布于 2019-01-10 17:32:56
你所说的一切都是有意义的,你的期望也是正确的。您可以通过绘制矩形而不是地图来确认行为。
我最好的猜测是,展开映射与noLoop()函数不兼容。我假设展开映射有一些依赖于绘制循环的内部逻辑:异步加载映射块、响应用户输入等等。
您可以通过在setup()函数中执行类似的操作来探索这种行为:
noLoop();
for(int i = 0; i < 100; i++){
draw();
}--这是一个黑客,目的是探索行为。我不推荐这是个解决办法。如果我这样做,就会看到地图被部分加载:

这告诉我,展开映射在某种程度上依赖于多次调用draw()来处理加载。这是有意义的,因为加载是异步的,并且随着时间的推移在后台发生。这可能与在加载图像后需要绘制处理的主线程有关。如果您想要确定,您可以查看展开地图的来源来了解它的内部行为。
如果您真的需要在展开映射中使用noLoop(),则可以在delay()函数中使用hack。或者,您可以查看文献资料的展开映射;也许有一个有用的函数我们已经错过了。或者您可以修改源以获得您想要的行为。或者,您可以使用PGraphics或其他工具将一些东西组合在一起。
但大多数情况下,我认为您应该避免在展开映射中使用noLoop()。
https://stackoverflow.com/questions/54133756
复制相似问题