Как мы переносим Google Планета Земля в Интернет

Улучшение кросс-браузерного доступа к Google Earth с помощью WebAssembly.

Джордон Мирс
Jordon Mears

В идеальном мире каждое приложение, созданное разработчиками, независимо от технологии, было бы доступно в браузере. Но существуют препятствия для вывода проектов в Интернет, которые зависят от технологии, с помощью которой они были созданы, и от того, насколько хорошо эта технология поддерживается различными поставщиками браузеров. WebAssembly (Wasm) — это цель компиляции, стандартизированная W3C , которая помогает нам решить эту проблему, позволяя запускать в Интернете базы кода с языков, отличных от JavaScript.

Мы сделали именно это с помощью Google Earth, доступной сегодня в предварительной бета-версии на WebAssembly. Имейте в виду, что это все еще бета-версия Google Планета Земля, и она может работать не так гладко, как вы привыкли (попробуйте обычную версию Google Планета Земля в Интернете ). Вы можете поэкспериментировать с этой бета-версией в Chrome и других браузерах на базе Chromium, включая Edge (Canary-версия) и Opera, а также Firefox. Считайте эту бета-версию своим источником вдохновения, если вы тоже ищете лучшую кроссбраузерную поддержку для приложений, специфичных для вашей платформы.

Почему мы выбрали WebAssembly для Google Earth

Первоначально мы написали большую часть Google Планета Земля на C++, поскольку это было настольное приложение, предназначенное для установки. Затем мы смогли портировать его на Android и iOS, когда смартфоны стали популярны, сохранив большую часть нашей кодовой базы C++ с использованием NDK и Objective-C++ . В 2017 году, когда мы вывели Earth в Интернет, мы использовали Native Client (NaCl) для компиляции кода C++ и запуска его в браузере Chrome.

В то время NaCl была единственной браузерной технологией, которая позволяла нам переносить наш код C++ в браузер и обеспечивать ту производительность, которая была необходима Земле. К сожалению, NaCl была технологией только Chrome и никогда не применялась в браузерах. Теперь мы начинаем переходить на WebAssembly, который позволяет нам использовать тот же код и запускать его в браузерах. Это означает, что Земля будет доступна большему количеству людей в сети.

Скриншот Земли с Эйфелевой башней.

Ветка о резьбе

WebAssembly все еще развивается как стандарт, а браузеры продолжают расширяться за счет новых функций и возможностей. С точки зрения Земли, наиболее существенной разницей в поддержке WebAssembly между браузерами является поддержка потоков. Некоторые браузеры поддерживают многопоточность, а другие нет. Думайте о Земле как об огромной трехмерной видеоигре реального мира. Таким образом, мы постоянно передаем данные в браузер, распаковываем их и готовим к отображению на экране. Возможность выполнять эту работу в фоновом потоке продемонстрировала явное улучшение производительности Earth в браузере .

Многопоточная WebAssembly опирается на функцию браузера под названием SharedArrayBuffer, которая была удалена из браузеров после того, как были обнаружены уязвимости безопасности Spectre и Meltdown. Чтобы снизить потенциальный ущерб от атак, команда безопасности Chrome ввела изоляцию сайтов в Chrome для всех настольных операционных систем. Изоляция сайта ограничивает каждый процесс рендеринга документами с одного сайта. После установки этой функции безопасности Chrome повторно включил SharedArrayBuffer для настольных компьютеров, что позволило нам использовать многопоточную WebAssembly с Earth для Chrome.

Другие браузеры работают над изоляцией сайта или другими средствами защиты, чтобы повторно включить SharedArrayBuffer. Между тем, в этих браузерах Earth работает в однопоточном режиме.

Как WebAssembly работает с разными браузерами

Мы многое узнали о состоянии поддержки WebAssembly в браузерах, переносящих Earth. Если вы собираетесь разрабатывать приложения с использованием WebAssembly, важно понимать текущее состояние того, как WebAssembly работает с различными браузерами.

Край

Edge находится на грани превращения в два отдельных процесса разработки, основанных на решении Microsoft перейти от средства рендеринга EdgeHTML к средству рендеринга на основе Chromium. На данный момент бета-версия Google Earth на WebAssembly не будет работать в текущей общедоступной версии Edge из-за отсутствия поддержки WebGL2. Это будет исправлено, как только в ближайшем будущем выйдет новая версия Edge, основанная на Chromium. А пока вы можете загрузить Canary-версию Edge и убедиться, что Earth работает вполне хорошо.

Хром

Chrome имеет мощную поддержку WebAssembly, включая многопоточность на рабочем столе, поэтому вы можете ожидать, что в результате Earth будет работать более плавно. Однако мы с нетерпением ждем, когда Chrome добавит поддержку динамического выделения памяти с помощью многопоточности в WebAssembly. До тех пор Earth может не запускаться на устройствах с ограниченным объемом памяти (например, на 32-битных машинах).

Fire Fox

Firefox предлагает хорошую поддержку WebAssembly, но отключил поддержку многопоточности. В результате вы можете ожидать более медленного взаимодействия с Землей. Мы с нетерпением ждем, когда Mozilla вернет поддержку многопоточности в будущих версиях. С другой стороны, Firefox поддерживает динамическое распределение памяти.

Опера

Opera основана на Chromium, как и Chrome, а также на будущих версиях Edge. Однако текущая версия Opera предлагает только однопоточную поддержку WebAssembly. Земля работает в Opera, но в несколько ухудшенном режиме. Надеемся, что в новых версиях Opera будет поддержка многопоточности и более надежная поддержка WebAssembly.

Сафари

Safari имеет надежную реализацию WebAssembly, но не имеет полной поддержки WebGL2. Поэтому Earth с WebAssembly не работает в Safari. В частности, некоторые из наших шейдеров требуют GLSL 1.2. Мы надеемся, что Earth будет доступна и в Safari, как только будет добавлена ​​улучшенная поддержка WebGL2.

С нетерпением ждем дальнейшего внедрения функций WebAssembly.

Мы проделали долгий путь, чтобы сделать Землю доступной в Интернете. Около шести лет назад мы начали с первоначальной внутренней демонстрации на основе asm.js , которую поддерживали и расширяли на протяжении многих лет. Затем он был преобразован в сборку Earth WebAssembly, поскольку WebAssembly стал стандартом, принятым W3C.

У нас еще есть варианты для WebAssembly и Earth. В частности, мы хотели бы перейти на серверную часть LLVM, используя Emscripten (цепочку инструментов для создания WebAssembly из кода C++). Это изменение обеспечит будущую поддержку SIMD, а также более сильные инструменты отладки, такие как исходные карты для кода исходного языка. Мы также надеемся увидеть внедрение OffscreenCanvas и полную поддержку динамического распределения памяти в WebAssembly. Но мы знаем, что на правильном пути: WebAssembly — это долгосрочное будущее Земли в Интернете.

Пожалуйста, найдите время и попробуйте нашу бета-версию . Дайте нам знать, как это работает для вас, оставив отзыв прямо на Земле.