[Delphi] DelphiX snelle grafische output

Pagina: 1
Acties:

  • douweh
  • Registratie: Maart 2001
  • Laatst online: 20-08 18:34
Mn topictitel is een beetje onduidelijk,
maar het probleem is opzich niet ingewikkeld....
Ik heb namelijk een 2 dimensionele array(80,60) van booleans.
de waardes hierin, zijn afhankelijk van een ander gegeven, en zijn dus dynamisch...

Wat ik nu wil, is dit raster van booleans weergegven op het scherm, als vakjes..
dus true is gekleur, en false niet..

Ik gebruik in delphiX een resolutie van 640*480, dus dat komt er op neer dat elk vakje 8*8 pixels is....

Ik gebruik hier nu de volgende code voor:

Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
procedure TForm1.Tekenveld;
var
x,y: Integer;
begin;
For x:=0 to 79 do begin;
For y:=0 to 59 do begin;
        if veld[x,y] then begin;
                DXDraw1.Surface.Canvas.Brush.Color:=clWhite;
                DXDraw1.Surface.Canvas.Rectangle(x*8,y*8,x*8+8,y*8+8);
        end;
end;
end;
end;


Het canvas waordt hierna gewoon gereleased, en deze ocde levert opzich geen problemen op...

ware het niet, dat op het moment dat practisch alle vakjes true zijn, de framerate daalt tot een matige 6/7 fps.. en dit wil ik eigenlijk toch wel een stuk hoger hebben...,

Wie heeft er een idee op wat voor manier ik dit aan zou kunnen pakken?

  • BdR
  • Registratie: Juni 2001
  • Laatst online: 03-09-2025

BdR

TV is gooder then books

blijkbaar is de Rectangle procedure (in DXDraw1.Surface.Canvas.Rectangle) niet snel genoeg. In andere programmeer omgevingen kan je soms het canvas (of "buffer") locken, en dan mag je er ook andere procedures op los laten die sneller zijn.

Of misschien kan je ipv hokjes tekenen met Rectangle, alles vullen met sprites (PutSprite ofzo :?). Dat zou is soms ook sneller, en geeft meteen mogelijkheid tot betere graphics ipv 'saaie' hokjes.

Je kan je ook afvragen of het nodig is om echt *elke* frame het vakjes raster helemaal opnieuw op te bouwen. Misschien in het beter om het programma zo te maken dat je het raster eenmalig opbouwd, dus 1 keer aan het begin van het spel tekenen. Vervolgens update je het alleen als er wijzigingen zijn, bij voorkeur dan ook alleen dat hokje dat gewijzigd is.

mijn web games -> Impossible Snake 2 :: Impossible Snake :: Snake Slider


Verwijderd

Dit zijn waarschijnlijk kleine optimalisaties maar toch...
- Je hoeft de kleur maar 1 keer vast te leggen, voorafgaand aan de beide for loops
- Door +8 te gebruiken voor de X2,Y2 overschrijf je steeds een pixel breedte en hoogte, je kunt beter +7 gebruiken (scheelt bijna 25% van de getekende pixels)

Verwijderd

Ik heb even in de documentatie van DelphiX gekeken en ik zou zelf niet de Canvas property gebruiken van de DXDraw1.Surface, maar de Draw method van DXDraw1.Surface. Maak daarvoor 1 of 2 TDirectDrawSurface objects van 8x8 pixels met de door jou gewenste kleuren. En plaats die op de gewenste x,y posities met DXDraw1.Surface.Draw

De Canvas property zal wel de (langzame) windows cgi commando's gebruiken terwijl ik veronderstel dat de Surface.Draw method een wrapper om de DirectX methode is.

  • madwizard
  • Registratie: Juli 2002
  • Laatst online: 26-10-2024

madwizard

Missionary to the word of ska

Verwijderd schreef op 23 April 2003 @ 13:02:
De Canvas property zal wel de (langzame) windows cgi commando's gebruiken terwijl ik veronderstel dat de Surface.Draw method een wrapper om de DirectX methode is.
Neem aan dat je GDI bedoelt ;). Zo langzaam zijn die trouwens niet, als je zo'n zelfde loop in C met GDI maakt kan ie dat best tekenen in een honderdste seconde.
Ik denk dat BdR in ieder geval een goede suggestie heeft, is het wel nodig ze altijd allemaal te tekenen?
Verder zou je nog als dat kan de image data direct kunnen manipuleren, vierkanten zijn vrij simpel te maken op 'raw' niveau.

[ Voor 6% gewijzigd door madwizard op 23-04-2003 13:40 ]

www.madwizard.org