Показать сообщение отдельно
Старый 16.09.2007, 19:30   #29
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Re: Увеличиваем производительность игры или как убить лишние коллизии. Советы новичкам.

хорошая идея.
сетка допустим из 20 на 20 ячеек.
перввм проходом просто узнаеш максимальные и минимальные координаты по обои осям, и запихиваеш в эту область сетку.
один угол (минимальные координаты в котором) береш за смещение.
пример:
сетка находится тут: (-20,-20)(180,180)
смещение dx = -20
смещение dy = -20
размер сетки sx 180 - (-20) =200 ; asx=1/sx;
размер сетки sy 180 - (-20) =200 ; asy=1/sy;
потом смотриш на сферу, допустим у нее координаты 50, 120
смотриш i = sphere.x-dx * asx * gridsize (размер сетки ето (в нашем случае 20))
смотриш j = sphere.y-dy * asy * gridsize (размер сетки ето)

кстати, как создать массив
typedef std::list<TSphere*> mylist
mylist* m = new mylist[20*20 (угадайте почему?)]

как обратиться к элементу?
m[i*21+j]

вот и получаем:

m[i*21+j].push_back(sphere);

на коллизии (предположим сферы в списке sphs)
for(sphstype (тут должно быть чо то сове)::const_iterator ci=sphs.begin();ci!=sphs.end();++ci)
{
i = sphere.x-dx * asx * gridsize;
j = sphere.y-dy * asy * gridsize;
for (mylist::const_iterator mi=m[i*21+j].begin();mi!=end();++mi)
{
а проврим ка мы их на коллизии тут!
}
}

PS. Данный пост направлен не дяде Диме в первую очередь, он и сам допрет.
а вот новичкам очень рекомендую принять на вооружение, способ сильно поднимет производительность, при огромном количстве объектов.

Да! писалось все в браузере, так что на работспособность не рассчитывайте, идея вроде верная.

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