ms-os idore kepfelvillantas

Hello,

szuksegunk lenne egy olyan programra, amelyik ms-os nagysagrendu ideig kepes kepet felvillantani. Ehhez keressuk a megfelelo programozasi nyelvet. Voltak probalkozasok java-ban, ezzel nem mukodott. Aztan jott a Pascal, de egy bizonyos kuszob alatt ez sem mukodik. Ehhez Assembly kell? Vagy mukodhet mas?
D.

Hozzászólások

Azért kérdeztem, mert nem a processzortól függ (bármely proci képes rá), hanem a megjelenítő eszköztől (monitor?). A monitornál eleve egy nagyságrenddel feljebb számolhatsz csak. Tehát a ms időzítés és megjelenítési tartomány ugrott. Másrészt ez nem időzítés és programozási nyelv kérdése, hanem ez egyszerűen egy valósidejű programozási feladat, amihez eleve kell vagy egy valósidejű operációs rendszer. Vagy ha VGA kártya + monitor, akkor el kell azt érned, hogy a képfrissítési ciklus végén tudjál képkockát váltani, Vertical Retrace interrupt, vagy ha tudja a hw, akkor megadod neki, hogy a következő képkockát hol van. Amúgy Real Time java-val megoldható ;-)

OpenGL-el C++-ban szerintem megoldható, aztán már csak egy DVI-os minőségi videókártya kell és egy 2ms válaszidejű TFT.

tudat alatti reklámozás csúnya dolog!

Én nem ezt hallotam/olvastam, de fene sem tudja mennyire hihetek ezeknek a forrásoknak (slashdotnak nem, meg wikinek sem, meg scifi channelnek sem :) akkor lehet tényleg nem igaz? mind1)

Azte lehet/szabad tudni mire kell? Érdekes probléma lehet, ha ilyen funkció kell neki.

Aztan jott a Pascal, de egy bizonyos kuszob alatt ez sem mukodik.

Nnamost, nemertem a kerdest. Egyebkent az ilyen rovid kepfelvillantas sokmindentol fugg. Peldaul a monitortol is igen, a kepfrissitesi frekvenciatol, meg a monitor<->videokartya kombinaciojatol.

Peldaul egy 75Hz-n mukodo monitornal 1000/75 = 13,3333 ezredmasodperc a legrovidebb ido, ami alatt meg tudsz jeleniteni valamit. Ez alatt a teljes frame-et ertem. Rovidebb ideig is kirakhatsz valamit, de akkor csak annyit ersz el, hogy a teljes kep nem fog latszodni, mert egyszeruen a monitornak nincs ideje kirajzolni, mar le is torolted.

Egyebkent ha olyat probalsz, hogy:


begin
  kirakomakepet();
  Delay(100);
  letorlomakepet();
end;

Akkor ez tenyleg nem fog mukodni. Egyebkent Pascalban pl. OS-fuggo, hogy a Delay(); mennyi ideig var. Turbo Pascalban alapbol szar es megbizhatatlan volt, Free Pascalban pedig altalaban az OS legkisebb idoszelete az a minimalis ido, ami ido alatt visszater. De ugyanez igaz C-ben a POSIX fuggvenyekre is, egy usleep()-nel is ugyanigy OS fuggo a minimalis ido, ami alatt vissza tud terni.

Multitaszkos rendszerek alatt egyebkent is eleg katasztrofalis az ilyesmi, sokminden bezavarhat. De az a szokas, egyebkent ilyenkor, hogy bekapcsoljuk a vsyncet (azaz a monitor vertikalis visszafutasahoz idozitest) a videokartya drivereben, elokeszitjuk a kirajzolasra szant kepet egy nem lathato surface-n, majd kirakjuk, buffert valtunk (itt a kartya idozit a monitorhoz, ha bekapcsoltunk a vsyncet), aztan letoroljuk, es megint buffert valtunk.

Ekkor a kepunk pontosan 1 frame-ig volt lathato, - ami a fentebb vazoltak miatt - a kijelzon elerheto legrovidebb idoegyseg. Felteve ha eleg gyorsan le tudtuk torolni a buffert, illetve az alattunk futo multitaszkos OS nem pofazott belenk... A fenti algoritmust egyebkent barmilyen nyelvben viszonylag konnyen lehet implementalni, abszolut nem programnyelv fuggo. Javaban OpenGL hasznalataval (az OS megfelelo beallitasai mellett) elerheto ez, Pascalban ugyanigy (esetleg SDL vagy DirectX hasznalataval szinten), de C-ben, Assemblyben, vagy barmiben is. :)

Az algoritmus a lenyeg, meg az hogy a hardver kepessegeihez legyen igazitva, nem az, hogy miben irod. Na jo sok hulyeseget pofaztam ossze, de talan igy vilagosabb. :)

-=- Mire a programozó: "Na és szerintetek ki csinálta a káoszt?" -=-

Már csak az érdekelne, hogyan/mivel ellenőrzöd, hogy felvillant a kép?

Ha a buffervaltas vblankhoz van idozitve, akkor nem kell ellenorizni, mert biztos h. felvillant. Leven ha buffert valtok, akkor a kovetkezo buffervaltas csak a kovetkezo vblanknal fog megtortenni, ami azt jelenti hogy egy frame-ig kintvolt a kep. Ez pedig pont az, amit akartunk. Szerintem. :) Vagy nemertem a problemad.

-=- Mire a programozó: "Na és szerintetek ki csinálta a káoszt?" -=-

Ha csak egy képet kell felvillantani, gazdaságosabb trükközni.

trükk_init();
kép_kirak();
trükk_be();
delay();
trükk_ki();

Trükk: olyasmi, ami a képkirakásnál lényegesen gyorsabb. Pl:

- paletta feketére állítása, képkirakás, paletta bepöccintése
- kép kirakása valami double buffer hátára, flippentés a videokártyán.
- játszadozás a szinkronjelekkel (új monitorok utálják)
- monitor előtt forgó takarólemez.
- felhasználónak kiadni hogy gyorsan kell pislogni.
- stb.

Most irtam meg fent, hogy a Delay(); miert nem jo nagyon kicsi idoszeletekre varasnal... Jo moka ha mindenki csak write only egy forumban. A mai multitaskas rendszerek belepofaznak, ezenkivul belevag a vblank, es "joesetben" csak egy fel frame-et fog latni az user. Stb.

-=- Mire a programozó: "Na és szerintetek ki csinálta a káoszt?" -=-