Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.12.24;
Скачать: CL | DM;

Вниз

нужен таймер с интервалом меньше 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;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.05 c
15-1164959291
вразлет
2006-12-01 10:48
2006.12.24
Задача


11-1142084192
GMax
2006-03-11 16:36
2006.12.24
KolListbox loMultiSelect


1-1163068605
Kirillrepin
2006-11-09 13:36
2006.12.24
ComboBox


2-1165396893
Roman_ln
2006-12-06 12:21
2006.12.24
Если в делфи процедуры работающие с датой?


2-1165419683
crasher
2006-12-06 18:41
2006.12.24
Полная блокировка компьютера