Pull to refresh

Comments 34

Какой ужас… Зачем вы проверяете ВСЕ клетки фона на пересечение с движущимся персонажем? ЭТО оптимизация?! Диапазон затронутых клеток находится в четыре простые формулы.
Зачем вы перерисовываете незатронутые объекты?
Зачем вы целиком перерисовываете такие большие здания со спрайтами сложной формы, если задета только небольшая их часть?
Вы же понимаете, что у вас общая площадь спрайтов для отрисовки получается сравнимая с общей площадью сцены если не больше? Где же тут оптимизация?!
Если у вас много объектов сложной формы, то разбейте пространство на ещё более мелкие квадраты, но фон и объекты храните в бОльших кратных спрайтах, находите список необходимых для обновления тайлов по формулам, перерисовываете не все тайлы, а только тех их участки, которые нужно, как и объекты на других слоях. Постройте эффективные списки или деревья объектов и тайлов с учётом слоёв.
Про кэширование я уже просто молчу — при такой структуре сцены это всё должно отрисовываться в теневые буферы и кэшироваться! Отрисовайте статичные предметы в теневой буфер и берите тайлы оттуда! Вот это будет оптимизация на технологиях 30-летней давности.
Это всё в совершенстве работало в Warcraft 1 в 1994 году, а до того — десять лет на приставках!
И вы ещё рассказываете про оптимизацию? Или это «лекция для колхозников»? Но и тогда нельзя давать таких советов и таких примеров кода!
Видимо, автору не приходилось рисовать 2d графику в те времена, когда 16 мегабайт оперативки было норм, а 3d ускорители были отдельной платой.

Прошу заметить, что за этот "движок" автор хочет ~5 тыс. для коммерческого использования. Боюсь представить какой же там остальной код.

Где вы такое видели? 5к? Движок бесплатный. А то что вы там смотрите это лишь готовые решения (изометрия физика мультиплеер) — можете создать свои на базовой версии!

Таблица недвусмысленно намекает, что это за базовую версию, но для коммерческого использования


Скриншот

image

они одинаковые — а коммерческая сделана лишь для того чтобы вы свои игры могли монтировать (или проекты) а не оправдываться перед налоговой почему сделали игру на бесплатно движке. Короче это защита только для вас. Вы же даже не знаете о чем движок уже чужие деньги считаете — не хорошо ))

Вы уж меня извините, но движок — про низкокачественные игры-однодневки, которыми и без того заполонён интернет. Aka Flash reborn 2021.
Почему-то при использовании UE4 оправдываться не придётся, а тут сразу такие проблемы. Не думаю, что хоть одна из игр подобного уровня достигнет gross revenue >$1M, так что беспокоиться про роялти смысла нет

Ну вы сравнили команду UE4 и работу одного человека. У движка нет проблем — я лишь рассказал идею обработки движений персонажа. Кому то это будет полезно кто только начинает делать игры
Игровой фон должен быть разбит на части и не являться целым изображением. Судите сами: если фон — целое изображение, то его все равно придется где-то перерисовать. И раз оно цельное, то перерисовать придется полностью, а значит, ни о какой перерисовке отдельной части CANVAS речи быть не может.

Неужели секретная техника отрисовки только части изображения утеряна в веках?


Камера в игре должна стоять. Потому что если камера движется, то и вся сцена движется, а значит, всю ее и надо перерисовать

В некоторых случаях имеет смысл использовать внеэкранный холст чуть большего размера. Или даже основной холст чуть большего размера, обрезанный через overflow: hidden.

В некоторых случаях имеет смысл использовать внеэкранный холст чуть большего размера. Или даже основной холст чуть большего размера, обрезанный через overflow: hidden.

30 лет назад использование подобного подхода в играх было абсолютной нормой. Зачем перерисовывать весь фон при его движении, когда можно просто менять смещение экранного буфера и подрисовывать края при необходимости?

Встретил в конце статьи:
Написано специально для habr.com. Копирование или иное использование материала без письменного разрешения автора запрещено.
Упс. Я уже скопировал в кеш браузера и использовал для просмотра с прочтением.
Надо было предупреждение в начало статьи ставить до перехода под кат.
И описать способ получения письменного разрешения автора.

