Полотно чи не полотно при створенні браузерних ігор?


14

Передумови: Я маю обширний досвід розвитку, але останній раз, коли я кодував гру, був багато років тому. Мої навички JavaScript досить обмежені, і я маю намір вдосконалити їх, побудувавши просту гру - Tetris, Pac-man або щось такого рівня складності.

Питання: Мені здається, що я повинен зробити фундаментальний вибір - чи слід робити <canvas>елемент чи ні.

Маючи полотно, у мене є основні інструменти для відображення точок, ліній та більш складних речей. Імовірно, існують, або будуть, також різні рамки, які допоможуть у цьому.

Без полотна я міг би зберігати свої об’єкти на дереві DOM, як звичайна веб-сторінка, лише досить складна, з багатьма елементами, що перекриваються.

Чи один підхід кращий за інший? Вони взаємовиключні? Як мені знати, що вибрати?

Відповіді:


13

Полотно та DOM не є взаємовиключними, хоча вони досить окремі. Хорошим підходом було б зробити основну ігрову зону (наприклад, падаючі шматки в тетрісі) за допомогою Canvas, і виконати всі інтерфейси (наприклад, показ балів) з елементами DOM, які перекривають елемент полотна.

Однак, такий підхід насправді не потрібен для такої примітивної гри, як Tetris. Полотно корисне для більш досконалих графічних ефектів, але якщо вони не потрібні, дотримування DOM надасть вам ширшу сумісність; не всі браузери підтримують HTML5 Canvas.


3
Якщо чесно, працюючи над Іграми HTML5 за останній рік як щоденна робота, я б сказав, що браузер, який не підтримує Canvas, все одно недостатньо швидкий для будь-якої гідної гри, але знову ж таки, помічаючи повільніше, ніж WebKit на телефонах Android ... :(
Іво Ветцель

Дякую :) Мені мало хвилюється "підтримка браузера", до того часу, коли я навчився достатньо для цього значення, я очікую, що проблема вирішиться сама. Це в основному для розваги та навчання.
Летаріон

Я також роблю це: Сама гра малюється на полотні, тоді як графічний інтерфейс складається з частково прозорих елементів DOM зверху.
Філіп

@IvoWetzel Я почуваюсь так само ... ми працюємо над іграми на мобільних платформах, і Android майже не піддається програванню ...
Vaughan Hilts

12

Про DOM
DOM досить добре працює для 2D-школи для старих шкіл, це означає, що не застосовується обертання зображення чи масштабування. Насправді є інструменти для обох цих завдань, але ви не можете розраховувати на їхню ефективність.

Для гри ви повинні якомога менше покладатися на механізм компонування браузера, це означає використовувати position:absoluteдля розміщення об'єктів. Постарайтеся, наскільки це можливо, не створювати та знищувати об'єкти DOM весь час, якщо вам потрібна велика кількість змінних об'єктів, можливо, ви хочете встановити пул непрацюючих елементів DOM display:none, готових до відновлення при необхідності.

DOM vs canvas
З часткою ринку IE8 зменшення полотна стає все більш привабливим варіантом, для більшості ігор це, мабуть, прекрасний вибір. Але для деяких завдань DOM - це простіший інструмент для використання, ви можете використовувати деякий документообіг, якщо потрібно, ви можете вловлювати кліки безпосередньо виведеним об’єктом, легко інтегрувати смуги прокрутки.

Важко покрити різницю в продуктивності, це залежить від роботи і буде різко відрізнятися від браузера до браузера.


2
Я не думав згадувати position:absolute, це хороший момент.
поштовх

Хіба полотна GPU не прискорилася на якомусь рівні, де DOM немає?
Томас

1
@Thomas Єдине місце, де можна переконатись у прискоренні графічного процесора - webGL. (Технічно це може бути реалізовано без, але це, мабуть, не відбудеться). Перші реалізовані на платформі 2D суворі процесори були суто процесором, частина функціональних можливостей у деяких браузерах була переміщена до GPU, але не у всіх випадках із значним підвищенням продуктивності. Щодо прискорення графічного процесора DOM, вони працюють над цим, і я не бачу жодної конкретної причини, щоб це не сталося. У будь-якому випадку, в кінцевому рахунку важливо не те, як це робить браузер, але якщо він працює досить добре для ваших потреб, GPU не завжди означає швидше.
aaaaaaaaaaaa

