Как создать функцию обработки каждой миллисекунды? - страница 3

 
Dmitry Fedoseev:

24 кадра в секунду достаточно, если вы в детстве книжки про телевизор не читали)))

Вообще-то в аналоговых телевизорах с ЭЛТ была чересстрочная развертка, но только потому, что в те годы не могли в заданной полос пропускания гнать полноценные кадры, выдавали сначала четные строки, потом нечетные, а за счет послесвечения трубки не было видно мерцания. Я не только книжки читал, но и студентом на ремонте телеков неплохо халтурил ))

 
Alexey Volchanskiy:

Вообще-то в аналоговых телевизорах с ЭЛТ была чересстрочная развертка, но только потому, что в те годы не могли в заданной полос пропускания гнать полноценные кадры, выдавали сначала четные строки, потом нечетные, а за счет послесвечения трубки не было видно мерцания. Я не только книжки читал, но и студентом на ремонте телеков неплохо халтурил ))

Не знаю, сколько там кадров должно быть. Не читал я такие книжки. Но главное - теперь я сделал, все нормально работает. Конечно не до конца разобрался пока, но у меня уже есть за что зацепиться.
 
Nikolay Demko:

Функция ChartRedraw (перерисовки чарта) имеет стоимость 40 милисекунд, так что обновлять таймер через 16 нет смысла.

40 милисекунд это соответствует 25 кадров в секунду что равно скорости восприятия человека.

Ну нет, Николай,  конечно же меньше. На моем компьютере это чуть меньше 2 миллисекунд при COLOR_FORMAT_ARGB_NORMALIZE  , и меньше миллисекунды при COLOR_FORMAT_XRGB_NOALPHA

И как видно из прикрепленного примера скрипта (TestSpeedCanv.ex5) задержка между кадрами в 30 миллисекунд (32 кадров в секунду) абсолютно достаточна для глаз. Кстати все видео снимается именно с такой частотой. С большей частотой снимают, когда нужно замедленное воспроизведение.

Файлы:
 
Реter Konow:

Максимальная частота работы функции таймера - 15-16 mc.  

Да, так и есть. (только не частота, а период. Максимальная частота = 64 Гц)

Только добавлю уточнение:

шаг изменения периода для таймера = 15.625 миллисекунды. 

Т.е. при команде EventSetMillisecondTimer(1) и при команде EventSetMillisecondTimer(10) реальный период будет 15.625 мс.

       при команде EventSetMillisecondTimer(21) и при команде EventSetMillisecondTimer(30) реальный период будет 31.25 мс.

       при команде EventSetMillisecondTimer(95) и при команде EventSetMillisecondTimer(105) реальный период будет 109.375 мс.

и т.д.

Файлы:
 
Alexey Volchanskiy:

Вообще-то в аналоговых телевизорах с ЭЛТ была чересстрочная развертка, но только потому, что в те годы не могли в заданной полос пропускания гнать полноценные кадры, выдавали сначала четные строки, потом нечетные, а за счет послесвечения трубки не было видно мерцания. Я не только книжки читал, но и студентом на ремонте телеков неплохо халтурил ))

Да, 625 строк и всё такое. В первых самодельных играх (не компьютерных - собранных на отдельных микросхемах) использовалось 312 строк обычно. Игралось в детстве: хоккей, теннис...
 
Alexey Volchanskiy:

Вообще-то в аналоговых телевизорах с ЭЛТ была чересстрочная развертка, но только потому, что в те годы не могли в заданной полос пропускания гнать полноценные кадры, выдавали сначала четные строки, потом нечетные, а за счет послесвечения трубки не было видно мерцания. Я не только книжки читал, но и студентом на ремонте телеков неплохо халтурил ))

И что? Вас там не учили, что в видео, для обеспечения эффекта естественного равномерного движения, достаточно 24 кадров в секунду? А проблема мерцания это проблема монитора (телевизора). 

 
Dmitry Fedoseev:

И что? Вас там не учили, что в видео, для обеспечения эффекта естественного равномерного движения, достаточно 24 кадров в секунду? А проблема мерцания это проблема монитора (телевизора). 

сейчас даже в телефонах есть видео 50 фпс)

снимите одно и тоже, быстрое движение, в 24 фпс и 50 фпс  и сравните

пс. а Чарли Чаплин снимал 15 фпс - более чем достаточно)

 
Alexey Volchanskiy:

Вообще-то в аналоговых телевизорах с ЭЛТ была чересстрочная развертка, но только потому, что в те годы не могли в заданной полос пропускания гнать полноценные кадры, выдавали сначала четные строки, потом нечетные, а за счет послесвечения трубки не было видно мерцания. Я не только книжки читал, но и студентом на ремонте телеков неплохо халтурил ))

да, но эти полукадры были разные, а не с одного и того же кадра.
И благодаря этому движения были более плавные чем 25 фпс в компе.

 
Taras Slobodyanik:

сейчас даже в телефонах есть видео 50 фпс)

снимите одно и тоже, быстрое движение, в 24 фпс и 50 фпс  и сравните

пс. а Чарли Чаплин снимал 15 фпс - более чем достаточно)

Потрясает глубина познаний! ...и тонкость восприятия! Обычно все видят рывки и неестественность движения в фильмах Чарли Чаплина. 

 
Nikolai Semko:

Да, так и есть. (только не частота, а период. Максимальная частота = 64 Гц)

Только добавлю уточнение:

шаг изменения периода для таймера = 15.625 миллисекунды. 

Т.е. при команде EventSetMillisecondTimer(1) и при команде EventSetMillisecondTimer(10) реальный период будет 15.625 мс.

       при команде EventSetMillisecondTimer(21) и при команде EventSetMillisecondTimer(30) реальный период будет 31.25 мс.

       при команде EventSetMillisecondTimer(95) и при команде EventSetMillisecondTimer(105) реальный период будет 109.375 мс.

и т.д.

Спасибо за поправку, Николай. 

Столь точных замеров периодов не делал, но обращал внимание, что бывают пропуски некоторых периодов. Частота неидеальна. Особенно, в диапазоне малых значений периодов (16-25 мс). То есть, если поставить 16 мс, то довольно часто пауза будет состовлять 32 миллисекунды.

Происходит что то вроде сбоев в частоте периодов. Своего рода электронная аритмия.   


Поэтому думаю, если поставить период в 40 мс (что достаточно для восприятия человека), а таймер будет пропускать некоторые периоды? Тогда мы получим не 24 кадра в секунду, а 18-24. В зависимости от того, сколько периодов таймер пропустит. Думаю, оптимальным вариантом будет период таймера в 25 мс. Что я изначально и установил у себя.