Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

11

12.02.2009, 18:25

Zitat von »"Memphis"«

Wie wäre es, wenn du einfach nur die Tiles darstellst die auch auf dem Monitor angezeigt werden? Die anderen brauchste doch nicht rendern bzw. durchlaufen.


Es werden ja immer nur die gerendert die dargestellt werden.

Zitat von »"Zera"«

lässt sich auch gut in die obere einbauen, dabei kannst du auch direkt die 4000 sprite-Instanzen sparen Wink


würde theoretisch schon gehen aber dann hätte ich kein Zugriff auf einzelne Tiles für Animationen oder Bewegungen.

Zitat von »"Nox"«

@Razor ich glaube zera hat recht. Denn überleg mal für welche pos die Bedingung erfüllt ist (genau für einen Fall und zwar pos == iMapArray[x][y])

Das soll ja so sein um den Wert von einem bestimmten Index herauszufinden. Je nach dem Wert wird dann ein SubRect von der Tilemap geladen.

Hat niemand eine Idee zu dem Anzeigeproblem?

Powerpaule

Treue Seele

Beiträge: 162

Wohnort: Berlin

Beruf: Softwareentwickler

  • Private Nachricht senden

12

12.02.2009, 19:09

Zitat von »"raXor"«

Zitat von »"Memphis"«

Wie wäre es, wenn du einfach nur die Tiles darstellst die auch auf dem Monitor angezeigt werden? Die anderen brauchste doch nicht rendern bzw. durchlaufen.


Es werden ja immer nur die gerendert die dargestellt werden.


Na ja ich weiß ja nicht:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// Renderschleife:

    for (int i = 1; i < 64*64 + 1; i++)
    {
            // Auf der X Achse verschieben bis diese zu Ende ist.

            if (ZaehlerX < iWidth)
            {
                Sprite[i]->SetPosition(m_fWidth * ZaehlerX + fXPos, m_fHeight * ZaehlerY + fYPos);
               
                ZaehlerX++;
            }
            else
            {
                ZaehlerX = 1.0f;

                // Wenn X Achse zu Ende ist auf Y Achse springen

                ZaehlerY++;
                Sprite[i]->SetPosition(0.0f + fXPos, m_fHeight * ZaehlerY + fYPos);
            }
       
        esWindow->GetApp()->Draw(*Sprite[i]);
    }


Ich kenne zwar die SFML nicht, aber selbst wenn die prüft, ob von dem Sprite überhaupt etwas sichtbar ist und es dann nicht rendert, nimmt das doch alles Zeit in Anspruch.
Ich meine, du gehst hier alle Tiles durch. 4096 Stück. Ist das wirklich nötig? Wäre es nicht besser, vorher zu berechnen, welche Tiles überhaupt sichtbar sind und diese dann durchzugehen? Dann sparst du dir Tausende Positionsberechnungen und Funktionsaufrufe (Zum Rendern gehst du über 2 Zeiger, muss ja auch nicht so oft sein ;)) und vor allem das Zeichnen selbst.
Und auf was gibt denn GetApp() einen Zeiger zurück? Das wäre doch jedenfalls auch besser, wenn du das nur einmal machen würdest vor dem Durchlaufen. Spart auch wieder ein ganz klein wenig Zeit.

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

13

12.02.2009, 19:18

raXor bitte überdenke das was Zera gesagt hat nochmal genau! Das ist einfachste Logik, warum man sich die Schleife mit den pos sparen kann.

EDIT:

ein Beispiel. Normalerweise macht man:

array[10] = 123;

du machst:

for(size_t counter = 0; counter < arraylength; counter++)
if(counter == 10)
array[counter] = 123;
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

14

12.02.2009, 19:31

@ Powerpaule: Du hast definitiv recht - ich als späterer Benutzer der Engine weiß aber ob alles dargestellt wird oder nicht.

@ Nox: Ich versteh dich einfach nicht. Ich schreib mit Sicherheit nicht 4000x array[0-4000] = xyz.
da ist es doch viel sinnvoller eine Schlaufe zu nutzen die das für dich macht.

Eigentlich wollte ich die Mapgröße dynamisch machen aber vorerst hab ich gehofft das es so auch gut ist...

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

15

12.02.2009, 19:41

Zitat von »"raXor"«


eine Schlaufe zu nutzen


Danke, wusst ichs doch :)

http://www.c-plusplus.de/forum/viewtopic-var-t-is-232825-and-postdays-is-0-and-postorder-is-asc-and-start-is-0.html

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

16

12.02.2009, 19:42

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
for (int pos = 0; pos <= iSpriteNumbers; pos++) 
{ 
   if (pos == iMapArray[y][x]) 
   { 
      tile[pos]->[...]
      break; 
   } 
} 
//ist das gleiche wie

for (int pos = 0; pos <= iSpriteNumbers; pos++) 
{ 
   if (pos == iMapArray[y][x]) 
   { 
      tile[iMapArray[y][x]]->[...]//da ja pos == iMapArray[y][x]

      break; 
   } 
} 
//damit brauchen wir pos garnicht mehr! Also auch die Schleife nicht!

tile[iMapArray[y][x]]->[...]
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

17

12.02.2009, 20:09

Ah, jetzt hab ichs gerafft!

@ drakon: Wikipedia lügt!!!
Ich vertrau lieber stupidedia :lol:

// Edit: Also was die da in dem cpp Forum für ein Aufstand machen ist echt amüsant - nur weil einer nicht nach ihrer Reihe tanzt :D

K-Bal

Alter Hase

Beiträge: 703

Wohnort: Aachen

Beruf: Student (Elektrotechnik, Technische Informatik)

  • Private Nachricht senden

18

12.02.2009, 20:25

Was sagt die Performance denn jetzt?

19

13.02.2009, 16:16

Jup - hat auf jedenfall was gebracht. Danke erstmal... Wie gesagt gibts jetzt aber noch dieses Anzeigeproblem. Weiß da niemand was?

K-Bal

Alter Hase

Beiträge: 703

Wohnort: Aachen

Beruf: Student (Elektrotechnik, Technische Informatik)

  • Private Nachricht senden

20

13.02.2009, 16:36

Vielleicht direkt nach der Grafikinitialisierung erstmal das View-Scope festlegen. SFML hat doch glaub ich ne Camera-Klasse.

Werbeanzeige