Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.044 c
3-1160656457
svt
2006-10-12 16:34
2006.12.24
Подскажите пожайлусата как исправиь ошибку в запросе


15-1164923453
Алхимик
2006-12-01 00:50
2006.12.24
Валидаторы


1-1162825345
dima123
2006-11-06 18:02
2006.12.24
Хинт


2-1165215033
sergeyst
2006-12-04 09:50
2006.12.24
создание форм


15-1164922671
ЭРИКА
2006-12-01 00:37
2006.12.24
С ДНЕМ РОЖДЕНИЯ!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский