Требуется обновление браузера.

Эксперимент над MilliSecs


Просмотров: 2046
30 января 2016 года
Есть мнение, что старичок Blitz3D не обеспечивает необходимой стабильности работы своей функции
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
(как только он будет обнаружен) будет приводить к переключению состояния на контакте, соответствующему младшему биту данных LPT-порта.

Я выставил масштабный множитель развёртки осциллографа на 0.5 мс и получил меандр с длительностью импульса в 2 клетки сетки. Затем я переключил множитель на 1 мс и наблюдал тот же меандр с длиной импульса в 1 клетку.

TGTmon_Blitz3Dtest.jpg
Разгон и торможение системного таймера при, соответственно, загрузке и выгрузке приложения, созданного в Blitz3D
И хотя сигнал был не совсем устойчив и дискретно колебался в 0.5 периода, это всё же не знакомый порог в 1/64-ую секунды, реализуемый типовым не мультимедийным таймером Windows.

Так как качество данных не зависело от поддержки системой таймера высокого разрешения, можно было предположить, что используется разгон мультимедийного таймера Windows. Последнее можно обнаружить, анализируя математическое ожидание уровня квантования возвращаемого значения
timeGetTime()
за период в одну секунду.

Экспериментальные результаты подтвердили правильность догадок (см. скриншот справа).

Вывод


Функция
MilliSecs
, работающая от мультимедийного таймера Windows, является адекватным методом измерения времени в указанном в справке масштабе (1 мс).

Запись опубликована в категориях:

Blitz3D жив! Scrupulosus  
 

Комментарии

Инкогнито
  Загружаем captcha