Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   www.boolean.name > Программирование игр для компьютеров > BlitzMax > FAQ и уроки

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

Знаю, что новички часто проверяют все объекты на коллизии. А ведь так не надо делать. У меня в игре (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)
Старый 09.09.2007, 07:28   #2
ABTOMAT
Ференька
 
Аватар для ABTOMAT
 
Регистрация: 25.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,442
Написано 5,269 полезных сообщений
(для 15,227 пользователей)
Re: Увеличиваем производительность игры или как убить лишние коллизии. Советы новичкам.

Молодец, аффтар! Доброе дело написал!
Это будет очень полезно новичкам.
__________________
Мои проекты:
Анальное Рабство
Зелёный Слоник
Дмитрий Маслов*
Различие**
Клюква**

* — в стадии разработки
** — в стадии проектирования
Для проектов в стадии проектирования приведены кодовые имена

(Offline)
 
Ответить с цитированием
Старый 09.09.2007, 07:30   #3
johnk
Легенда
 
Регистрация: 01.10.2006
Сообщений: 3,705
Написано 296 полезных сообщений
(для 568 пользователей)
Re: Увеличиваем производительность игры или как убить лишние коллизии. Советы новичкам.

Функцию лучше поправить на IsCollide, так по смыслу будет правильней.
(Offline)
 
Ответить с цитированием
Старый 09.09.2007, 08:23   #4
jimon
 
Сообщений: n/a
Re: Увеличиваем производительность игры или как убить лишние коллизии. Советы новичкам.

Данил
лутче напиши дяде Диме статью по определению колизии между сферами используя KD дерево ...
очень поможеж
 
Ответить с цитированием
Старый 09.09.2007, 08:38   #5
Данил
Модератор
 
Аватар для Данил
 
Регистрация: 11.07.2007
Сообщений: 2,910
Написано 686 полезных сообщений
(для 1,693 пользователей)
Re: Увеличиваем производительность игры или как убить лишние коллизии. Советы новичкам.

статья гафно? омг... хотя она для новичков.... вроде.. хз, в общем...
(Offline)
 
Ответить с цитированием
Старый 09.09.2007, 10:40   #6
tormoz
Гигант индустрии
 
Аватар для tormoz
 
Регистрация: 14.12.2005
Сообщений: 2,785
Написано 1,183 полезных сообщений
(для 4,437 пользователей)
Re: Увеличиваем производительность игры или как убить лишние коллизии. Советы новичкам.

Почему у меня никогда коллизии не тормозят ?
Может вы стратегию коллизий неправильно определяете ?
правило 1
Избегайте коллизии сфера-полигон
правило 2
Если вы используете сфера-полигон, то оптимизируйте ее:
полигональная модель должна содержать вменяемое число полигонов, если не позволяет графика, используйте так называемую "коллижн-модель" специально сделаную низкополигональную сетку, совпадающую с вашим объектом, с установленной альфой в ноль, и назначайте коллизию на нее.
правило 3
всегда удаляйте ненужные больше вам объекты: как пули, осколки. и тд.
правило 4
не вызывайте многократно функцию EntityCollided, а делайте конструкции типа:
entity=EntityCollided(en,x)
If entity
....
Endif
правило 5
Экономте код, вызывайте функции ТОЛЬКО когда это необходимо.
Например, ваш враг уже умер, зачем проверять его на попадание пули ?
Используйте типы для сущностей, и флаги состояния, который распределяют ЧТО в данный момент делать с тем или иным элементом.
__________________
(Offline)
 
Ответить с цитированием
Старый 09.09.2007, 20:55   #7
elmortem
Нуждающийся
 
Регистрация: 20.08.2007
Сообщений: 93
Написано 0 полезных сообщений
(для 0 пользователей)
Re: Увеличиваем производительность игры или как убить лишние коллизии. Советы новичкам.

Ы... (:
Игры нужно писать так, чтобы все коллизии были либо "сфера-сфера", либо "квадрат-квадрат" - и тогда всё будет шустрее некуда. (:
P.S. Извините, я несколько пьян. Но строго после ремнота. ^__^
(Offline)
 
Ответить с цитированием
Старый 11.09.2007, 18:34   #8
dimanche13
Мастер
 
Регистрация: 19.03.2007
Сообщений: 1,039
Написано 153 полезных сообщений
(для 252 пользователей)
Re: Увеличиваем производительность игры или как убить лишние коллизии. Советы новичкам.

Поздравляю, Данил! Ты изобрел еще один велосипед. Этой функции лет эдак... короче больше чем тебе.
(Offline)
 
Ответить с цитированием
Старый 11.09.2007, 18:58   #9
Данил
Модератор
 
Аватар для Данил
 
Регистрация: 11.07.2007
Сообщений: 2,910
Написано 686 полезных сообщений
(для 1,693 пользователей)
Re: Увеличиваем производительность игры или как убить лишние коллизии. Советы новичкам.

хехе.. не спорю... но почему-то в 80% примеров или исходников игр этого нет.. хехе
(Offline)
 
Ответить с цитированием
Старый 11.09.2007, 19:28   #10
ABTOMAT
Ференька
 
Аватар для ABTOMAT
 
Регистрация: 25.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,442
Написано 5,269 полезных сообщений
(для 15,227 пользователей)
Re: Увеличиваем производительность игры или как убить лишние коллизии. Советы новичкам.

Сообщение от Данил
хехе.. не спорю... но почему-то в 80% примеров или исходников игр этого нет.. хехе
Солидарен!

ИМХО далеко не все об этом знают!
Мне в свое время тоже пришлось "изобрести" дельтатайминг просто потому что никто не смог объяснить его толком.
__________________
Мои проекты:
Анальное Рабство
Зелёный Слоник
Дмитрий Маслов*
Различие**
Клюква**

* — в стадии разработки
** — в стадии проектирования
Для проектов в стадии проектирования приведены кодовые имена

(Offline)
 
Ответить с цитированием
Старый 12.09.2007, 16:39   #11
moka
.
 
Регистрация: 04.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,861 пользователей)
Re: Увеличиваем производительность игры или как убить лишние коллизии. Советы новичкам.

В моей наработке физики основанной на окружностях и линиях, это было релизовано, и производительность вырастала в 4-20 раз. Т.к. перебор 200 линий и 20 окружностей занимал 4400 (между линия-окружность и окружность-окружность) и просчёт коллизии это занимало по 500мс Поэтому я тоже сделал подобное, и это не были уже мс с 3 цифрами на такие просчёты. В прочем, тут зависит от скорости перемещения объекта тоже, и ещё от много чего.
На заметку: все современные физ двиги, такие как PhysX, Bullet, Havok, Newton и другие используют эту систему. Так что мы не изобретаем новое, мы только оптимизируем работу кода и алгоритмов, добиваясь большей производительности.

В общем Данил, ты больно писимистичничаешь, т.к. если ктото не отписался "Спасибо!", это не значит что он не прочёл твою статью, и что она не будет полезна ему Так что Спасибо что написал, многим кто об этом не подрузумевал, будет полезно узнать об этом.
(Offline)
 
Ответить с цитированием
Старый 12.09.2007, 16:56   #12
Данил
Модератор
 
Аватар для Данил
 
Регистрация: 11.07.2007
Сообщений: 2,910
Написано 686 полезных сообщений
(для 1,693 пользователей)
Re: Увеличиваем производительность игры или как убить лишние коллизии. Советы новичкам.

НЕт, с чего ты взял. Просто по некоторым камментам почему-то кажется, что говорят типа "нах я написал это, это и так все знают".. сорри
(Offline)
 
Ответить с цитированием
Старый 13.09.2007, 09:42   #13
elmortem
Нуждающийся
 
Регистрация: 20.08.2007
Сообщений: 93
Написано 0 полезных сообщений
(для 0 пользователей)
Re: Увеличиваем производительность игры или как убить лишние коллизии. Советы новичкам.

Данил
Да нет, всё правильно. В разделе ФАК - это очень полезная информация. Мне кажется "правильный новичёк" сказал бы тебе большое спасибо.
(Offline)
 
Ответить с цитированием
Старый 13.09.2007, 10:09   #14
IGR
Blitz's Shame !!
 
Регистрация: 31.03.2007
Сообщений: 3,639
Написано 832 полезных сообщений
(для 2,012 пользователей)
Re: Увеличиваем производительность игры или как убить лишние коллизии. Советы новичкам.

правильный новичёк
как это ??

я думаю каждый кому поможет это статья скажет спасибо !!
(Offline)
 
Ответить с цитированием
Старый 13.09.2007, 14:15   #15
elmortem
Нуждающийся
 
Регистрация: 20.08.2007
Сообщений: 93
Написано 0 полезных сообщений
(для 0 пользователей)
Re: Увеличиваем производительность игры или как убить лишние коллизии. Советы новичкам.

IGR
Это означает новичка, который умеет учится на чужих советах и вместо изобретения велосипеда сначала тщательно данные советы собирает, а лишь затем начинает осторожно применять.
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выкладываем советы zheland BlitzMax 17 19.09.2008 07:01
производительность smersh 3D-программирование 5 20.05.2007 09:02
Помогите убить баг... Raiter 2D-программирование 10 07.04.2007 18:07
Цвет. (Советы и ИМХО) moka Создание текстур 0 16.01.2007 05:43
полезные советы jimon Болтовня 28 23.11.2005 18:31


Часовой пояс GMT +1, время: 21:24.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com