P.S. Шутки шутками, но у Хабра есть зеркала, а также какое-то Соглашение с пунктами 4.8, 4.10 и другими.
Это было написано больше для того чтоб на чьей-то странице ВК не всплыло и ли блоге. А то таких кооператоров полно а первоисточник не стоит — тем самым люди оставляют комменты под скопированным ответа естественно не получают.
gamedev который мы заслужили.
в конце текста не хватает приписки типа «тестировалось на не разогнанном Ryzen 9 5900X».
UFO landed and left these words here
Да. игровой движок работает со скоростью 60fps. тут показан образный путь за одну секунду например. Показано именно то что даже не задевая за здание на напрямую нам надо делать расчеты не только того с кем столкнулись а и того перекрывается ли кем то площадка с которой мы столкнулись чтобы не навредить перерисовки. Ну у меня всегда объект перерисовывается целиком — способа перерисовать кусок растра с которым мы контактировали я пока не нашел. Если вы знаете как это сделать на CANVAS — буду рад услышать и применить.
UFO landed and left these words here
Спасибо за комментарий — учтем все на будущее. Попробую порезать здания тоже.
Ну у меня всегда объект перерисовывается целиком — способа перерисовать кусок растра с которым мы контактировали я пока не нашел. Если вы знаете как это сделать на CANVAS — буду рад услышать и применить.

Вы же CanvasRenderingContext2D.drawImage() используете для рисования растра на канву, верно? Он умеет это всё из коробки.
Когда-то очень давно говнокодил примитивную игру на паскале. Спрайты двигал следующим образом:
1. Запоминаем прямоугольную часть фона, на которой собираемся нарисовать спрайт;
2. Рисуем спрайт;
3. Пауза;
4. Восстанавливаем часть фона из памяти;
5. Запоминаем часть фона на новой позиции спрайта;
6. Рисуем спрайт на новой позиции…
и так далее.
При этом я тогда знать не знал, что такое слои. Тупо брал часть изображения прямо с экрана и помещал в память. Что мешает поступать аналогичным образом?
Я думаю мешает только тот момент, что я делаю mmorpg игру и там все здания будут расчленены такими вот записями в память (персонажей и движухи много будет). Боюсь это сожрет больше ресурсов чем просто все стареть и отрисовать. Для одного персонажа да это реально! Но когда много…
UFO landed and left these words here
да не критично. Всей этой оптимизацией и экономией я занялся после одной игрухи в ВК которая напрочь висела у меня н ноуте.
Какая жесть… с каких пор пара циклов с математикой нагружают комп так, что это сравнимо с отрисовкой целого экрана?
Боюсь спросить как этот движок будет А* реализовывать при таких нагрузках.
Так это 3d движок или 2d? Камера-то бесчисленное количество проекций может отображать (под любым углом в трехмерном пространстве то есть). А если тени добавить?
Я конечно понимаю, что для того, чтобы реализовать это, нужно некоторе время подумать, но всё же, где результаты замеров? Если рисовать не через canvas, а через вёрстку, то браузер будет самостоятельно определять что нужно отрисовывать, а что нет. Где сравнение с этим вариантом?
Интересно, а у канваса в браузерах есть setClip()/clipRect()?
С их помощью можно кэшировать всю большую сцену, и перерисовывать только кусок куда надо.

Ну вообще для тайлового кеша — для каждого тайла нарисовать все что внутри него, там не нужно считать зависимости, надо просто знать в каком тайле какие персонажи.


Именно так кешируют части веб-страницы в браузерах.


А применимо к таким играм, само собой разделение фона и персов, персов всех каждый кадр заново рисовать. Это привет 2012 году, тогда такое везде использовали

А в чем был смысл переименования файлов?
Чем это
file : "img/" + xy + ".gif", // путь к файлу

отличается от этого
file : "img/merged_" + xy + ".gif", // путь к файлу
Ни че не отличается — просто нумерация нужна а фотошоп может не дать нужных цифр (вдруг кто любит словами называть). Поэтому и показал как зачистить имена (так на всякий случай)

А почему отказались от готовой библиотеки, например PIXI.js? На мой взгляд неплохим решением был бы WebGL с текстурным атласом и анимацией в вершинном шейдере. Нет особого смысла в Javascript каждый кадр возиться с каждым объектом на экране, пусть этим занимается видеокарта — сегодня даже смартфоны могут железно рисовать сотни тысяч треугольников в секунду.

Sign up to leave a comment.

Articles