1 | ||||||
таймеры31.08.2009, 15:26. Показов 4755. Ответов 11
Метки нет (Все метки)
проблема с таймарами!!!
Вот реализация 2-ух таймаров(один из них закоментирован)
как видно генерируется одно и тоже событие через каждые 5 мс, но в случае SetTimer - в справке описано что не генерирует чаще чем USER_TIMER_EVENT=10 у timeSetEvent ограничений нет(вернее оно равно 1) картинка рисуется с помощью DirectDraw но в случае SetTimer выдает (у меня) 65 кадров и fp за сек набирает столько же (загрузка цп 10%) хотя должен 1000/10=100, а в случае timeSetEvent 130 кадров и fp за сек набирает столько же (загрузка цп 70%) хотя должен 1000/2=200. В чем тут проблема и как ее решить? Как правильно организовать вывод анимации? PS: timeSetEvent - при вызове в делфи и расовании намного более сложных картинок выдавал 200 кадров и это на GDI! Файл с готовым проэктом прилагается (без Direct SDK не запустится!), добавте 2 бмп файла 0.bmp и 1.bmp все что в файле 0.bmp черным(0) будет выводится прозрачным!
0
|
31.08.2009, 15:26 | |
Ответы с готовыми решениями:
11
Таймеры Таймеры Таймеры Таймеры |
31.08.2009, 16:16 | 2 | ||||||||||
MrAndrey_ka, Обычно через SendMessage(hWnd,WM_PAINT,0,0); никто не рисует.
Попробуй так:
m_rotate - текущий угол поворота m_fRatioRotate - коэфициент поворота или скорость delta - благодаря чему анимация будет воспроизводится с одинаковой скоростью на разных ПК. а если Render будет слишком сложной, те время на прорисовку на слабом железе будет велико, то пользователь увидит просмотр слайдов, хотя объект сделает столько же оборотов, как и на крутейшем железе.
0
|
31.08.2009, 22:18 | 3 |
мне известен этот прототип:
UINT_PTR SetTimer( HWND hWnd, // handle to window UINT_PTR nIDEvent, // timer identifier UINT uElapse, // time-out value TIMERPROC lpTimerFunc // timer procedure ); если вы не используете какую-то экзотику, то вы запустили таймер номер 5 с интервалом 0.
0
|
2343 / 499 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
|
|
01.09.2009, 09:25 | 4 |
MrAndrey_ka, да, как-то у вас странно сделано.
Чего вы хотите достичь? Я вообще не понял, зачем нужен таймер. Хотите проверить максимальную производительность - вставте в обработку ON_PAINT InvalidateRect(...) на весь экран, и обновление будет постоянно. Расчет "1000/10=100" я тоже не понял. Производительность DirectDraw зависит от видеокарты, так что вы там считали?? А вообще, в играх делают просто параллельные потоки на отрисовку и на собственно игровые расчеты. И обновление картинки идет именно постоянно. Ваш вариант будет выдавать низкую производительность еще и по причине специфики исполнения ON_TIMER в среде Windows:
0
|
01.09.2009, 18:57 [ТС] | 6 |
snake32, я не понял куда нужно вставлять тот код что ты выложил?
Добавлено через 27 минут snake32, и обьясни подробнее что в нем происходит, что за delta и как ее высчитать и очень хотелось бы увидеть функцию Render что делают функции timeBeginPeriod и timeEndPeriod
0
|
2343 / 499 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
|
|
01.09.2009, 19:22 | 7 |
еще раз: производительность(fps) при использовании DirectDraw на 80% зависит от графического процессора.
Если приложение правильно спроектировано, то ЦП может вообще быть загружен на 2-3%, и при этом будет 200fps.
0
|
2343 / 499 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
|
|
01.09.2009, 19:48 | 9 |
Возможно. Но, скорее всего, может быть намного больше.
Судя по тому, как коряво сделан вышеописанный финт с таймером(без обид ), у вас все приложение написано "как бык поссал". Так даже третьеразрядные игры сейчас не пишутся. Учитесь.
0
|
02.09.2009, 11:40 | 12 | ||||||||||
Этот код идёт сразу после инициализации окна, те когда ты средствами WinAPI создаёшь окно.
Посмотри как это делается в любом DirectX SDK тутариале. Делаешь пустой проект Win32, добавляешь туда 2 файла, например, code.cpp и code.h code.h:
0
|
02.09.2009, 11:40 | |
02.09.2009, 11:40 | |
Помогаю со студенческими работами здесь
12
Таймеры Таймеры Потоки и Таймеры на C# QNX- Таймеры Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |