Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
DeadRipper
64 / 70 / 3
Регистрация: 25.06.2009
Сообщений: 244
#1

милионный цикл) - C++

17.02.2010, 15:54. Просмотров 328. Ответов 5
Метки нет (Все метки)

создаю свою игру, она тайловая, тайлы размером 16 на 16, размер всей карты 1050x1050 тайлов
есть 1000 монстров и 1000 охотников, которые равномерно распределены по всей площади карты,и двигаются в случайных направлениях раз в полсекунды(несинхронизированно),
у каждого монстра и охотника есть свой радиус обзора и естественно координаты(в тайлах), нужно сделать так чтобы при приближении охотника к любому монстру на расстояние обзора он получал его UID, и наоборот - чтобы и те и те могли напасть первыми;

делаю так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
struct Hunter
{
DWORD UID;
USHORT x;
USHORT y;
DWORD targetUid;
USHORT vradius;
//...
}
 
struct Mob
{
DWORD UID;
USHORT x;
USHORT y;
DWORD targetUid;
USHORT vradius;
//...
}
 
Hunter hunter[1000];
Mob mob[1000];
 
void MainLoop()
{
 
//Оценка расстояния для охотников
 
for(DWORD a=0;a<1000;a++)
{
for(DWORD b=0;b<1000;b++)
{
 
//Range вычисляет расстояние между двумя точками
 
if(Range(hunter[a].x,hunter[a].y,mob[b].x,mob[b].y) <= hunter[a].vradius)
{
hunter[a].target=mob[b].UID;
}
 
}
}
 
//Оценка расстояния для монстров
 
for(DWORD a=0;a<1000;a++)
{
for(DWORD b=0;b<1000;b++)
{
 
if(Range(mob[a].x,mob[a].y,hunter[b].x,hunter[b].y) <= mob[a].vradius)
{
mob[a].target=hunter[b].UID;
}
 
}
}
 
}
выходит два цикла по миллиону итераций, в итоге игра сбивается со своей частоты синхронизации, которая составляет всего 20 раз в секунду.
подскажите пожалуйста, может быть есть способ попроще, без перечисления всех действующих лиц, или хотя бы как снизить нагрузку, или каким ни будь образом вынести этот фрагмент из главного цикла MainLoop?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.02.2010, 15:54     милионный цикл)
Посмотрите здесь:

цикл for C++
C++ Цикл С++
Цикл с++ C++
C++ цикл do - while
Цикл For и While C++
C++ Цикл
Цикл Do while в For C++
Цикл for() C++
C++ Цикл while
цикл for C++
цикл do while C++
Цикл While C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
insideone
Модератор
Автор FAQ
3635 / 913 / 48
Регистрация: 10.01.2010
Сообщений: 2,460
17.02.2010, 16:16     милионный цикл) #2
Может стоит хранить эту информацию в самой карте? Тогда все упрощается. Вы проходите по всем клеткам, если там охотник то делаете просмотр округи (нарисуйте на бумаге, так будет понятнее как сделать такой алгоритм), то же самое для монстра. Чтобы не делать доп. цикл можно делать прямо в рендере (т.к. все равно там же цикл прохода по всей карте)
DeadRipper
64 / 70 / 3
Регистрация: 25.06.2009
Сообщений: 244
17.02.2010, 16:24  [ТС]     милионный цикл) #3
тайлов тоже за миллион)

"цикл можно делать прямо в рендере (т.к. все равно там же цикл прохода по всей карте) "
но это, думаю, точно решит все проблемы, огромное спасибо!
insideone
Модератор
Автор FAQ
3635 / 913 / 48
Регистрация: 10.01.2010
Сообщений: 2,460
17.02.2010, 17:41     милионный цикл) #4
Да не за что, просто у меня сейчас подобная ситуация - надо рисовать много частиц, но перед этим нужно обновить их позиции. Получается два цикла, а я думаю сделать один) Прорисовался - обновился - следующий! Миллион конечно много, тут остается оптимизировать расчеты, смотрите как получится)
DeadRipper
64 / 70 / 3
Регистрация: 25.06.2009
Сообщений: 244
17.02.2010, 18:02  [ТС]     милионный цикл) #5
Мне еще посоветовали запустить другой поток для обработки, может быть и тебе поможет))

да, миллион многовато, но все сводится к ORPG, а сервер должен обработать именно всех персонажей,
то есть разделить на локации и обрабатывать лишь её не получится)
insideone
Модератор
Автор FAQ
3635 / 913 / 48
Регистрация: 10.01.2010
Сообщений: 2,460
17.02.2010, 18:22     милионный цикл) #6
Цитата Сообщение от DeadRipper Посмотреть сообщение
Мне еще посоветовали запустить другой поток для обработки, может быть и тебе поможет))
Хм, да... это хорошее решение, однако у меня не так много частиц (5-10к) и заморачиваться параллельным программированием не хочется (к тому же у всех ли игроков многоядерные машинки?)

А можно кстати строить двусвязанный список кто щас где, тогда проход будет только по конкретным особям По крайне мере мне так подумалось...
Yandex
Объявления
17.02.2010, 18:22     милионный цикл)
Ответ Создать тему
Опции темы

Текущее время: 00:21. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru