XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Общение> Hard & Soft
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Закрытая тема
 
bee
vjass.optimizer
offline
Опыт: 16,615
Активность:
[C++] Работа с таймерами
Всем привет, ну я в общем пишу игру на плюсах на winapi, жанра tower defense, все идет ровно, даже очень,
вот появилась проблема: хотел сделать 3-4 таймера, чтоб у каждого была своя задача: перерисовать окно, двигать мобов, например, обрабатывать снаряды.
В функции, где я перебираю каждую башню и считаю время атаки, перезарядки и пр., я поступаю таким образом: раз уж у каждой вышки разный кд, я делаю глобальный таймер функцию-обработчик, где циклом у просматриваются значения всех башен, период - 1000/60 милисекунд например. В цикле отнимаю от текущего значения период таймера и делаю условие. Если текущая перезарядка <= 0, то делаем ее равной секунде например(чтоб вышка стреляля каждую секунду).

Код:
void _process()
{
    for(int i=0;i<g_tower_count;i++)
    {
        g_towers[i].tmp -= period;
        if(g_towers[i].tmp<=0)
        {
            g_towers[i].tmp=1000;
            // действия с башней во время выстрела
        }
    }
}
все работает,но я заметил, что башня стреляет не каждую секунду, а где-то каждые 1.2-1.5 секунды
в чем может быть проблема? думал, что это какой-то баг из-за того что много таймеров лол, сделал один таймер на все, тоже самое.
есть мысли, что можно было бы создать таймер для обработки каждой башни, но это ... разве не тупо?

идеи? //бьюсь над проблемой целый вечер и ночь, жду шарющих олдфагов например. если нужно, могу предоставить код, но там ничего особенного, direct2d
интересно, встречался ли кто-нибудь с такой проблемой и может ли быть проблема не программы, а софта) ну там системный таймер сбился может быть
помогите по-брацки
Старый 25.02.2013, 07:24
ScorpioT1000
Работаем
online
Опыт: отключен
WINAPI устарел, его не используют даже сами майкрософт, поставь уже Qt или wxWidgets, а лучше перейди на C# + .NET
Скорость разработки возрастет в 10 раз, я гарантирую это.
Старый 25.02.2013, 15:11
reALien

offline
Опыт: 29,211
Активность:
Какие именно функции ты используешь для таймера?
Там ведь несколько вариантов.
Старый 25.02.2013, 18:16
bee
vjass.optimizer
offline
Опыт: 16,615
Активность:
Запускаю таймер с помощью SetTimer(), отлавливаю WM_TIMER, останавливаю KillTimer()
Все примеры на msdn пишутся на winapi, почему устарел то?
Старый 25.02.2013, 19:05
ScorpioT1000
Работаем
online
Опыт: отключен
bee, потому что .net, ты в каком году примеры эти нашел?)))
Старый 25.02.2013, 19:13
bee
vjass.optimizer
offline
Опыт: 16,615
Активность:
ScorpioT1000, вот например, изучал direct2d здесь частично
Build date: 11/29/2012
Build date: 11/29/2012
примеры кода брал от туда

не слышал до этого момента ни про какой qt, wxWidgets
сейчас поизучаемс, но все-таки хотелось бы узнать, что делать с текущей проблемой,
ведь какая разница насколько код устарел, хотя как-то не верится вообще, что никто на нем не пишет, включая ms

update: почитал я про qt, wxWidgets. я так понял это отдельная мультиплатформенная IDE под C++,
но мне этого не нужно, возможно я рак, но я привык писать все самостоятельно, решать проблемы сам, не люблю все готовое.
есть идеи по поводу сабжа?

Отредактировано bee, 25.02.2013 в 21:49.
Старый 25.02.2013, 21:36
Hanabishi
COOL STATUS
offline
Опыт: отключен
Ещё скажи что пишешь с DevCpp какого-нибудь, на котором дают решать задачки студентам.
Старый 26.02.2013, 06:05
reALien

offline
Опыт: 29,211
Активность:
Собирался катать простыню о том, что это не самый точный отсчет времени в винапи, но, благо, кто-то уже сделал за меня: habrahabr.ru/post/83040
Думаю, разберешься с примером.
Старый 26.02.2013, 12:13
Toadcop

offline
Опыт: 53,013
Активность:
таймеры не нужны по сути идк. нужен луп обработки.
Старый 27.02.2013, 04:12
alexprey
познающий Unity
offline
Опыт: 68,501
Активность:
Старый 27.02.2013, 12:50
ScorpioT1000
Работаем
online
Опыт: отключен
эй, не читайте ту статью, она подразумевает скушать весь цпу на 100% даже при бездействии игры
ScorpioT1000 добавил:
таймеры нужны на самом деле, они позволят гарантированно выполнять операцию через заданные промежутки времени
Старый 27.02.2013, 13:59
Hanabishi
COOL STATUS
offline
Опыт: отключен
Таймер я решал так, простенький цикл со слипом (ну 25 мс например для 40 фпс), каждый раз просто пускающий вычисления в отдельный поток, рендер пускается тоже в свой в отдельный.
Итог: сам таймер работает абсолютно точно, ибо вычисления работают отдельно, рендер отдельно.
Причём рендер нужно пускать только если предыдущий завершился, т.е. при проседании получится пропуск кадров, или на игровом жаргоне "слайдшоу".
Hanabishi добавил:
Хотя при таком подходе фпс будет падать в 2 раза при малейшей просадке (неуспевании потока рендера), поэтому можно организовать очередь-буфер для него, тогда всё будет куда плавнее, как в нормальных играх.
Старый 27.02.2013, 16:30
ScorpioT1000
Работаем
online
Опыт: отключен
слип желательно должен быть нулевой - это обеспечит правильную отработку квантов относительно других процессов
совсем недавно сам это открыл для себя =) раньше тоже делал 10 мс
Старый 27.02.2013, 16:33
Hanabishi
COOL STATUS
offline
Опыт: отключен
ScorpioT1000, а он разве не займёт все доступное процессорное время тогда?
Старый 27.02.2013, 16:37
ScorpioT1000
Работаем
online
Опыт: отключен
Hanabishi, неа =) он когда вызывает слип 0, он говорит менеджеру что процесс отработал свой квант, например менеджер выделил 200 микросекунд, процесс отработал 80 и вызвал слип, тогда менеджер отдает этот кусок другим программам и ставит текущий в конец очереди, или айдлу и так каждый раз
но на практике конечно лучше именно таймеры, т.к. там управляемый период, а тут каждый новый апдейт может быть разная задержка
Старый 27.02.2013, 16:56
bee
vjass.optimizer
offline
Опыт: 16,615
Активность:
спасибо за ссылки, будем читать
Старый 28.02.2013, 00:56
Закрытая тема

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 16:10.