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

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

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

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

17.02.2010, 15:54. Просмотров 339. Ответов 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?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.02.2010, 15:54
Здравствуйте! Я подобрал для вас темы с ответами на вопрос милионный цикл) (C++):

Почему цикл на при 1 уходит в бесконечный цикл? - C++
#define _CRT_SECURE_NO_WARNINGS #include &lt;iostream&gt; #include &lt;stdio.h&gt; #include &lt;string.h&gt; int main() { int x=0, y=0,...

Цикл: цикл for вообще никак не воспринимается транслятором - C++
Пишу программу, которая производит различные действия с одномерным массивом. Возникла следующая проблема: цикл for вообще никак не...

Цикл for/Цикл while Помогите срочно пожалуйста... - C++
1.Вычислить и вывести на экран в виде таблицы значения функции F от x1 до x2 с шагом dx. где a, b и c - действительные числа. 2.Цикл...

Задание на цикл с параметром и цикл с постусловием - C++
Помогите пожалуйста написать программу с этими циклами. 1. Вычислить и напечатать таблицу значений функции Z= (e^-x)sinx для 0&lt;=x&lt;=П,...

Цикл с параметром и цикл с условием - C++
1. Составить программу вычисления суммы первых 10 непарных чисел 2. Дано числовой ряд и некоторое число &quot;епсила&quot;. Найти сумму...

заменить цикл for на цикл while - C++
#include &lt;iostream&gt; using namespace std; int main() { int N, M, sum; cout &lt;&lt; &quot;Введите число N:&quot; &lt;&lt; endl; ...

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

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

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

А можно кстати строить двусвязанный список кто щас где, тогда проход будет только по конкретным особям По крайне мере мне так подумалось...
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.02.2010, 18:22
Привет! Вот еще темы с ответами:

Изменить цикл for на цикл do-while - C++
помогите передать программу с цикла FOR в цикл DO-WHILE #include &lt;math.h&gt; #include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace...

Создать программу по всем 3 видам циклов...цикл с параметром,цикл с условием,цикл,и цикл с предусловием... - Turbo Pascal
Найти сумму чисел 1 в квадрате до 10 c квадрате...операцию возведению в степень не использовать учесть особенности получения квадратного...

Написать в турбо паскале, Цикл с параметром, Цикл, с постусловием, и с предусловием пожалуйста - Turbo Pascal

Как реализовать бесконечный цикл While, но чтобы этот цикл не грузил процессор? - Visual C++
Допустим есть цикл: while (1) { ... } Как сделать так, чтобы бесконечный цикл не грузил процессор. Избавиться от...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
17.02.2010, 18:22
Ответ Создать тему
Опции темы

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