![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
всем привет.
алгоритм игры, требует создание огромного кол-ва временных отсчетов(таймеров). т.е. некоторое событие в игре, к примеру, создает выдержку времени в 5 сек, по истечении которой, создатель этой выдержки, получит уведомление. но, т.к. игр одновременно выполняющихся могут быть тысячи, то и выдержек времени на одно событие тоже нужно тысячи. создавать deadline_timer на каждую выдержку не разумно. все подобные отсчеты, синхронизируются единым источником. квант времени - 1 сек. первое что мне пришло в моцг, это некий map, ключем в котором будет интервал, а значением - некоторый объект, содержащий в себе boost::signals2::signal(на который подписываются создатели интервалов), и значение интервала уменьшающееся при каждом тике системных часов. при достижении нуля будет испущен сигнал, который оповестит об окончании интервала подписчиков. но данный способ не подходит потому что, отсчет для каждого создателя интервалов, должен начинаться с момента создания интервала. т.е. как бы намек на то, что создание объектов должно происходить по двум критериям: 1)текущему времени, 2)требуемому интервалу. т.е., к примеру, если в течении одной секунды поступит три запросов на создание интервалов длительностью в 5, 5, 15 секунд, то будет создано два объекта, при том на первый будет подписано два создателя, на второй - один. этот способ решает проблему тысяч объектов... но что-то в нем не то... пока что не могу понять что, и на###кодить зря, тоже не хочется. что скажите по этому поводу? возможно есть иные варианты? спасибо. Добавлено через 9 минут и 17 секунд
Это сообщение отредактировал(а) boostcoder - 16.10.2011, 10:14 |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
Up.
интервалов бывает два типа: 1. единажды испускаемые. 2. постоянно испускаемые. для первых, нужно еще продумать способ удаления из карты. Добавлено через 4 минуты и 1 секунду Up. вообще-то, для первых и вторых, нужно две карты |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
максимально возможный интервал известен? или он может быть любым?
-------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
вообще, интервалы могут быть следующими:
5 сек. 15 сек. 5 мин. 15 мин. Добавлено @ 11:02 Up. Это сообщение отредактировал(а) boostcoder - 16.10.2011, 11:08 |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
тогда предлагаю заюзать массив размером
72 * 3600 элементов и переменную, содержащую индекс в массиве элемент с этим индексом обрабатывается через 1 сек. (при след. срабатывании таймера) каждый тик увеличивает индекс на 1 таким образом за О(1) на каждом тике мы точно знаем, какие обработчики вызвать постоянно испускаемые реализуются просто: достаем слот из array[i] и помещаем в array[i + K], K - интервал срабатывания (может быть отрицательным из-за цикличности массива и текущего индекса) -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
поправил. более длительные интервалы не относятся к этой задаче. ими занимается планировщик.
|
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
boostcoder,
какие у моего способа недостатки? -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
не вижу пока недостатков. думаю над реализацией. |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
если пустоты MAKCim массива в варианте слишком большие но и не хочется терять в точности можно объеденить этот вариант с вашим.. т.е. сажать группу близких интервалов в один элемнт таблицы.. и когда к ним уже подойдет очередь декрементировать до вызова.. |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
72 * 3600 * 8 = ~2M т. е. я не думаю, что тут оверхед по памяти -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
я бы сделал мультимап, и ключом не интервал, а время. На одно время может быть назначено несколько событий. Один таймер, приходя в процедцру обработки каждую секунду, обрабатывает начало мультимапа, и выполняет события, для которых настало время. Мультимап отсортирован по времени, поэтому, все события для которых настало время, расположены в начале, посему обрабатывать мультимап долго не придется. Событий может естественно и не быть (если первый элемент указывает в будущее) |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
||||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
если все равно сортированный, то чем просто вектор/очередь не подходит ? |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
||||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
хотя немного не такой алгоритм...
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |