Results 1 to 8 of 8

Thread: Repaint Drawgrid wordt langzaam

  1. #1
    Hobby fröbelaar
    Join Date
    Nov 2002
    Location
    Goes
    Posts
    458

    Repaint Drawgrid wordt langzaam

    Beste forumleden,

    Ik ben bezig met een 'Game of Life' te programmeren. En ik heb het werkend! (yeah).
    De display is een Drawgrid, de gebruiker kan zelf het aantal Cols,Rows selecteren en dit gaat tot 40 prima, 50 redelijk en vanaf 60 gaat het zichtbaar trager.

    Ik denk dat het 'm erin zit dat de gehele grid gerepaint wordt. Ik heb al geprobeerd refresh of invalidate te gebruiken, maar dit maakt weinig verschil.

    Zijn er wellicht snellere methodes om de nieuwe generatie in een Drawgrid te krijgen?
    Ik haal de informatie nu uit een 2d array of integer (0= dode cel, 1 = levende cel).

    OnDrawCell haalt de info uit de Array
    Code:
    procedure TForm.gridDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect;
      State: TGridDrawState);
    begin
     case CurGen[ACol,ARow] of
      0 : grid.Canvas.Brush.Color := ClWhite;
      1 : grid.Canvas.Brush.Color := ClBlack;
     end;
    
     grid.Canvas.FillRect(grid.CellRect(ACol,ARow));
    end;


    Of....... zit het misschien in het assignen van de Array's? (Ik heb dus 2 2d array's, huidige generatie en volgende generatie)
    Die worden in een for loop ge-assinged.

    Code:
      for i := 0 to grid.ColCount -1 do
       for j := 0 to grid.RowCount -1 do
       Curgen[i,j] := NextGen[i,j];
    Tips en ideeën zijn welkom!
    Greetzz Jacco

  2. #2
    Silly member NGLN's Avatar
    Join Date
    Aug 2004
    Location
    Werkendam
    Posts
    5,133
    Leuke, leerzame oefening!

    De meest voor de hand liggende optimalisatie is gebruik maken van de Rect parameter i.p.v. deze elke keer door het Grid te laten bereken met CellRect. Ik verwacht dat e.e.a. dan al zichtbaar sneller zal worden.

    Verder kan je ook uit de voeten met slechts één array met een extra Boolean dimensie voor Odd(Generatie), maar dat zal het niet veel sneller maken.

    Mocht je het toch nog sneller willen hebben, dan moet je geen DrawGrid gebruiken en alles zelf tekenen.
    (Sender as TNLDUser).Signature := 'Groeten van Albert';

  3. #3
    is er een reden om een drawgrid te gebruiken en niet bijvoorbeeld een canvas en het via scanlines te tekenen?

  4. #4
    In je array kun je ook bijhouden of een cel is gewijzigd en alleen de cel updaten in dat geval.
    Scheelt op een 50x40 wereld met maar 1 glider toch al behoorlijk wat (ca 50x40-4x4) updates.

    Ik ben zelf ook al een tijdje bezig met een GOL engine: https://svn.code.sf.net/p/flyingsheep/code/trunk/gol/.
    Ik probeer de engine te scheiden van de teken-de-wereld code.
    Mijn eerste test wereld doet het met een stringgrid.
    Doel uiteindelijk om de wereld te tekenen op een bitmap (zoals miijn D3 versie deed).

    Helaas ben ik wat ambiteuzer dan met mijn Delphi (3) GOL (https://www.flyingsheep.nl/software/gameoflife_bron.zip): ik wil levensvormen op kunnen slaan (niet moeilijk) en kunnen openen (ook niet moeilijk), maar ook op een bepaald positie in een bestaande wereld kunnen "invoegen".
    Daar nog een leuek GUI bij (pleur&sleur) en klaar is kees

    Bart
    Last edited by Bart B; 10-Jan-21 at 20:29. Reason: typo

  5. #5
    Hobby fröbelaar
    Join Date
    Nov 2002
    Location
    Goes
    Posts
    458
    oh wauw...... bedankt voor jullie reacties.
    Ik ben nu al beduidend sneller. Ik houd nu in een aparte Array bij welke cellen er veranderen en die teken ik rechtstreeks in de grid.

    @NLGN ik moet nog even schoorvoetend bekennen dat ik dat (nog) wel met CellRect doe, ik ga een vogelen met een TRect en hoe ik dat dan in het grid krijg.

    @Miep Nee eigenlijk niet , de enige reden is dat ik dat nog nooit heb gedaan en (nog) niet weet hoe ik dat moet doen. Een grid component ken ik enigszins en heeft voor mij al wat handige properties ingebakken

    @Bart B mooi project man! Ik ben je code door aan het lopen of ik daar nog wat handigheidjes uit kan halen. Dank je
    Greetzz Jacco

  6. #6
    Quote Originally Posted by Bolus View Post
    Ik houd nu in een aparte Array bij welke cellen er veranderen en die teken ik rechtstreeks in de grid.
    Dat betekent extra huishouding. Probeer het in 1 array te houden.

    Bart

  7. #7
    Silly member NGLN's Avatar
    Join Date
    Aug 2004
    Location
    Werkendam
    Posts
    5,133
    Quote Originally Posted by Bolus View Post
    @NLGN ik moet nog even schoorvoetend bekennen dat ik dat (nog) wel met CellRect doe, ik ga een vogelen met een TRect en hoe ik dat dan in het grid krijg.
    Ik bedoel de Rect parameter van de routine. Dus:
    Delphi Code:
    1. Grid.Canvas.FillRect(Rect);
    i.p.v.
    Delphi Code:
    1. grid.Canvas.FillRect(grid.CellRect(ACol,ARow));
    (Sender as TNLDUser).Signature := 'Groeten van Albert';

  8. #8
    als scanline net iets te ver gaat dan is het misschien een optie om eerst met pixels te werken. Die zijn wel langzaam maar dat geeft een eerste idee over hoe met een canvas om te gaan. Als dat dan werkt kan je van pixel over naar scanline

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •