Есть ли какая-либо причина, кроме производительности, для использования WebGL вместо 2D-Canvas для 2D- игр / приложений?
Другими словами, какие 2D-функции предлагает WebGL, чего невозможно легко достичь с помощью 2D-Canvas?
Есть ли какая-либо причина, кроме производительности, для использования WebGL вместо 2D-Canvas для 2D- игр / приложений?
Другими словами, какие 2D-функции предлагает WebGL, чего невозможно легко достичь с помощью 2D-Canvas?
Ответы:
Взглянем на этот вопрос с другой стороны:
как разработчик выбирает одну технологию перед другой?
Итак, я расскажу о различиях между API Canvas и webGL в отношении этих качеств.
И холст, и webGL - это API JavaScript. В отношении интеграции (привязки) они практически одинаковы. Оба они поддерживаются рядом библиотек, которые могут ускорить ваше кодирование. Различные библиотеки дают вам разные способы организации вашего кода, поэтому выбор библиотеки определяет, как структурированы ваши API-интерфейсы для рисования, но это все равно почти то же самое (как остальная часть кода связывается с ним). Если вы используете библиотеку, простота написания кода зависит от самой библиотеки.
Если вы пишете код с нуля, API холста будет намного легче изучить и понять. Это требует минимальных математических знаний, а разработка идет быстро и просто.
Работа с API WebGL требует сильных математических навыков и полного понимания конвейера рендеринга. Людей с такими навыками труднее найти, производство идет медленнее (из-за размера и сложности такой кодовой базы) и, следовательно, стоит дороже.
WebGL быстрее и имеет больше возможностей. Никаких сомнений насчет этого. Это собственный 3D API, который дает вам полный доступ к конвейеру рендеринга, код и эффекты выполняются быстрее и их легче настраивать. В webGL действительно нет предела.
И холст, и webGL - это положительные моменты html5. Обычно устройства, которые поддерживают одно, будут поддерживать и другое.
Итак, подведем итоги:
Надеюсь это поможет.
PS Открыт для обсуждения.
Самое большое преимущество - это программируемость конвейера и производительность. Например, скажем, вы рисуете 2 блока один над другим, и один скрыт, некоторые реализации GL имеют возможность отбрасывать скрытый блок.
Что касается сравнений, так как здесь нет быстрого способа создать таблицу, я просто загрузил изображение таблицы сравнения ниже. Добавлен Three.js только для полноты картины.
Судя по опыту работы с моими собственными приложениями , графические шейдеры были единственной причиной, по которой мне потребовалась поддержка WebGL. Для меня простота использования не имеет большого значения, поскольку обе структуры можно абстрагировать с помощью three.js. Предполагая, что шейдеры мне не нужны, я разрешаю использовать любую структуру для максимальной поддержки браузера / компьютера.
Какие возможности 2D у WebGL по сравнению с 2D холстом? ИМХО, самый большой - это программируемые фрагментные шейдеры на графическом оборудовании. Например, в WebGL можно реализовать игру Конвея в виде шейдера на вашем 3D-оборудовании:
Этот вид 2D-дисплея будет работать только на CPU, а не на GPU, с 2D-холстом. Все вычисления будут реализованы на JavaScript и не будут такими параллельными, как GPU, даже с помощью веб-воркеров. Это, конечно, только один пример, с помощью шейдеров можно реализовать всевозможные интересные 2D-эффекты.
Что ж, производительность была бы одной из главных причин, потому что когда вы пишете игру, она должна быть быстрой. Но есть несколько других причин, по которым вы можете предпочесть WebGL холсту. Он предлагает возможность кодирования шейдеров, освещения и масштабирования, что важно, если вы делаете коммерческое игровое приложение. Также холст становится лагающим после 50 спрайтов или около того.
С Canvas вы ничего не можете сделать с webGL: холст позволяет дробить байты с помощью get / putImageData, и вы можете рисовать линии, круги ... программно с помощью webGL.
Но если вы хотите сделать довольно много рисунков, а также некоторые эффекты со скоростью 60 кадров в секунду, разрыв в производительности настолько велик, что это просто невозможно с холстом, когда он будет нормально работать в webGL. Производительность - это основная функция.
Тем не менее, webGL довольно сложно программировать: посмотрите, достаточно ли холста для вас, или найдите библиотеку, которая облегчит вашу боль ...
Другой недостаток: он не работает в IE (но что?) И на некоторых мобильных устройствах.
См. Здесь для совместимости: http://caniuse.com/webgl
Поскольку вам конкретно нужны классические 2D-вещи, которые не работают с холстом:
... но, конечно, у вас есть доступ к пикселям, так что вы действительно можете делать все, включая вышеперечисленное, вручную. Но это может быть очень, очень медленным. Теоретически вы можете написать Mesa openGl для рендеринга на холст.
Другой важной причиной использования webGL может быть то, что результат очень легко перенести в другое место. Что также делает навык более ценным.
Причины использования холста заключаются в том, что он все еще лучше поддерживается, и если вы научитесь делать что-то попиксельно, это тоже очень ценный урок.
Поскольку WebGL - это особенно новая технология, а холст HTML5 более известен, то, что вы хотите использовать, зависит от ваших пользователей. Если вы думаете, что ваши пользователи будут использовать мобильные устройства, я бы предложил холст HTML5, но если вам нужен лучший 2D-рендеринг, я бы использовал WebGL. Итак, что вы могли бы сделать, это использовать для мобильного рендеринга с HTML5, иначе, если они находятся на платформе, поддерживающей WebGL.
Например:
if (window.WebGLRenderingContext) {
webGLcanvasApp()
} else if( /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ) {
html5CanvasAppFMobile()
} else {
html5CanvasApp()
}
Источники: Как
правильно определить поддержку WebGL?
Как лучше всего обнаружить мобильное устройство в jQuery?
WebGL невозможно использовать без графического процессора.
Эта зависимость от оборудования не является большой проблемой, потому что большинство систем имеют графические процессоры, но если архитектуры графических процессоров или процессоров когда-либо будут развиваться, сохранение содержимого webgl путем эмуляции может оказаться сложной задачей. Запускать его на старых (виртуализированных) компьютерах проблематично.
Но «Canvas vs WebGL» не обязательно должен быть двоичным выбором. На самом деле я предпочитаю использовать webgl для эффектов, а остальное делаю на холсте. Когда я запускаю его на виртуальной машине, он по-прежнему работает хорошо и быстро, только без эффектов.