Надлежащая попытка создания Cesium, обнаружение ошибок, кросс-браузерная совместимость и ошибки разработчиков

В настоящее время я работаю над проектом ГИС, который должен быть кроссбраузерным, мобильным, мультиплатформенным и всемогущим. Cesium не работает без WebGL, в некоторых старых браузерах и других мелких исключениях, но я должен их все перехватить. Я решил перейти на OpenLayers, когда Цезий не может быть вариантом, OL хорошо работает практически со всем. На данный момент у меня есть попытка перехвата для нового Cesium.Viewer, и перехват запускает OpenLayers, который работал довольно хорошо до недавнего времени, когда я начал получать ошибку Cesium «недостаточно памяти».

Cesium docs на Developer Error стоит: никогда не следует ловить; вместо этого вызывающий код должен стремиться не генерировать его. Ну как же обойти это стремление? Есть ли какой-нибудь надежный способ проверить, правильно ли запустится Cesium, или мне нужно попробовать поймать каждый метод, который я вызываю, чтобы убедиться, что он не выйдет из строя?


person pogan    schedule 18.05.2015    source источник
comment
Вы упомянули, что до недавнего времени это работало довольно хорошо. Что изменилось за последнее время?   -  person emackey    schedule 19.05.2015
comment
Ничего такого. Я предполагаю, что память/кеш телефона переполнились.   -  person pogan    schedule 19.05.2015


Ответы (1)


Конечно, new Cesium.Viewer(...) следует обернуть в try/catch, так как он выдаст Cesium.RuntimeError, если не сможет инициализировать WebGL. Кроме того, viewer.scene имеет событие renderError, которое вызывается при возникновении ошибки внутри цикл рендеринга (поскольку обычный/автоматический цикл рендеринга нельзя обернуть в try/catch).

Но, конечно, любой вызов, который выделяет память в браузере, потенциально может завершиться ошибкой, если браузер близок к нехватке памяти. К сожалению, в JavaScript не так много предупреждений об этом. Цезий был довольно хорошо очищен, чтобы не выделять память при рендеринге (повторное использование рабочих переменных с параметрами result и т. д.), но некоторые действия, такие как увеличение масштаба местности в высоком разрешении, обязательно будут выделять некоторую память. Добавление сущностей, новых графических примитивов и прочее приведет к выделению памяти. Вы, вероятно, захотите попробовать/поймать при добавлении новых объектов в представление.

Также взгляните на viewerPerformanceWatchdogMixin.

person emackey    schedule 19.05.2015