@MDW, post #1
Jeżeli zrobię timer request mając ustawiony UNIT_VBLANK to zgodnie z RKRM dostanę sygnał po pierwszym “vertical blank” następującym po zadanym w zapytaniu czasie. Jest to niby zależne od częstotliwości odświeżania ekranu wybranego trybu graficznego. No i jest to zrozumiałe… ale... chyba nie bardzo tak jest.
W PowerBooku pod MorphOS mam odświeżanie 60Hz, a sygnał dostaję najczęściej 50 razy na sekundę. Czy nie powinno być 60 razy na sekundę skoro jest to zależne od częstotliwości odświeżania ekranu?
Czy to faktycznie zależy od częstotliwości czy jest to po prostu historyczny opis dotyczący różnic między PAL (50Hz) i NTSC (60Hz), a na wszystkich innych trybach czy układach graficznych jest po prostu zawsze 50Hz?
Jeżeli jest to zawsze 50Hz to chyba jednak nie będę używał UNIT_VBLANK tylko użyję UNIT_MICROHZ albo UNIT_ECLOCK. Ale do tego będę potrzebował prawdziwej wartości częstotliwości odświeżania ekranu (ile razy na sekundę czy coś takiego) żeby sobie te requesty wysyłać z odpowiednim czasem.
@MDW, post #1
@MDW, post #1
W PowerBooku pod MorphOS mam odświeżanie 60Hz, a sygnał dostaję najczęściej 50 razy na sekundę. Czy nie powinno być 60 razy na sekundę skoro jest to zależne od częstotliwości odświeżania ekranu?W MorphOS-ie wszystkie unity timer.device są emulowane za pomocą UNIT_CPU (wewnętrzny timer procesora) i częstotliwość ticków UNIT_VBLANK ma się nijak do odświeżania obrazu.
@Hexmage960, post #3
UNIT_VBLANK ma małą dokładność, ale ma niesamowicie mały narzut.
Z kolei UNIT_MICROHZ ma bardzo dużą dokładność, ale większy narzut.
To nie jest tak, że UNIT_VBLANK czeka na ramkę, tylko odmierza czas w podanej dokładności. Do odmierzania ramek służy przerwanie VBlank.
@mschulz, post #2
@Krashan, post #4
W MorphOS-ie wszystkie unity timer.device są emulowane za pomocą UNIT_CPU (wewnętrzny timer procesora) i częstotliwość ticków UNIT_VBLANK ma się nijak do odświeżania obrazu.
@Hexmage960, post #3
To nie jest tak, że UNIT_VBLANK czeka na ramkę, tylko odmierza czas w podanej dokładności. Do odmierzania ramek służy przerwanie VBlank.
@MDW, post #8
@Hexmage960, post #10
Chciałem napisać w tamtej wypowiedzi "rozdzielczość", ale uznałem że bardziej naturalny będzie termin "dokładność" jeśli chodzi o czas.
Ciekaw jestem na jakiej zasadzie działa ten UNIT_CPU, o którym wspomina kolega Krashan.
P.S. Pod systemem Amigi (exec.library) podobnie można zainstalować funkcję, która będzie wywoływana co każde wygaszanie pionowe. Mogą być różnice pod MorphOSem, nie mam w tej kwestii rozeznania.
@MDW, post #8
@Krashan, post #15
@Krashan, post #15
Przecież timer.device nie służy do synchronizowania się z odświeżaniem ekranu, tylko do pomiarów czasu.
@Hexmage960, post #18
@pisklak, post #21
Mimo wszystko to trochę dziwne że na MOSie UNIT_VBLANK "nie tyka" razem z VBL - jak sama nazwa unitu wskazuje. Ale podejrzewam że po prostu dużo łatwiej jest zrobić taką emulację niż bebrać się z VBL dla każdej możliwej karty graficznej.
@pisklak, post #21
Mimo wszystko to trochę dziwne że na MOSie UNIT_VBLANK "nie tyka" razem z VBLNie widzę w tym nic dziwnego. Zauważ, że na klasyku żądania do urządzenia i tak podawałeś w sekundach, a nie w ramkach obrazu. System przeliczał te sekundy na ticki w zależności od tego jaki tryb graficzny był uruchomiony. A ponieważ timer może odliczyć tylko całkowitą ilość ticków, to interwał czasowy zmieniał się nieco w zależności od częstotliwości odchylania. Niezbyt pożądane zjawisko.
@Krashan, post #23
@pisklak, post #24
Czy ja wiem czy niepożdane. W końcu użytkownik chce dostawać "ticki" z definicji unita z częstotliwością VBLANK- jakakolwiek by nie była.
@mschulz, post #26
@pisklak, post #27
@Hexmage960, post #28
UNIT_VBLANK ma dlatego tę nazwę, bo używa "zegara" VBlank zamiast np. CIA w Amidze. Dzięki temu ma też bardzo mały narzut, czyli nie obciąża za wiele systemu.
Dla karty graficznej dobrą funkcją do synchronizacji jest ChangeScreenBuffer() z biblioteki graficznej. Otrzymuje się wtedy wiadomości, kiedy można rysować do bufora i kiedy można ten bufor wyświetlić.
@docent, post #29
To nie do konca prawda - UNIT_VBLANK uzywa strobe z zasilacza a jesli go nie ma, to eclock, tyle ze pomiar jest wykonywany na przerwaniu vertical blank timer.device, wiec ma minimalna rozdzielczosc rowna czasowi pomiedzy dwoma takimi przerwaniami.