Показать сообщение отдельно
Старый 09.09.2007, 11:24   #1
Данил
Модератор
 
Аватар для Данил
 
Регистрация: 11.07.2007
Сообщений: 2,910
Написано 686 полезных сообщений
(для 1,694 пользователей)
Сообщение Увеличиваем производительность игры или как убить лишние коллизии. Советы новичкам.

Знаю, что новички часто проверяют все объекты на коллизии. А ведь так не надо делать. У меня в игре (Arrow – master2 … ) были тоже проверки на все объекты. И когда на карте было большое количество объектов (типо пуль, врагов, главного героя и бонусов), игра начинала зверски тормозить. Вот и пришёл к тому, что у меня в последних миссиях невозможно было играть.

Затем написал функцию, которая бы определяла, находится ли в радиусе определённом объект, или нет. То есть, если рядом с главным героем находится один враг, то только на него считается коллизия (враг захавать хочет героя). А все остальные не считаются. Следовательно, примерно уже 30 коллизий убиваем. Идём далее. Пули.. пуль может быть много на карте. Особенно, если у тебя пулемёт.

Считаем, для каждой пули едёт проверка коллизий на всех монстров. Неправильно, подставляем для каждой пули эту функцию и вуаля! если только рядом с пулей находится монстр, то считаем коллизии. Посчитайте, сколько коллизий убиваем лишних? 30 пуль – 30 монстров. 900 коллизий!!! Так и примерно увеличиваем производительность игры в несколько раз. Так же с бонусами (но тут уже меньше. Всего максимум две коллизии)

Следовательно, ставить надо ограничения функцию просчёта расстояний. Ну, конечно, не в проектах ,где 5-6 коллизий, а где их тьма. Хотя, даже ограничение и на 5 коллизий будет неплохо. Свести коллизии до двух– это класс!



[blitz]
Function IsCollide (x1#, x2# , y1# , y2# , Weight# , Height# )
If X1 > X2 -Weight And X1 < X2 +Weight And Y1 > Y1 - Height And Y1 < Y2 + Height Then Return 1 Else Return 0

End Function
[/blitz]



Так. А терь о функции. Если объект с координатам x1 и y1 находится в зоне шириной weight и высотой height b и координатами центра x2 и y2 (то бишь центр - враг.. иль чё-нить другое), то возвращаем 1. Если нет - 0

[blitz]
If IsCollide (5,5,7,7,25,25)=1 Then ....
[/blitz]

Так же можно и в блитз3д делать, для упрощения коллизий. Допустим ,если два объекта находятся близко друг к другу, то включается коллизия - иначе отключается (просто не видел, чтобы это где-нибудь было реализовано). Только в блитз3д есть функцию EntityDistance, а в блитзмаксе я не знаю ( ), по этому идёт проверка координат.

Ну, как вам статья ?
Верю тупая, но у меня вначале было куча проблем с этим.
Кстати, в функции моей возможны ошибки, хотя не знаю. Cкажите если есть. (В игре у меня это не функцией реализовано, а так просто).

Хотя всю статью можно было бы сказать так : "делайте проверку на дистанцию , друзья!" и сё... но чёт растянул я...

З.Ы. Arrow - master 2 (ссыль в подписи )
З.Ы.Ы.
(Offline)
 
Ответить с цитированием
Эти 3 пользователя(ей) сказали Спасибо Данил за это полезное сообщение:
G.A.D (09.12.2009), HolyDel (19.06.2008), Nex (07.05.2009)