Я инженер, и в настоящее время мы портируем нашу игру Red5 + Flash в приложение Node.js + Easeljs html5.
По сути: это настольная игра, а не рпг. Система слоев означает, что у нас есть несколько холстов, основанных на функциональности. Например, есть статическая фоновая сцена с изображениями. Есть слой только для таймеров.
По умолчанию весь размер холста составляет 1920x1080, при необходимости мы уменьшаем масштаб, чтобы соответствовать разрешению.
В первом подходе использовался кинетический.js, но производительность падала, когда игра становилась сложной. Затем мы переключились на мольберт, потому что уровень абстракции у него ниже, поэтому мы можем решить, как реализовать еще какую-то функцию, а не просто использовать предоставленную робастную.
Я был настроен оптимистично, но теперь он снова начинает показывать медлительность, поэтому я хочу заглянуть глубже внутрь и заняться тонкой настройкой производительности. (Конечно, в Chrome все нормально, проблема в Firefox, но игра должна без проблем работать во всех современных браузерах).
Основной слой (стадия) — карта, содержит ~30 контейнеров, в каждом сложная пользовательская фигура, ~10 изображений. Контейнеры прослушивают события мыши, такие как наведение мыши, выход, щелчок. В настоящее время, например, при наведении курсора я заполняю форму градиентом.
Каким-то образом, когда я использую кеш, например, в тутах, производительность становится еще хуже, поэтому я предполагаю, что что-то напутал.
Я собрал несколько сложных вопросов:
В описанной ситуации когда можно использовать кеш и как? Я уже пробовал кешировать при инициализации, cacheUpdate после заливки другим цветом или градиентом, затем
stage.update()
. Без влияния.Если у меня есть статический, никогда не меняющийся кеш сцены, не имеет смысла на этом слое, верно?
Что именно
stage.update()
делает? Запуск полной перерисовки слоя? В документе упоминается какой-то интеллектуальный эффект, если его изменить, а затем перерисовать.Если я хочу заполнить пользовательскую фигуру новым цветом или градиентом, я должен полностью перерисовать ее графику, а не просто использовать метод setFill, верно?
Например, в мольберте нет возможности перерисовать только контейнер, так как же мне умудриться обновить не всю сцену, а только один контейнер, который изменился? Я думал, что смогу добиться этого с помощью кеширования, кешировать все контейнеры и просто обновлять тот, который изменился, но этот способ у меня совсем не работал.
Есть ли смысл кэшировать растровые изображения? Если в контейнере есть пользовательские формы и изображения, что лучше? Кэшируйте контейнер или просто форму в контейнере.
Я нашел странный баг или, по крайней мере, интересную подсказку. Мои слои холста полностью перекрываются. На нижних слоях прослушивание при наведении мыши работает хорошо, но щелчок не на том же самом контейнере/объекте.
Как я могу произвести распространение события клика на перекрывающиеся слои, у которых есть прослушиватели кликов? Я пробовал это с простым DOM, jquery, но объекты событий были далеки от того, что хотели получить слушатели холста.
Вкратце, методы и реквизиты, которые я уже с голым успехом обыграл при попытке настройки: cache()
, updateCache()
, update()
, mouseEnabled
, snapToPixel
, clear()
, autoClear
, enableMouseOver
, useRAF
, setFPS()
.
Любой ответ, предложение, отправная точка приветствуются.
ОБНОВЛЕНИЕ:
Эта бесплатная настольная игра представляет собой стратегическую игру, так что вы сталкиваетесь с картой мира с примерно 30 территориями. Пользовательские формы — это территории, а контейнер содержит форму территории и значки, которые должны быть над территорией. Это перекрытие контейнеров минимально.
Примером события мыши является эффект наведения. Игрок перемещается по фигуре территории, после чего форма перекрашивается, изменяется размер и т. д., и появляется пузырь с подробной информацией о месте.
В принципе, максимальное количество 1-3 контейнеров может меняться одновременно (кроме фазы инициализации -> все в это время). Не только анимация и перекрашивание медленные в FF, но и задержка слушателя также высока.
Я написал обработчик изменений, поэтому я только stage.update()
отмечаю измененные этапы и этапы, на которых выполняется анимация (tweenjs).
В моем первом подходе я помещал каждое изображение в контейнер, который может понадобиться хотя бы один раз во время игры, поэтому я устанавливаю видимые флаги только для изображений (не для векторов).