Если я рисую карту в методе настройки Processing и вообще не запускаю draw (), разве моя карта не должна быть нарисована хотя бы один раз? - PullRequest
0 голосов
/ 10 января 2019

У меня есть старый проект, который использует Unfolding Maps and Processing для рисования, ну ... карты, ха-ха. Проект работает нормально, но я кое-что проверял, чтобы помочь коллеге, и столкнулся с чем-то, чего я не совсем понимаю.

У меня следующий вопрос: если я вызываю метод draw() Unfolding Map (map.draw()) в методе draw() Processing, все работает нормально, все непрерывно перерисовывается, и я могу правильно взаимодействовать с приложением и еще чем-то. Тем не менее, если я выполняю map.draw() в методе Processing setup() и затем избегаю когда-либо запущенного метода Processing draw(), разве карта не будет нарисована один раз, а затем все закроется?

Вместо этого, когда я запускаю map.draw() в setup() и затем заставляю все остановиться, он ничего не рисует, даже один раз.

Кроме того, я попытался запустить метод draw() Обработки только один раз и вызвать map.draw() только один раз в методе draw() Обработки, используя noLoop() в конце setup(). Мой проект очень длинный, поэтому я просто опубликую немного кода, предназначенного только для проверки этого моего маленького вопроса.

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

Я ожидаю, что карта будет нарисована один раз, а затем все остановится. Вместо этого я получаю следующее:

blank window

1 Ответ

0 голосов
/ 10 января 2019

Все, что вы сказали, имеет смысл, и ваши ожидания оправданы. Вы можете подтвердить поведение, нарисовав прямоугольник вместо карты.

Мое предположение заключается в том, что Unfolding Maps не совместим с функцией noLoop(). Я бы предположил, что Unfolding Maps имеет некоторую внутреннюю логику, основанную на цикле прорисовки: асинхронная загрузка листов карты, реагирование на ввод пользователя и т. Д.

Вы можете изучить поведение, выполнив что-то подобное в вашей функции setup():

noLoop();

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

Это хак , предназначенный для изучения поведения. Я не рекомендую это исправить. Если я сделаю это, то увижу, что карта частично загружена:

partially loaded map

Это говорит мне о том, что Unfolding Maps каким-то образом полагается на draw(), который вызывается несколько раз для обработки загрузки. Это имеет смысл, поскольку загрузка является асинхронной и происходит в фоновом режиме с течением времени. Вероятно, это связано с необходимостью рисования в главном потоке обработки после загрузки изображений. Если вы хотите быть уверены, вы можете взглянуть на источник Unfolding Maps, чтобы понять его внутреннее поведение.

Если вам действительно нужно использовать noLoop() с Unfolding Maps, вы можете использовать хак с функцией delay(). Или вы можете посмотреть документацию для Unfolding Maps; возможно есть полезная функция, которую мы пропустили. Или вы можете изменить источник, чтобы получить поведение, которое вы хотите. Или, может быть, вы могли бы что-то собрать вместе, используя PGraphics или что-то еще.

Но в основном, я думаю, вам следует избегать использования noLoop() с Unfolding Maps.

...