Эксперимент над MilliSecs
Просмотров: 2046
30 января 2016 года
Есть мнение, что старичок Blitz3D не обеспечивает необходимой стабильности работы своей функции : мол, миллисекунды скачут, точность измерений нарушается - анимации и алгоритмы, привязанные ко времени, работают некорректно. Так ли это?
При изучении свойств различных функций получения текущего времени (см. эту и эту статьи), я уделил внимание и Blitz3D. Но, в связи с отсутствием практической важности этих наблюдений, результаты в статьи не попали.
Итак, я набросал простенький decls-файл, чтобы получить возможность работы с LPT-портом из Блитца, и запустил вот такой код, посматривая на показания подключённого осциллографа:
Каждый "тик" (как только он будет обнаружен) будет приводить к переключению состояния на контакте, соответствующему младшему биту данных LPT-порта.
Я выставил масштабный множитель развёртки осциллографа на 0.5 мс и получил меандр с длительностью импульса в 2 клетки сетки. Затем я переключил множитель на 1 мс и наблюдал тот же меандр с длиной импульса в 1 клетку.
И хотя сигнал был не совсем устойчив и дискретно колебался в 0.5 периода, это всё же не знакомый порог в 1/64-ую секунды, реализуемый типовым не мультимедийным таймером Windows.
Так как качество данных не зависело от поддержки системой таймера высокого разрешения, можно было предположить, что используется разгон мультимедийного таймера Windows. Последнее можно обнаружить, анализируя математическое ожидание уровня квантования возвращаемого значения за период в одну секунду.
Экспериментальные результаты подтвердили правильность догадок (см. скриншот справа).
Функция, работающая от мультимедийного таймера Windows, является адекватным методом измерения времени в указанном в справке масштабе (1 мс).
MilliSecs
При изучении свойств различных функций получения текущего времени (см. эту и эту статьи), я уделил внимание и Blitz3D. Но, в связи с отсутствием практической важности этих наблюдений, результаты в статьи не попали.
Итак, я набросал простенький decls-файл, чтобы получить возможность работы с LPT-портом из Блитца, и запустил вот такой код, посматривая на показания подключённого осциллографа:
Исходный код теста для MilliSecs
12345678910111213 | Graphics3D 800,600,32 SetBuffer BackBuffer() Local old%=MilliSecs() Local c%=0 While Not KeyHit(1) Local now%=MilliSecs() If now<>old old=now c=c+1 LPT_WRITE(888,c) EndIf Wend End |
Каждый "тик"
MilliSecs
Я выставил масштабный множитель развёртки осциллографа на 0.5 мс и получил меандр с длительностью импульса в 2 клетки сетки. Затем я переключил множитель на 1 мс и наблюдал тот же меандр с длиной импульса в 1 клетку.
И хотя сигнал был не совсем устойчив и дискретно колебался в 0.5 периода, это всё же не знакомый порог в 1/64-ую секунды, реализуемый типовым не мультимедийным таймером Windows.
Так как качество данных не зависело от поддержки системой таймера высокого разрешения, можно было предположить, что используется разгон мультимедийного таймера Windows. Последнее можно обнаружить, анализируя математическое ожидание уровня квантования возвращаемого значения
timeGetTime()
Экспериментальные результаты подтвердили правильность догадок (см. скриншот справа).
Вывод
Функция
MilliSecs
Комментарии