Що ти маєш на увазі під процесором не завжди швидше? На ПК це може бути правдою, але на мобільних платформах я вважаю за краще, щоб графічний процесор робив більше рендерінгу, щоб у процесора було більше «циклів», щоб витратити на виконання логіки гри типу AI тощо. Таким чином гра може бути складнішою .
Томас

1
@Thomas Це залежить від платформи, роботи та багатьох інших речей. Old-school 2D - це в основному операції з пам'яттю, зберігання ресурсів в основній пам'яті та використання процесора для цих операцій буде працювати досить добре, також на мобільному телефоні, але спроба виконувати операції над даними, що знаходяться в пам'яті іншого процесора, є вбивцею продуктивності, тож якщо ви змішуєте операції, які не можуть бути виконані графічним процесором з операціями GPU, ви або в кінцевому підсумку відправляєте буфер назад і назад залежно від операції, або один з процесорів записує в інші пам'яті процесорів.
aaaaaaaaaaaa

6

Повністю залежить від типу гри, хоча полотно підходить "більшості" з них.

Управління DOM стає жахливим в певний момент, чим більше елементів ви отримуєте повільніше, тим більше елементів ви рухаєтеся НАДНІШКО МІЖ.

Управління замовленням на завантаження активів за допомогою елементів IMG - це ... нетривалість (перехоплення помилок у навмисно порушених протоколах на тегах зображення: D).

Хоча для ігор з переважно статичними зображеннями та низьким рахунком ефектів я все одно хотів би з DOM. Все інше, полотно - це перший вибір (вкажіть і натисніть на речі, хоча хіт-карти - це інша історія).

Полотно настільки швидко в ці дні (навіть на iPhone), навряд чи є причина, щоб не використовувати його.


Що стосується швидкості, заснованої на відео-презентації Aves Engine , коли у вас було тисячі елементів, DOM насправді швидше впорався, ніж полотно. Ви не згодні? Чи змінилося це? Я б хотів, щоб я міг знову знайти це відео ...
Летаріон

1
: Я працюю з Zynga, з хлопцем, який зробив Aves. Все змінилося за останній рік, повірте мені :)
Іво Ветцель

-1, я намагався мати ~ 100000 елементів елемента для неігрової програми, що майже нічого не вийшло. Але кілька тисяч елементів не проблематично. Це не так, як полотно буде швидко, якщо ви намалюєте на ньому багато тисяч зображень при кожному оновленні.
aaaaaaaaaaaa

@eBusiness Тоді продовжуйте впроваджувати складні замовлення на Z та 3D перетворення. Удачі в цьому :)
Іво Ветцель

4
@IvoWetzel Якщо ви хочете робити 3D, вибір полотна - це вибір. Але це не те, що говорить ваша відповідь, так що ви бачите?
aaaaaaaaaaaa

2

Якщо ви робите гру в HTML5, полотно набагато краще. Ось чому:

  1. Швидкість - Подумайте про полотно як про зображення. Ви малюєте до зображення, а потім він забуває, що ви намалювали. Це різко підвищує продуктивність порівняно з DOM або SVG. Програми DOM та SVG - це те, щоб вони відстежували кожен об'єкт, який ви розміщуєте на екрані. Це означає, що якщо у вас є великий рівень з багатьма об'єктами на екрані, особливо за межами екрану або прихованими, вони малюються і відстежуються в будь-якому разі.
  2. Особливості малювання - Хоча елементи DOM мають потужні перетворення CSS3, це ніщо в порівнянні з характеристиками полотна. Полотно може малювати будь-який об’єкт, мати потужну градієнтну підтримку, плагіни для відображення об’єктів у 3D, фільтрах тощо.
  3. Підтримка - Коли ви використовуєте DOM, коли ви хочете використовувати експериментальні функції, такі як перетворення або анімації, ви повинні використовувати префікси -moz-, -webkit-, -o- і -ms- у CSS. На полотні вам не потрібно про це турбуватися. Просто малюйте однією функцією, і ви закінчили. Ще одна перевага, пов’язана з підтримкою, - це спосіб відображення програми. Як розробник веб-сайту, відсутність стандартизації DOM між веб-переглядачами викликає у мене гайки. Фони, градієнти, перетворення тощо відображаються по-різному між браузерами, незважаючи на докладні специфікації W3C. На полотні я наткнувся лише на одну річ, яка може бути різною - фони. Коли відображається плитковий фон, деякі веб-переглядачі візьмуть "tile-x" як центр плитки в 0px на осі x, а інші вважають це лише плиткою плитки вниз.
  4. Бібліотеки та документація - Є TONS чудових бібліотек з документами для виготовлення ігор з полотном. Деякі бібліотеки: CreateJS, paper.js, fabric.js, KineticJS, libCanvas, Processing.js, PlotKit, Rekapi, PhiloGL, InfoViz Toolkit, Frame-Engine, CAKE, Raphaeljs, Tweenjs тощо. Я міг би перерахувати тонну більше, але немає сенсу.

Внизу - Анімація - Хоча є багато чудових бібліотек для анімації, я люблю анімації CSS3. Їх так легко створювати, маніпулювати та спрацьовувати. Існують різні хаки, щоб змусити анімацію CSS3 працювати з об’єктами з полотном, але я підозрюю, що більшість людей вважають за краще не використовувати цей метод.

Успіхів у вашій грі, і я сподіваюся побачити, що ви робите!


2

Якщо ви розглядаєте націлювання на мобільні браузери, зокрема Android, і гра містить будь-яку рухому графіку, уникайте DOM-анімації. Фондовий браузер в Android марний, навіть якщо це веб-кайт. Перед початком роботи перегляньте цю тему випуску Android: "Жахлива візуалізація анімації CSS3 та Javascript у браузері та веб-перегляді" .

Полотно саме по собі може не бути швидшим, але є рамки, щоб викликати апаратне прискорення для анімації полотна, наприклад, CocoonJS . На сайті є посилання на відео, яке показує підвищення продуктивності, яку ви можете досягти, використовуючи рамки (але мені не дозволяється публікувати більше двох посилань чомусь).


2

Проста відповідь: WebGL із резервним полотном.

Нюансований відповідь: Якщо у вашій грі багато тексту, накладіть текстовий шар HTML. Pixi.js - це загартований на бойовій основі дисплей з деякими корисними додатками, який добре працює для цього.


1

Пам'ятайте, що DOM розшифровується як модель об'єкта документа Ви хочете використовувати його для створення ігор лише в дуже рідкісних ситуаціях, а в більшості випадків віддайте перевагу полотні.

Навіть якщо у вашій грі є невеликі графічні вимоги, це робити в DOM буде погано; що-небудь більше, ніж тетріс, ймовірно, буде погано працювати.

У мене є приклад із реального світу: Коли я створив реалізацію гри «Життя життя Конвея», я почав із таблиці 500х500, змінюючи колір фону клітинок. У цій версії a Glider не працював зі швидкістю більше 30 кадрів в секунду, більше шаблонів призводило до ледве більше 1. У моїй полотняній версії цієї гри тепер можна плавно запускати набагато більші малюнки (населення 1000 і більше) ~ 30 кадрів в секунду.

Також це має стосуватися SVG (масштабований вектор) графіка), хоча я ніколи цього не пробував на практиці.

Редагувати : я мушу визнати, що мій приклад не дуже хороший (тому що таблиці = погані). Але головне все-таки вірно: маніпуляція DOM - це для документів. Браузер повинен шукати CSS та виділяти більше пам’яті, коли ви працюєте над елементами. Насправді немає сенсу бути швидшим, ніж полотно.


З того часу, коли DOM має низьку ефективність. Це просто не апаратне прискорення, це єдина різниця. Таблиця розміром 500х500 у фонових кольорах на комірці не є ефективною реалізацією DOM
Райнос

1
@Raynos Я помітив, що це не ефективна реалізація DOM. Немає жодного, якщо ви хочете маніпулювати пікселями.
копія

1
-1, великі столи - це вбивця продуктивності. Полотно, безумовно, кращий інструмент, якщо ви хочете маніпулювати окремими пікселями, хоча налаштування його проти такої поганої реалізації DOM дійсно робить ваш приклад безглуздим. Поза стегнами, мій найкращий знімок у виконанні DOM - це 50000 5x1 диванів із 32 різними фоновими зображеннями, обміняними за потребою.
aaaaaaaaaaaa

@eBusiness так, люди мені вже говорили. Шкода, що тоді я сам цього не зрозумів: - /
Скопіюйте

@Raynos, DOM ніколи не був швидким. Насправді одна з головних причин полотна полягає в тому, що DOM повільний. Пов'язаний: stackoverflow.com/q/6817093/632951
Pacerier
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.