Performance bei Objekterstellung



  • Nabend beisammen,

    ich habe bei einem kleinen Spiel ein Dynamisches 2D-Array welches TImage-Objekte beinhalten soll.

    Wenn ich nun das ganze erstellen lassen

    for (y = 0; y < piNewHeight; y++)
      {
        for(x = 0; x < piNewWidth; x++)
        {
          GGO->GTM->GameTable[y].Length = x+1;
          GGO->GTM->GameTable[y][x] = new Field;
          GGO->GTM->GameTable[y][x]->myImage = new TImage(Application);
          GGO->GTM->GameTable[y][x]->myImage->Parent = LoA_main;
          GGO->GTM->GameTable[y][x]->myImage->Top  = y * GGO->ImageSize;
          GGO->GTM->GameTable[y][x]->myImage->Left = x * GGO->ImageSize;
        }
    
        StatusBar1->Panels->Items[0]->Text = FloatToStrF((y+1) * OneRow, ffFixed, 4, 0) + " %";
        StatusBar1->Update();
      }
    

    Dauert das z.B. bei einer Feldgröße von 30 mal 30, macht also 900 mal TImage, extrem lange.

    Die Klasse Field ist von mir un beinhalten nur ein paar spieldaten zu den Feldern, ich hab auch schon probiert ob es an meiner Klasse liegt, das diese die Geschwindigkeit so drückt, aber selbst wenn ich ein Array benutze das nur aus TImageobjekten besteht hab ich mein Performanceproblem.

    Die Frage also:
    Kann man das ganze irgendwie beschleunigen/optimieren ?

    Danke im voraus

    Gruß Finn



  • Vielleicht nicht so viele, sondern nur eines verwenden und dann die einzelnen Bilder dort hinein malen. Ist zwar auch relativ zeitintensiv aber meines Erachtens nach nicht so schlimm.



  • Ich kann in ein Imageobjekt mehrere Bilder laden und anzeigen lassen ?



  • Ich denk mal Dasd meint:

    Alle Bilder in Offscreen- Bitmaps laden (unsichtbar - daher keine Belastung mit Darstellung am Monitor)

    Die Bilder in EIN TImage Draw(en) an die richtige Position!

    Oder Bitmaps in weiteres TBitmap zeichnen und das Ergebnis in TImage copieren!



  • Achso, so das ich mir das Bild immer "zurechtzeiche".

    Muss mal austesten wie schnell das arbeitet nur müsste ich das dann ja auch immer wieder machen sobald ich etwas an der Karte änder.

    wie ist das denn z.B. bei Minesweeper gelöst, weiß das zufällig jemand ?
    Das müsste dort ja so ähnlich ablaufen.


Anmelden zum Antworten