Форум: "Начинающим";
Текущий архив: 2006.12.24;
Скачать: [xml.tar.bz2];
Внизнужен таймер с интервалом меньше 1ms Найти похожие ветки
← →
User7777 (2006-12-01 23:34) [0]Всем привет.
нужен таймер который позволил бы задать интервал меньше 1ms.
По истечении указанного периода должна вызываться Callback-функция.
Существует что нибудь подобное в Delphi или Api ?
← →
Орион © (2006-12-01 23:45) [1]> Существует что нибудь подобное в Delphi или Api ?
нет.
← →
Германн © (2006-12-02 01:32) [2]
> User7777 (01.12.06 23:34)
>
> Всем привет.
> нужен таймер который позволил бы задать интервал меньше
> 1ms.
> По истечении указанного периода должна вызываться Callback-
> функция.
Спасёт ОРД только "внешнее устройство". Имеющим оплатить разработку, обращаться на мыло в анкете с конкретным описанием задачи. :-)
С уважением, "временно-частично" безработный, Германн.
← →
ЮЮ © (2006-12-02 09:02) [3]Ну и вызывай её постоянно в цикле. Что она переработается? Боюсь за 1 ms ана и выполниться то не успеет :)
← →
tesseract © (2006-12-02 13:23) [4]Windows не RTOS. Погрешность в user-mode режиме Windows - +/-10 мс. Зависит от загрузки проца.
Или писать драйвер и пользоваться системным таймером, либо реально пересмотреть задачу.
← →
alex810 © (2006-12-02 14:39) [5]Функция GetThreadTimes извлекает информацию о распределении интервалов времени для заданного потока.
Синтаксис
BOOL GetThreadTimes(
HANDLE hThread, // дескриптор потока
LPFILETIME lpCreationTime, // время создания потока
LPFILETIME lpExitTime, // время выхода потока
LPFILETIME lpKernelTime, // время работы в привилегированном режиме
LPFILETIME lpUserTime // время работы в пользовательском режиме
);
Параметры
hThread
[in] Дескриптор потока, информация о распределении интервалов времени которого разыскивается. Этот дескриптор должен быть создан с правом доступа THREAD_QUERY_INFORMATION. Для получения дополнительной информации, см. статью Защита потока и права доступа.
lpCreationTime
[out] Указатель на структуру FILETIME, которая принимает момент создания потока.
lpExitTime
[out] Указатель на структуру FILETIME, которая принимает момент выхода потока. Если поток не вышел, содержание этой структуры не определенное.
lpKernelTime
[out] Указатель на структуру FILETIME, которая принимает величину времени, в ходе которого поток выполнялся в привилегированном режиме (режиме ядра).
lpUserTime
[out] Указатель на структуру FILETIME, которая принимает величину времени, в ходе которого поток выполнялся в непривилегированном (пользовательском) режиме.
Возвращаемые значения
Если функция завершается успешно, величина возвращаемого значения - не ноль.
Если функция завершается с ошибкой, величина возвращаемого значения - ноль. Чтобы получать расширенные данные об ошибках, вызовите GetLastError.
Замечания
Все периоды отражаются, при помощи использования структур данных FILETIME. Такая структура содержит два 32-разрядных значения, которые объединены, чтобы сформировать 64-разрядный счетчик тактов, размер которых 100 наносекунд.
Моменты создания и выхода потока являются точками во времени, выраженными как количество времени, которое прошло, начиная с полночи 1 января, 1601 в Гринвиче, в Англии. Имеется несколько функций, которые прикладная программа может использовать, чтобы конвертировать такие значения в более общие практические формы, см. статью Функции времени.
Периоды работы потока в привилегированном и непривилегированном режимах составляют величину времени его работы. Например, если поток затратил одну секунду в режиме ядра, эта функция заполнит структуру FILETIME, указанную параметром lpKernelTime с 64-разрядным значением десяти миллионов. Это число является 100 наносекундных единиц измерения в одной секунде
← →
Anatoly Podgoretsky © (2006-12-02 15:09) [6]Ни одна из многозадачных ОС не является RTOS. Степень отличается погрешностью.
← →
tesseract © (2006-12-02 18:55) [7]
> Anatoly Podgoretsky © (02.12.06 15:09) [6]
> Ни одна из многозадачных ОС не является RTOS. Степень отличается
> погрешностью.
QNX в принципе являеться RTOS. Любая ОС для мобильников- RTOS.
← →
Anatoly Podgoretsky © (2006-12-02 20:15) [8]> tesseract (02.12.2006 18:55:07) [7]
Не евляется, там тоже есть приоритеты и конкуренция за ресурсы, у нее только поводок покороче. Вот ДОС является, а QNX не.
Что там в мобильниках не знаю, вполне возможно что там реал тайм, но возможно и борьба за ресурсы со всеми вытекающими последствиями.
← →
User7777 (2006-12-02 23:02) [9]Выводы не утешительные :)
Я так понял надо либо драйвер писать либо изголяться.
Гигагерцы растут а воз и ныне там :)
← →
Орион © (2006-12-03 00:30) [10]> [9] User7777 (02.12.06 23:02)
не в гигагерцах дело :)
← →
Германн © (2006-12-03 00:44) [11]
> User7777 (02.12.06 23:02) [9]
>
> Выводы не утешительные :)
> Я так понял надо либо драйвер писать либо изголяться.
> Гигагерцы растут а воз и ныне там :)
>
Потребности системы растут соответственно с её возможностями. Но суть, имхо, именно в изначальной непредназначенности" её.
← →
Cawa © (2006-12-03 09:30) [12]>нужен таймер который позволил бы задать интервал меньше 1ms.
Я себе позволю спросить, а с какой целью нужен такой таймер? (Если не секрет. Может в нем нет никакой необходимости?)
← →
User7777 (2006-12-03 11:32) [13]
> Я себе позволю спросить, а с какой целью нужен такой таймер?
> (Если не секрет. Может в нем нет никакой необходимости?
> )
Именно явной НЕОБХОДИМОСТИ в таком таймере нет, но было бы неплохо еслиб он был.
Такой таймер мне нужен для реализации плавности движения спрайта. Я хотел выводить спрайт всегда со смещением в один пиксель а скорость спрайта регулировать задержкой между выводами на экран (в данный момент момент я расчитываю величину смещения в зависимости от скорости. что не есть гуд. Наблюдаются подергушки)
Почему именно таймер с событием или калбаком? - что бы не загружать проц.
Если я дам потоку Sleep - то меньше 10 ms я задержку не получу. Если реализовать програмную задержку - то нагружаю проц бесполезными действиями.
PS: Использую XNA (надстройка над Managed DirectX). Скорость отрисовки на высоте, поэтому задержка менее 1ms просто напрашивается сама собой.
← →
Alx2 © (2006-12-03 12:03) [14]>User7777 (03.12.06 11:32) [13]
Напоминает стрельбу из пушек по воробьям.
Я бы делал по-другому. Скрость задавал как количество пикселей в секунду. Прорисовка вызывалась бы в свободное от работы время.
В прорисовке определял место, где в текущий момент должен быть спрайт, ну и рисовал его сразу в том месте.
← →
User7777 (2006-12-03 12:41) [15]Это конечно правильно.... Но...
используя аппаратное ускорение графики(а я написал что использую XNA), естественное состояние программы - "свободное от работы время". И если я в это свободное от работы время буду вызывать отрисовку обьектов, - то как раз этого свободного времени и не останется - а это загрузка процессора 100%. Что меня совсем не радует. Если я неправильно тебя понял - поправь.
← →
Alx2 © (2006-12-03 13:03) [16]>User7777 (03.12.06 12:41) [15]
У меня дальше только домыслы. Проверить бы...
← →
Cawa © (2006-12-03 13:21) [17]Как можно помочь, если так все скудно описано?!. Описывайте проблему более подробней!!! (что, как, куда, с частями кода)
Создаешь поток который перересовывает картинку.
Создаешь поток который осуществляет перемещение.
Скорость задаешь такую, какую должен проходть объект за единицу времени.
Вот и все, что я могу пока сказать.
P.S. дальнейшая тема уже скорее из раздела ГеймДева
← →
Sapersky (2006-12-03 14:19) [18]в данный момент момент я расчитываю величину смещения в зависимости от скорости. что не есть гуд. Наблюдаются подергушки
Нормальный метод. Если получается плохо - значит, что-то неправильно делаешь.
Для измерения микросекундных интервалов можно использовать QueryPerformanceCounter. У неё есть определённые нюансы, связанные с современными CPU, но всё решаемо. Потом дам ссылку, если интересно.
Загружать процессор на 100% - ИМХО, для игры нормально.
Другой вариант для спрайтовой игры, которая железо не сильно напрягает - сделать фиксированный FPS, скажем 33 или 50, c помощью обычного таймера или Sleep. Примеры есть, никаких торможений на глаз не видно.
← →
User7777 (2006-12-03 17:35) [19]
> Примеры есть, никаких торможений на глаз не видно
дело не в торможении, здесь все "на ура". Вопрос в плавности этого движения.
Попробую описать проблему поподробней.
1) Есть определенный компьютер с определенным быстродействием (для простоты будем думать что прога будет запускаться всегда на этом компе)
2)Есть некий код (допустим он будет гонять шарик(спрайт) внутри окна)
3) При создании устройства DirectX я указываю опцию "не синхронизировать вывод с частотой разверти" (т.е. обновление экрана-по запросу). Далее в теле этого кода я при помощи пустого цикла(или непустого) делаю задержку перед каждым выводом спрайта на экран. При каждой отрисовке спрайт смещается на один пиксель (опять же для простоты будем считать что скорость обьекта - постоянна).
4) Запускаю прогу. Визуально определяю что при такой задержке скорость движения спрайта а также плавность его передвижения меня устраивают.
При этом скорость обновления экрана составляет 500 fps.
5) Что будет если я выставляю опцию "синхронизировать вывод с частотой разверти" (предположим я выставил на в настройках монитора 50 Гц) ?
6) В этом случае (для реализации той же самой скорости) мне придется выводить спрайт со смещением в 10 пикселей и согласитесь визуально это будет выглядеть гораздо хуже чем 500 fps и смещение в один пиксель
-------------------------------------------------------------------
Исходя из ответов я пришел к выводу что ничего из моей идеи не выйдет и придется делать так, как это делают все (видимо время еще не пришло :) )
Хотя если в XNA можно реализовать эфект Motion Blur то это уже плюс.
Но я только начинаю тернистый путь изучения XNA - а это минус :)
> Для измерения микросекундных интервалов можно использовать
> QueryPerformanceCounter. У неё есть определённые нюансы,
> связанные с современными CPU, но всё решаемо. Потом дам
> ссылку, если интересно
Очень интересно.
Но насколько я понял из описания его надо постоянно опрашивать.
PS: Всем огромное спасибо. Меня очень порадовали участники форума своим вниманием к чужим проблемам.
← →
Anatoly Podgoretsky © (2006-12-03 18:12) [20]> User7777 (03.12.2006 11:32:13) [13]
Ты пользуешься не тем таймером, тебе нужен мультимедиа таймер, у него точность в 10 раз выше.
← →
User7777 (2006-12-03 20:44) [21]
> Ты пользуешься не тем таймером, тебе нужен мультимедиа таймер,
> у него точность в 10 раз выше
можно поподробней? Где найти описание? может какой примерчик есть?
← →
Anatoly Podgoretsky © (2006-12-03 21:08) [22]> User7777 (03.12.2006 20:44:21) [21]
Описание в штатной справке, по теме Multimedia Timer Reference
← →
User7777 (2006-12-03 22:29) [23]Я пишу на VB.Net :)
Описание нашел в MSDN.
Жаль конечно что минимальный интервал 1ms но это уже лучше.
← →
Sapersky (2006-12-04 23:10) [24]5) Что будет если я выставляю опцию "синхронизировать вывод с частотой разверти" (предположим я выставил на в настройках монитора 50 Гц) ?
6) В этом случае (для реализации той же самой скорости) мне придется выводить спрайт со смещением в 10 пикселей и согласитесь визуально это будет выглядеть гораздо хуже чем 500 fps и смещение в один пиксель
Если монитор выводит 50 FPS, спрайт на экране в любом случае будет перемещаться с шагом 10 пикселей, независимо от шаманства с синхронизацией. Просто без синхронизации монитор будет реально использовать 1 из 10 нарисованных видеокартой кадров. Точнее, 1/10 часть каждого кадра (изображение на экране формируется не мгновенно), но это ещё хуже: т.к. кадры разные, изображение на экране может оказаться составленным из несовпадающих друг с другом частей (т.н. расхождение или tearing). Для борьбы с этим эффектом и придумана вертикальная синхронизация.
Хотя на практике расхождение заметно не всегда, поэтому синхронизацию часто отключают в угоду плавности и скорости, особенно в 3D, где FPS часто проседает ниже частоты обновления, а при включённой синхронизации это означает - минимум в два раза (если меньше 50 - сразу 25). При этом 25 FPS может перемешаться с 50 и "жутких тормозов" не будет - но в общем скорость получится несколько ниже, чем без синхронизации.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.12.24;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.042 c