Скорость и оптимизация (вопросы) (2) - Проблема - решение. GML и прочее. - Разработка игр на Game Maker (Simple Mode) - Форум Game Maker. Разработка игр.
Здравствуй Гость | Перейти на сайт

Главная | Форум | Регистрация | Войти
gmaker.net ;) [ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 2 из 4«1234»
Форум Game Maker. Разработка игр. » Разработка игр на Game Maker (Simple Mode) » Проблема - решение. GML и прочее. » Скорость и оптимизация (вопросы) (Здесь вам ответят какой способ решения оптимален)
Скорость и оптимизация (вопросы)
WertyXBOCT Дата: Воскресенье, 31.01.2010, 19:53 | Сообщение # 21
Каждый 5й пост мой
Группа: Страж
Сообщений: 2467
Статус: Offline
Ninja, спасибо! Значит нужно заняться переводом из ds_map в ds_list smile


Blog:www.WeslomPo.ru
mailto: i@weslompo.ru
 
NewStrannik Дата: Воскресенье, 31.01.2010, 22:11 | Сообщение # 22
Всех уже задолбал
Группа: Проверенные
Сообщений: 808
Статус: Offline
Только в словарях поиск, потому что там ключ может быть любым числом и строкой (зато удобно хранить, к примеру, <ник>--<пароль>); в списках по индексу не совсем поиск, по сути простой перебор до n-го элемента (указатели же); в массиве вообще нету поиска, прямиком обращается к памяти!..
В общем, употребление того или иного представления данных зависит от ситуации!
Делайте выводы. xD


Сообщение отредактировал NewStrannik - Воскресенье, 31.01.2010, 22:13
 
Ninja Дата: Воскресенье, 31.01.2010, 22:25 | Сообщение # 23
Хоть палкой гони
Группа: Проверенные
Сообщений: 683
Статус: Offline
NewStrannik, интересно, почему поиск в ds_map такой медленный, почти в 2 раза медленней списков, из-за чего ds_map так тормозно работает?


Oh, my God! You kill Kenny! You bastard!
 
NewStrannik Дата: Воскресенье, 31.01.2010, 22:47 | Сообщение # 24
Всех уже задолбал
Группа: Проверенные
Сообщений: 808
Статус: Offline
Я провёл тесты и у меня это получилось:
ds_map_find_value(a, val) -- ~770
ds_list_find_index(a, val) -- ~925
При чём я не проверял типа такого: ds_list_find_value(a, ds_list_find_index(a, val)+1)...
Снова повторюсь: всё зависит от ситуации.


Сообщение отредактировал NewStrannik - Воскресенье, 31.01.2010, 22:48
 
Ninja Дата: Воскресенье, 31.01.2010, 22:51 | Сообщение # 25
Хоть палкой гони
Группа: Проверенные
Сообщений: 683
Статус: Offline
так а всетаки почему медленнее работает? поиск в списке должен намного больше времени занимать, чем в картах


Oh, my God! You kill Kenny! You bastard!
 
NewStrannik Дата: Воскресенье, 31.01.2010, 22:52 | Сообщение # 26
Всех уже задолбал
Группа: Проверенные
Сообщений: 808
Статус: Offline
Ой, забыл написать, что у меня не FPS, а мс, т.е. задержка. Извини...


Сообщение отредактировал NewStrannik - Воскресенье, 31.01.2010, 22:52
 
WertyXBOCT Дата: Понедельник, 01.02.2010, 11:59 | Сообщение # 27
Каждый 5й пост мой
Группа: Страж
Сообщений: 2467
Статус: Offline
Ninja, поиск там осуществляется по текстовой строке(сравнение), а в списке переход по указателю на определенную позицию. В случае мапа - перебор + сравнение строк, а в случае списка просто перебор, и может быть, сравнение чисел.


Blog:www.WeslomPo.ru
mailto: i@weslompo.ru
 
SpectruM Дата: Понедельник, 15.02.2010, 16:52 | Сообщение # 28
Болтун
Группа: Проверенные
Сообщений: 216
Статус: Offline
Всем привет!
Углубляясь в изучения ГМЛ, назрел такой вот вопрос оптимизации.
Скорость комнаты 300

Задача: Поиск ближайшего объекта, отвечающего нужным параметрам (столкновение с блоком) т.е. существуют одинаковые объекты, среди которых необходимо найти ближайший, сталкивающийся с блоком.

У меня есть 2 варианта:
Первый - при столкновении объекта с блоком менять одну переменную, потом в объекте, которых их ищет писать код наподобие:
(Этот вариант нашел на форуме, предложенный Maverick)

Code
var ins;  
repeat(instance_number(o_obj))  
{  
ins = instance_nearest(x,y,o_obj)  
if ins.blablabla... //проверка параметров  
then break else instance_deactivate_object(ins)  
}  
instance_activate_all()

Либо при столкновении объекта с блоком создавать пустой объект, который будет двигаться вместе с создавшим объектом, и искать уже эти пустые объекты:
(мой вариант)

Code

o_obj:
Create:
sozd = 0

collision:(blok)//событие столкновения с объектом БЛОК
if distance_to_object(o_obj_2)>2 then//Если не создан объект  
{
sozd = 1
}

step:
if sozd = 1 then
{
instance_create(x,y,o_obj_2)
sozd = 0
}

If distance_to_object(blok)>0 then//когда отходит от блока
{
instance_nearest(x,y,o_obj_2).death = 1//объект уничтожается
}

o_obj_2:
Create:
ins = instance_nearest(x,y,o_obj)
death = 0

step:
move_tovards_point(ins.x,ins.y,2)//двигается за объектом который создал
if death = 1 then
{
instance_destroy()
}

Надеюсь, объяснил понятно. Вопрос в том, какой вариант производительнее. При скорости комнаты в 300 и учитывая, что искать нужные объекты будет тоже не 1 объект, а многие. ТО есть что тот что тот вариант будет обрабатываться много раз.
Обьа способа рабочие, нужно лишь найти менее ресурсоемкий
Заранее спасибо!


"Мне снилось, что жизнь прекрасна. Неужто сон мой был туманной ложью?" - Э.С. Хупер

мой мега-сайт: www.spectrum.at.ua
 
YemSalat Дата: Понедельник, 15.02.2010, 17:13 | Сообщение # 29
Хрен заткнешь
Группа: Проверенные
Сообщений: 385
Статус: Offline
Думаю первый вариант будет работать быстрее т.к. в нем не создаются новые объекты и меньше проверок if


Мои игры:
LaLaLaLAMA - игра не про Ламу
GoMommy! - Invaders Must Die !!
[Caption Game] - игра в заголовке
CombatForce - долгожданный релиз
А мою аватарку можно поменять
 
SpectruM Дата: Четверг, 18.02.2010, 18:54 | Сообщение # 30
Болтун
Группа: Проверенные
Сообщений: 216
Статус: Offline
Я тоже так думаю, но!
Если такую проверку необходимо проводить в нескольких объектах, и если условие выполняется хотя-бы у одного проверяемого объекта, то все нормально. Но если объектов, отвечающих параметру "if ins.blablabla... //проверка параметров" в данный момент нет (ни один не соприкасается с блоком), то начинаются ужасные тормоза.(ФПС на скорости комнаты 300 приближается к 100, иногда меньше)


"Мне снилось, что жизнь прекрасна. Неужто сон мой был туманной ложью?" - Э.С. Хупер

мой мега-сайт: www.spectrum.at.ua
 
NewStrannik Дата: Четверг, 18.02.2010, 21:20 | Сообщение # 31
Всех уже задолбал
Группа: Проверенные
Сообщений: 808
Статус: Offline
Может какой-нибудь пример, где скорость комнаты так падает, покажешь, а?)
 
YemSalat Дата: Пятница, 19.02.2010, 10:15 | Сообщение # 32
Хрен заткнешь
Группа: Проверенные
Сообщений: 385
Статус: Offline
SpectruM, при такой скорости глупо проверять это каждый степ, как минимум каждые 10 степов - и тормозов не будет


Мои игры:
LaLaLaLAMA - игра не про Ламу
GoMommy! - Invaders Must Die !!
[Caption Game] - игра в заголовке
CombatForce - долгожданный релиз
А мою аватарку можно поменять
 
SpectruM Дата: Пятница, 19.02.2010, 11:47 | Сообщение # 33
Болтун
Группа: Проверенные
Сообщений: 216
Статус: Offline
Quote (NewStrannik)
Может какой-нибудь пример, где скорость комнаты так падает, покажешь, а?)

Скоро закончу проект, тогда покажу (исходник выложу)
Хотя, если получится
Quote (YemSalat)
при такой скорости глупо проверять это каждый степ, как минимум каждые 10 степов - и тормозов не будет
то и не увидите.

Добавлено (19.02.2010, 11:47)
---------------------------------------------
Попробовал - реально помогло! Спасибо за подсказку, как-то не пришло в голову!
В любом случае сам по себе вопрос, думаю, был решен еще раньше - первый способ оптимальнее. Намного более удобно читаем (и применяем), не создается лишних объектов, его легче править. Работает быстрее. Большое спасибо!



"Мне снилось, что жизнь прекрасна. Неужто сон мой был туманной ложью?" - Э.С. Хупер

мой мега-сайт: www.spectrum.at.ua


Сообщение отредактировал SpectruM - Пятница, 19.02.2010, 11:45
 
VIRTUS Дата: Суббота, 20.02.2010, 19:49 | Сообщение # 34
Болтун
Группа: Пользователь
Сообщений: 207
Статус: Offline
Все не прочел. Возможно уже было. Сделать ограничитель некоторых объектов. Типо ограничение гильз или крови. ставишь ограничитель 100 и если на мапе, например крови, >100 то удаляем самую первую. Надеюсь понятно.
Вот и не пиши, раз не прочел, твое сообщение не относится к теме. Флуд. SRes
 
Bercut Дата: Среда, 14.07.2010, 23:39 | Сообщение # 35
Болтун
Группа: Проверенные
Сообщений: 197
Статус: Offline
Чего лучше не делать в событии рисования?


Fast, like fire!
 
Druce Дата: Четверг, 15.07.2010, 00:20 | Сообщение # 36
Каждый 5й пост мой
Группа: Страж
Сообщений: 1543
Статус: Offline
Bercut, всячески не стоит загромждать и рисование и степ постоянными сложными вычислениями. Если все-таки надо - то между рисованием и степом вычисления лучше выносить в степ. В событии рисования нельзя рисовать на сурфейсах, хотя об этом в принципе напрямую написано в справке. Постарайся избавить рисования от частого пересчета коэффициентов и координат, которые обновляются не каждый шаг, их можно пересчитывать в том событии, в котором они обновляются. В любом случае надо быть аккуратным с рисованием длинных всяких примитивов циклами.
И еще совет - если тебе необходимо регулярно обновлять например ИИ, а это обычно кушает много ресурсов, то сделай обновление периодическим, например через алярм зацикленный через каждые 5 шагов. Причем если у тебя много ботов, то в создании каждому лучше выставлять алярм не на 5, а на random(5), тогда обновления ботов будут происходить несинхронно, в разные шаги, соответственно пиковая нагрузка на вычисления будет в каждый момент меньше.


druce.ucoz.ru|andrewsweekly.livejournal.com|А OneStep тем временем мертв.
 
SRes Дата: Четверг, 15.07.2010, 07:38 | Сообщение # 37
Каждый 5й пост мой
Группа: Страж
Сообщений: 2512
Статус: Offline
Лучше использовать choose( 2, 3, 4, 5, 6); Ибо рандом, вроде, выдает ноль и дробные числа.


Velociped Inc.
 
Druce Дата: Четверг, 15.07.2010, 15:25 | Сообщение # 38
Каждый 5й пост мой
Группа: Страж
Сообщений: 1543
Статус: Offline
SRes, ну поскольку алярм - это встроенная переменная, то гм сам ее округляет как ему надо. И в итоге все рвно проверки получаются равномерно распределенными по времени.


druce.ucoz.ru|andrewsweekly.livejournal.com|А OneStep тем временем мертв.
 
SRes Дата: Четверг, 15.07.2010, 16:12 | Сообщение # 39
Каждый 5й пост мой
Группа: Страж
Сообщений: 2512
Статус: Offline
Ты не учел то, что результат может быть 0.


Velociped Inc.
 
WertyXBOCT Дата: Четверг, 15.07.2010, 16:25 | Сообщение # 40
Каждый 5й пост мой
Группа: Страж
Сообщений: 2467
Статус: Offline
Ты не учел, что алярм, когда выключен равен -1.
А вообще, пойду ка я проверю, сработает ли алярм при нуле?

Добавлено (15.07.2010, 16:25)
---------------------------------------------
repeat(1000000) if random(10)=0 show_message('****!'); не выдал ниодного сообщения.
И да, неким опытным путем, я выяснил, что алярму нужно значение равное или большее чем 0.5



Blog:www.WeslomPo.ru
mailto: i@weslompo.ru


Сообщение отредактировал WertyXBOCT - Четверг, 15.07.2010, 16:18
 
Форум Game Maker. Разработка игр. » Разработка игр на Game Maker (Simple Mode) » Проблема - решение. GML и прочее. » Скорость и оптимизация (вопросы) (Здесь вам ответят какой способ решения оптимален)
Страница 2 из 4«1234»
Поиск:



Сообщество Gmaker.SU 2005-2012
Используются технологии uCoz
Простой вход