Разбить сцену на несколько холстов или перерисовать? - PullRequest
2 голосов
/ 05 октября 2011

Намерение создать игру на основе холста в javascript. Я стою перед выбором:

Должен ли я с точки зрения производительности хранить все происходящее на экране на одном холсте (все движущиеся персонажи, спрайты) и перерисовывать его с постоянной скоростью, скажем, 60 кадров в секунду, или я должен разбить сцену на несколько меньших холстов, таким образом устранение необходимости избыточной перерисовки сцены? Я мог бы даже создать отдельные элементы холста для конечностей персонажей, а затем сделать большую часть анимации, просто манипулируя CSS данного элемента холста (вращение, позиционирование, непрозрачность).

Для меня последнее звучит более правдоподобно и проще для реализации, но разве оно быстрее? Кроме того, разве я не должен использовать SVG, хранить символы и спрайты как элементы внутри него и напрямую манипулировать их свойствами XML и CSS?

Итак, что, по вашему мнению, является наиболее подходящим решением для сцены с несколькими спрайтами и персонажами:

  • Один объект холста перерисовывается вручную (и расточительно) со скоростью FPS
  • Несколько элементов холста, более разумно перерисованных вручную
  • Документ структурированной векторной графики, такой как SVG / VML, управляемый через DOM

В основном меня беспокоят различия в производительности, но разборчивость логического кода также представляет интерес (я, уже работая с canvas ранее, например, вполне уверен, что функция перерисовки для всего canvas будет одной трудно поддерживаемый зверь скрипта).

Ответы [ 2 ]

1 голос
/ 05 октября 2011

Манипулирование DOM медленное по сравнению с операциями холста с GPU-ускорением, поэтому я бы держался подальше от SVG и VML.

Что касается структурирования кода холста, то, конечно, не имеет смысла (особенно по соображениям производительности) очищать и перерисовывать весь холст, потому что игрок перемещал или выполнял действие. Исходя из вашего описания здесь, я предполагаю, что ваша игра будет 2D. Эти типы игр очень хорошо подходят для многоуровневой игры, если вы не делаете что-то довольно сложное, например Paper Mario. Вы должны смотреть на проблему с объектно-ориентированной точки зрения и при необходимости инкапсулировать свои процедуры рисования и объекты.

Например, создайте объект игрока, который поддерживает небольшой холст, представляющий персонажа. Вся логика, необходимая для поддержания состояния персонажа, хранится внутри объекта, и любые изменения, вносимые в него, не должны беспокоиться о других компонентах визуального представления игры. Аналогично, сделайте то же самое для фона, пользовательского интерфейса и всего, что вы можете абстрагировать в слой (в пределах разумного). Например, если вы играете в параллакс, у вас может быть слой foreground, background, character и user interface.

В конечном итоге вам нужно будет поддерживать состояние различных компонентов в вашей игре по отдельности. Анимации игроков, перемещение фоновых облаков, раскачивание деревьев и т. Д. Будут управляться соответствующими объектами. Поскольку у вас уже будет такой тип структуры кода, имеет смысл просто поддерживать основные компоненты на отдельных элементах canvas и объединять их вместе по мере необходимости для повышения производительности. Если персонаж перемещается в нижнем левом углу сцены со статическим фоном, вам не нужно повторно рисовать верхний правый угол (или 95% сцены, если на то пошло). Если вы рассматриваете возможности полноэкранного режима, это определенно является проблемой производительности.

1 голос
/ 05 октября 2011

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

Нарисуйте их все на холсте с фиксированной скоростью.Вот как это делается.Если вы начинаете создавать холст для каждой конечности и элемента и манипулировать ими с помощью CSS, вы теряете потенциал холста.Можно также просто использовать изображения.Вот как они сделали это до холста.Это проблема, которую должен был решить холст.

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

...