Dr.Godfried-Willem RAES
Kursus Experimentele Muziek: Boekdeel 1: Algoritmische Kompositie
Hogeschool Gent : Departement Muziek & Drama
1606:
Grafische Schermen: Tips
Hoewel we in deze kursus nauwelijks aandacht willen besteden aan grafische programmering op komputers, kunnen we er in de praktijk toch niet omheen af in toe in onze software ook eens iets op het scherm te laten gebeuren.
Bijna steeds gaat dit echter gepaard met een aanzienlijke vertraging van het programma.
Daarom hier enkele tips:
- Ook al beschik je over een VGA kaart met ruime mogelijkheden en hoge resoluties, weersta aan de verleiding dan maar steeds grafische screen-modes te gebruiken. Immers hoe hoger de screen-mode, hoe meer geheugen geadresseerd dient te worden voor een schrijfoperatie. Volgende instrukties doen precies hetzelfde, maar de eerste gaat wel een heel stuk sneller dan de tweede:
SCREEN 0
WIDTH 80,50
LOCATE 47,10: PRINT "Hier staat iets....";
SCREEN 12
WIDTH 80,60
LOCATE 47,10: PRINT "Hier staat iets....";
De belangrijkste reden waarom SCREEN 0 het snelste werkt heeft te maken met het feit dat dit video-geheugen is opgenomen in het normale adresbereik van de PC, terwijl voor hogere video-modes het videogeheugen moet worden omgeleid, waarbij het 'gewone' adresbereik slechts de registers bevat waar het werkelijke video-geheugen te vinden is. Voor hogere screen- modes worden de scherm-opdrachten via BIOS-interrupts omgeleid en omgezet, wat uiteraard heel wat machineklokcycli verloren doet gaan.
Het probleem is op zich genomen niet dat de video-output te traag zou gaan, want ons oog is eigenlijk wel heel erg traag en heeft vanaf zo'n 16 beeldwisselingen per sekonde reeds de indruk met een 'filmisch' beeld te maken te hebben. Het probleem zit hem in de kombinatie van video-instrukties met de tijdsexakte afhandeling van real-time instrukties waarmee we in muziek uiteraard te maken krijgen. Een zestiende sekonde moge voor het ook dan al nauwelijks waarneembaar zijn, in de muziek is het vaak een goed merkbare onderbreking...
De mogelijkheden van de snelste video-mode, met name SCREEN 0, worden vaak onderschat! Mogelijke (tekst-mode) instellingen onder SCREEN 0 zijn:
SCREEN 0
WIDTH 40,25
WIDTH 40,43
WIDTH 40,50
WIDTH 80,25
WIDTH 80,43
WIDTH 80,50
Deze modus is ook onder DOS zelf te besturen via het MODE CON: commando.
Andere bruikbare screen-modes zijn:
De EGA-modus:
SCREEN 9 of 10
WIDTH 80,25
WIDTH 80,43
De VGA-Modus:
SCREEN 11 of 12
WIDTH 80,30
WIDTH 80,60
SCREEN 13
WIDTH 80,25
Hogere screen modussen worden binnen QBX-BC7 niet ondersteund. De screen-modes 1-8 zijn vandaag eigenlijk niet langer bruikbaar en in vergetelheid geraakt. Zij werden in de vroege jaren '80 ontworpen ter ondersteuning van MDA en Hercules-grafische kaarten, die vandaag volledig in onbruik zijn. Hoewel moderne VGA-kaarten zich vaak onder deze screen-modes laten gebruiken, doen zijn dit via emulatie, waardoor dit voor ons geen snelheidsvoordeel kan opleveren.
Merk ook op dat de QBX-BC7 compiler, heel wat snellere kode genereert wanneer we onze software beperken tot character based video output in screen mode 0. (Vgl. compiler-options in de BC7 manual.)
De traagste methode om binnen Basic met tekstmodussen om te springen, is door gebruik te maken van de font-libraries. Deze werken uitsluitend in grafische modus. Op het internet troffen we nog erg interessante libraries voor QBX aan die ondersteunen bieden aan de meest geavanceerde schermen!
Enkele programmeertips:
- Vermijd een extensief gebruik van CLS gevolgt door nieuwe opbouw van het scherm. Verandering van schermpagina gaat heel wat sneller.
- Vermijd het gebruik van expliciet opgegeven repeterende tekens, zoals in:
LOCATE 10, 10
PRINT " "
LOCATE 11, 10
PRINT " _____________________________________________________"
enz...
Veel beter en sneller is:
LOCATE 10,10
PRINT SPACE$(70);
LOCATE 11, 10
PRINT STRING$(70,"_"); :' of PRINT STRING$(70, 95);
'(merk op dat ASC("_") = 95)
- Wanneer je in een opgebouwd scherm een numerieke of stringwaarde regelmatig moet verversen, bedenk dat een verversingssnelheid van 4 keer per sekonde zowat het zinnig maximum is. Wanneer je de print instruktie binnen de loop opneemt waarin de waarde wordt bepaald dan geeft de print instruktie je geen enkele informatie en vertraagt zij nodeloos je programma.
Vermijd voorts ook waarden die niet zijn gewijzigd, opnieuw naar het scherm te moeten schrijven.
Deze aanbevelingen vereisen het bijhouden van plaats-pointers voor de op het scherm te tonen variabelen, evenals konditionele scherm-refreshes. De kondities zijn:
- schrijf alleen indien de waarde verschillend is van wat er reeds op die plek op het scherm stond.
- schrijf niet sneller dan 4 maal per sekonde.
Filedate: 910928
Terug naar inhoudstafel kursus: <Index Kursus> |
Naar homepage dr.Godfried-Willem RAES |