bee
vjass.optimizer
offline
Опыт:
16,615Активность: |
[C++] Работа с таймерами
Всем привет, ну я в общем пишу игру на плюсах на winapi, жанра tower defense, все идет ровно, даже очень,
вот появилась проблема: хотел сделать 3-4 таймера, чтоб у каждого была своя задача: перерисовать окно, двигать мобов, например, обрабатывать снаряды. В функции, где я перебираю каждую башню и считаю время атаки, перезарядки и пр., я поступаю таким образом: раз уж у каждой вышки разный кд, я делаю глобальный таймер функцию-обработчик, где циклом у просматриваются значения всех башен, период - 1000/60 милисекунд например. В цикле отнимаю от текущего значения период таймера и делаю условие. Если текущая перезарядка <= 0, то делаем ее равной секунде например(чтоб вышка стреляля каждую секунду). Код:
в чем может быть проблема? думал, что это какой-то баг из-за того что много таймеров лол, сделал один таймер на все, тоже самое. есть мысли, что можно было бы создать таймер для обработки каждой башни, но это ... разве не тупо? идеи? //бьюсь над проблемой целый вечер и ночь, жду шарющих олдфагов например. если нужно, могу предоставить код, но там ничего особенного, direct2d интересно, встречался ли кто-нибудь с такой проблемой и может ли быть проблема не программы, а софта) ну там системный таймер сбился может быть помогите по-брацки |
25.02.2013, 07:24 | #1
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
ScorpioT1000
Работаем
online
Опыт: отключен
|
WINAPI устарел, его не используют даже сами майкрософт, поставь уже Qt или wxWidgets, а лучше перейди на C# + .NET Скорость разработки возрастет в 10 раз, я гарантирую это. |
25.02.2013, 15:11 | #2
+2/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
reALien
offline
Опыт:
29,211Активность: |
Какие именно функции ты используешь для таймера? Там ведь несколько вариантов. |
25.02.2013, 18:16 | #3
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
bee
vjass.optimizer
offline
Опыт:
16,615Активность: |
Запускаю таймер с помощью SetTimer(), отлавливаю WM_TIMER, останавливаю KillTimer()
Все примеры на msdn пишутся на winapi, почему устарел то? |
25.02.2013, 19:05 | #4
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
ScorpioT1000
Работаем
online
Опыт: отключен
|
bee, потому что .net, ты в каком году примеры эти нашел?))) |
25.02.2013, 19:13 | #5
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
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 | #6
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Hanabishi
COOL STATUS
offline
Опыт: отключен
|
Ещё скажи что пишешь с DevCpp какого-нибудь, на котором дают решать задачки студентам. |
26.02.2013, 06:05 | #7
+2/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
reALien
offline
Опыт:
29,211Активность: |
Собирался катать простыню о том, что это не самый точный отсчет времени в винапи, но, благо, кто-то уже сделал за меня: habrahabr.ru/post/83040 Думаю, разберешься с примером. |
26.02.2013, 12:13 | #8
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Toadcop
offline
Опыт:
53,013Активность: |
таймеры не нужны по сути идк. нужен луп обработки.
|
27.02.2013, 04:12 | #9
+2/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
alexprey
познающий Unity
offline
Опыт:
68,501Активность: |
|
27.02.2013, 12:50 | #10
+1/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
ScorpioT1000
Работаем
online
Опыт: отключен
|
эй, не читайте ту статью, она подразумевает скушать весь цпу на 100% даже при бездействии игры
ScorpioT1000 добавил: таймеры нужны на самом деле, они позволят гарантированно выполнять операцию через заданные промежутки времени |
27.02.2013, 13:59 | #11
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Hanabishi
COOL STATUS
offline
Опыт: отключен
|
Таймер я решал так, простенький цикл со слипом (ну 25 мс например для 40 фпс), каждый раз просто пускающий вычисления в отдельный поток, рендер пускается тоже в свой в отдельный.
Итог: сам таймер работает абсолютно точно, ибо вычисления работают отдельно, рендер отдельно. Причём рендер нужно пускать только если предыдущий завершился, т.е. при проседании получится пропуск кадров, или на игровом жаргоне "слайдшоу".
Hanabishi добавил: Хотя при таком подходе фпс будет падать в 2 раза при малейшей просадке (неуспевании потока рендера), поэтому можно организовать очередь-буфер для него, тогда всё будет куда плавнее, как в нормальных играх. |
27.02.2013, 16:30 | #12
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
ScorpioT1000
Работаем
online
Опыт: отключен
|
слип желательно должен быть нулевой - это обеспечит правильную отработку квантов относительно других процессов совсем недавно сам это открыл для себя =) раньше тоже делал 10 мс |
27.02.2013, 16:33 | #13
+1/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Hanabishi
COOL STATUS
offline
Опыт: отключен
|
ScorpioT1000, а он разве не займёт все доступное процессорное время тогда? |
27.02.2013, 16:37 | #14
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
ScorpioT1000
Работаем
online
Опыт: отключен
|
Hanabishi, неа =) он когда вызывает слип 0, он говорит менеджеру что процесс отработал свой квант, например менеджер выделил 200 микросекунд, процесс отработал 80 и вызвал слип, тогда менеджер отдает этот кусок другим программам и ставит текущий в конец очереди, или айдлу и так каждый раз но на практике конечно лучше именно таймеры, т.к. там управляемый период, а тут каждый новый апдейт может быть разная задержка |
27.02.2013, 16:56 | #15
+1/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
bee
vjass.optimizer
offline
Опыт:
16,615Активность: |
спасибо за ссылки, будем читать |
28.02.2013, 00:56 | #16
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|