Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> задача на таймеры, (хз как еще ее назвать) 
V
    Опции темы
boostcoder
Дата 16.10.2011, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



всем привет.

алгоритм игры, требует создание огромного кол-ва временных отсчетов(таймеров).
т.е. некоторое событие в игре, к примеру, создает выдержку времени в 5 сек, по истечении которой, создатель этой выдержки, получит уведомление. но, т.к. игр одновременно выполняющихся могут быть тысячи, то и выдержек времени на одно событие тоже нужно тысячи. создавать deadline_timer на каждую выдержку не разумно.
все подобные отсчеты, синхронизируются единым источником. квант времени - 1 сек.

первое что мне пришло в моцг, это некий map, ключем в котором будет интервал, а значением - некоторый объект, содержащий в себе boost::signals2::signal(на который подписываются создатели интервалов), и значение интервала уменьшающееся при каждом тике системных часов. при достижении нуля будет испущен сигнал, который оповестит об окончании интервала подписчиков.
но данный способ не подходит потому что, отсчет для каждого создателя интервалов, должен начинаться с момента создания интервала. т.е. как бы намек на то, что создание объектов должно происходить по двум критериям: 1)текущему времени, 2)требуемому интервалу.
т.е., к примеру, если в течении одной секунды поступит три запросов на создание интервалов длительностью в 5, 5, 15 секунд, то будет создано два объекта, при том на первый будет подписано два создателя, на второй - один. этот способ решает проблему тысяч объектов... но что-то в нем не то... пока что не могу понять что, и на###кодить зря, тоже не хочется.

что скажите по этому поводу?
возможно есть иные варианты?

спасибо.

Добавлено через 9 минут и 17 секунд
Код


struct object {
   boost::signals2::signal<...> signal;
   std::time_t interval;
   
   object(std::time_t interval)
      :interval(interval)
   {}

   void tick(std::time_t time) {
      if ( 0 == interval-- ) {
         signal(time);
      }
   }

};

std::map<std::time_t, std::map<std::time_t, object>> map;

...


void create_timeout(std::time_t interval, slot_type slot) {
   map[std::time(0)][interval].signal.connect(slot);
}


Это сообщение отредактировал(а) boostcoder - 16.10.2011, 10:14
PM WWW   Вверх
boostcoder
Дата 16.10.2011, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Up.
интервалов бывает два типа:
1. единажды испускаемые.
2. постоянно испускаемые.

для первых, нужно еще продумать способ удаления из карты.

Добавлено через 4 минуты и 1 секунду
Up.
вообще-то, для первых и вторых, нужно две карты smile 
PM WWW   Вверх
MAKCim
Дата 16.10.2011, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



максимально возможный интервал известен? или он может быть любым?


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
boostcoder
Дата 16.10.2011, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



вообще, интервалы могут быть следующими:
5 сек.
15 сек.
5 мин.
15 мин.

Добавлено @ 11:02
Up.

Это сообщение отредактировал(а) boostcoder - 16.10.2011, 11:08
PM WWW   Вверх
MAKCim
Дата 16.10.2011, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



тогда предлагаю заюзать массив размером
72 * 3600 элементов
и переменную, содержащую индекс в массиве
элемент с этим индексом обрабатывается через 1 сек. (при след. срабатывании таймера)
каждый тик увеличивает индекс на 1
таким образом за О(1) на каждом тике мы точно знаем, какие обработчики вызвать

постоянно испускаемые реализуются просто: достаем слот из array[i] и помещаем в array[i + K], K - интервал срабатывания (может быть отрицательным из-за цикличности массива и текущего индекса)


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
boostcoder
Дата 16.10.2011, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



поправил. более длительные интервалы не относятся к этой задаче. ими занимается планировщик.
PM WWW   Вверх
MAKCim
Дата 16.10.2011, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



boostcoder, 
какие у моего способа недостатки?


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
boostcoder
Дата 16.10.2011, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(MAKCim @  16.10.2011,  11:13 Найти цитируемый пост)
какие у моего способа недостатки?

не вижу пока недостатков. думаю над реализацией.
PM WWW   Вверх
mes
Дата 16.10.2011, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  16.10.2011,  10:23 Найти цитируемый пост)
думаю над реализацией. 

если пустоты MAKCim массива в варианте слишком большие но и не хочется терять в точности можно объеденить этот вариант с вашим..
т.е. сажать группу близких интервалов в один элемнт таблицы.. и когда к ним уже подойдет очередь декрементировать до вызова.. 



--------------------
PM MAIL WWW   Вверх
MAKCim
Дата 16.10.2011, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(mes @  16.10.2011,  12:51 Найти цитируемый пост)
если пустоты MAKCim массива в варианте слишком большие но и не хочется терять в точности можно объеденить этот вариант с вашим..

72 * 3600 * 8 = ~2M
т. е. я не думаю, что тут оверхед по памяти


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
volatile
Дата 16.10.2011, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(boostcoder @  16.10.2011,  10:11 Найти цитируемый пост)
первое что мне пришло в моцг, это некий map, ключем в котором будет интервал, а значением - некоторый объект

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

PM MAIL   Вверх
boostcoder
Дата 16.10.2011, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(volatile @  16.10.2011,  15:07 Найти цитируемый пост)
ключом не интервал, а время

это вариант я выше тоже описал.
PM WWW   Вверх
mes
Дата 16.10.2011, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(volatile @  16.10.2011,  14:07 Найти цитируемый пост)
я бы сделал мультимап, и ключом не интервал, а время

если все равно сортированный, то чем просто вектор/очередь не подходит ?
 


--------------------
PM MAIL WWW   Вверх
volatile
Дата 16.10.2011, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(mes @  16.10.2011,  15:10 Найти цитируемый пост)
чем просто вектор/очередь не подходит ?

mes, добавлять удобней.
PM MAIL   Вверх
boostcoder
Дата 16.10.2011, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



хотя немного не такой алгоритм...
PM WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1004 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.