Laden...

Background Performance

Erstellt von DerHulk vor 17 Jahren Letzter Beitrag vor 17 Jahren 3.519 Views
DerHulk Themenstarter:in
270 Beiträge seit 2005
vor 17 Jahren
Background Performance

Hi, hätte da mal eine Frage im Bereich 2d. Und zwar arbeite ich hier mit Tiles die alle
bewegt werden sobald sich die Spielerfigur/Objekt bewegt(Background). Diese Tiles Sind im Grunde genommen ja nichts als Arrays mit Positionsdaten etc.!
Wenn ich jetzt sehr viele davon habe, um halt große Welten darzustellen wird
dieses Array sehr schnell ziemlich groß ≥50000 Einträge.

Ich frage schon ab welche wilrklich gerendert werden müßen und welche nicht, und
optiemiere schon die Schleife die dieses Array durchläuft.
Leider ist das ganze immer noch etwas larm(fps < 60).Was bekanntlich zum ruckeln führt!

Wie realiesiert man sowas ohne das die Performance nachläst.
-Erhöhe ich die Größe der Tiles?! ?(
-Lege ich einen Seperaten Thread an?(Wie schauts hier mit der Syncronisation aus)
-andere Möglichkeiten?

Vielleicht hat ja jemand sich damit schon einmal beschäftigt oder sich Gedanken dazu
gemacht!

mfg derHulk

1.549 Beiträge seit 2004
vor 17 Jahren

gdi+ oder DX?

Wir Arbeiten eigendlich nicht wir nehmen nur das geld

DerHulk Themenstarter:in
270 Beiträge seit 2005
vor 17 Jahren

DX! 😉

sorry Vergessen zu erwähnen!

4.506 Beiträge seit 2004
vor 17 Jahren

Hallo DerHulk,

sieht man als "Spieler" die komplette Welt mit 50000 Items? Ich vermute mal nicht, oder?

Dann könnte man einen Sichtradius bestimmen, die dort sich darin befindlichen Items herausfinden, und nur diese berechnen. Das würde doch einen Performancegewinn bringen, oder?

Gruß
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

N
177 Beiträge seit 2006
vor 17 Jahren

Ich weiss zwar nicht, wie deine Schleife aussieht, aber wenn du das gesamte Array durchgehst und jedes Tile testet, ob es dargestellt werden soll, dann machst du schon mal was Grundlegendes falsch.

Im Idealfall gehst du nur deine Bildschirmpositionen durch und holst dir das entsprechende Tile ohne jedwede Suche.

DerHulk Themenstarter:in
270 Beiträge seit 2005
vor 17 Jahren

Hi, leutz....

danke schonmal für jedewillige beteiligung! 👍

Also erstens habe ich das Probelm "vorerst" mal gelöst(Performance ist ja eine dauer Aufgabe 😭). Also erstmal zur Lösung:
Ich war so schlau das ich bei jedem Game-loop die Tastatur abgefragt habe und
die Koordinaten aller 50000 Tiles neuberechnet habe, was jedoch nicht so ne tolle Idee
war besser ist hier eine Zeit zu warten (Elapse Time), Anfänger fehler! 🤔
Dadurch gewinnt man schon gut an Performance weil man ja nicht 60 mal pro Seckunde
die Arrays berechnen muss, ich glaub nicht das das ein Spieler merkt! 😁

Zweitens habe ich die Tiles größe erhöht von 64x64 auf 256x256 was erstens mit der
selben anzahl von Tiles eine größere "Welt" ergibt oder man sich einfach Tiles sparen kann!

zu norman_timo:

den Sichtradius hatte ich schon berücksichtigt!Un mir im Array nur die Werte genommen die man auch sieht!

thx an alle!

mfg derHulk!

N
177 Beiträge seit 2006
vor 17 Jahren

Warum die Tiles bzw. Positonen neu berechen? Wenn es eine Map ist, dann ändert sich diese nicht. Es ändert sich nur die Position (das Sichtfenster) innerhalb der Map. Und das sollte sich mit einer Addition und Multiplikation pro Achse erschlagen lassen.

DerHulk Themenstarter:in
270 Beiträge seit 2005
vor 17 Jahren

Ne, (habe das vielleicht nicht genau genug erklärt) also
stell dir vor das deine Spielerfigur/Objekt sich immer im Zentrum des Screens
befindet wenn du jetzt nach oben gehst bewegt sich ja diese Figur nicht,sondern
der Hintergrund wir verschoben,bzw gescrollt(Beispiel hier währe der erste GTA Teil).
Daher muss ich halt Tiles und deren Position neu berechnen!

Evtl. gibts ja auch ne andere Möglichkeit das zulösen, währe für jeden Vorschlag offen!
Evtl. könnte man das alles auch mit einer verschiebung der Worldview machen
(was evtl. auch Performanter währe)?! ?(

mfg

derHulk

1.549 Beiträge seit 2004
vor 17 Jahren

Mach es doch so das du die Position deiner Spielfigur nimmst und nur die darum liegenden zeichnest also ca so:

Deine Welt ist ein Array: Welt.

Deine Figur hat die Koordinaten X und Y.

jetzt machst du es in einer schleife einfach so das du nur einen Bestimmten radius um deine Figur renderst.

wenn du dich jetzt bewegst änderst du nur die Position deiner Figur nicht aber der Welt.

Wenn du also zuerst Welt[0,0]-Welt[10,0]*Welt[0,0]-Welt[0,10] anzeigst und du deine Figur einen schritt nach unten Bewegst zeigst du Welt[0,0]-Welt[10,0]*Welt[0,1]-Welt[0,11] an Verstanden?

Wir Arbeiten eigendlich nicht wir nehmen nur das geld

N
177 Beiträge seit 2006
vor 17 Jahren

Original von DerHulk
Evtl. könnte man das alles auch mit einer Verschiebung des Worldview machen
(was evtl. auch performanter wäre)?! ?(

Yupp. Dein Array speichert keine Positionen. Die Position ist implizit durch den Array-Index bereits gegeben. Wenn du eine Texture "scrollen" willst, dann verschiebst/kopierst du ja auch nicht alle Texel an eine andere Texture-Position.

DerHulk Themenstarter:in
270 Beiträge seit 2005
vor 17 Jahren

also S.H.-Teichhof,verstanden mehr nein als ja 😉!
Also, ich kann mir leider nicht vorstellen wie das zu einem Bewegunseffekt führen soll?
Ich zeig ja nur eine Reihe in Y(wenn Arry[x,y]) mehr an also 11, beim nächsten schritt der Figur währens 12? Jedoch würde sich nix bewegen?
Vielleicht kannste das noch was verdeutlichen.

nop:

ja das mit der Wolrdview ist so ne sache, eigendlich könnte man doch bestimmt die
worldview so aussrichten das der Spieler immer in der Mitte des Screens ist wenn
dieser sich nun bewegt dann bewegt sich die world view mit.
Die Array positionen werden nicht verändert und ich such mir aus dem Array nur die raus die wirklich im Screen währen?!(Ansatz so richtig?) ?(!

mfg derHulk

N
177 Beiträge seit 2006
vor 17 Jahren

Du kannst es so machen. Liess vielleicht noch mal meine 3 Postings in umgekehrter Reihenfolge (das Letzte zuerst). Wichtig ist insbesonders, dass dein Array keine Positionen speichert, du berechnest also nur den Array-Index anhand der jeweiligen Bildschirmposition des darzustellenden Tiles.

4.506 Beiträge seit 2004
vor 17 Jahren

Hallo zusammen,

ich kenne mich jetzt nicht so aus in der 3D bzw. 2D Grafikdarstellung, aber interessieren tuts mich schon 😉

Kann ich hier nicht mit relativen Angaben arbeiten? Also mit Vektoren?

Ich habe ein Starres Weltsystem mit X- und Y- Koordinaten. Dann habe ich noch ein relatives Weltsystem, das mir dann die relative Position des Spielers zu dem starren System darstellt.

Wenn ich jetzt anfange zu rendern, dann muss ich zunächst meine relatives Weltsystem auf das starre System transponieren, danach den Sichtradius berechnen, und dann wiederum die Tiles. Zum Schluß muss ich die errrechneten Tiles wieder in mein relatives Weltsystem zurücktransponieren. Et voila...

Aber das hab ich mir gerade selbst ausgesponnen, und kann grottenschlecht sein 😉)

Gruß
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

DerHulk Themenstarter:in
270 Beiträge seit 2005
vor 17 Jahren

So wie ich dich verstehe ist das, genau das was nop mir erklärt hat also über die "Worldview" zu arbeiten. In einem Array befinden sich die Daten(Positionen) zu den
Tiles, das stellt das Starres Weltsystem mit X- und Y- Koordinaten da.
Jetzt binde ich meine Position des Spieler an die Worldview-> relatives Weltsystem. Die Ummrechnung was von relativen zum starren....sollte dann
über die Wolrdview selbst errechnet werden(hierbei würde sich meiner meinung
auch die Grafikarte selb darum kümmern was nun gerendert werden soll->culling).

Das ganze ist bestimmt besser als die Methode die ich erwähnt habe! X(

mfg der Hulk.

DerHulk Themenstarter:in
270 Beiträge seit 2005
vor 17 Jahren

Habe gerade was gefunden wie eine mögliche Implementation aussehen kann:

http://einfall.blogspot.com/2005/02/stage-i-ii-tiles.html

mfg

DerHulk

N
177 Beiträge seit 2006
vor 17 Jahren

Eh das Grundproblem mit viel DX-Krawall verwässert wird, hier ein einfaches Beispiel:
Deine Tiles sind 64x64 Pixel gross.
Dein Bildschirm/Viewport ([]) ist 192x192 Pixel gross.
Deine Tilemap hat 8x8 Tiles, also 512x512 Pixel.
Deine Spielfigur(X) startet in der Mitte der Map.
Dann sieht das Ganze für den eindimensionalen Fall so aus:


// 0  64  128 192 256 320 ....... 512
// |   |   |   |   |   |   |   |   |
//         [     X     ]               // Start

const int tileSize =64;
int viewPortMin =128;
int viewPortMax =320;
int characterPos = 192;
Tile[] tileMap = new Tile[8];

public void DrawBackground()
{
    for (int i = viewPortMin; i < viewPortMax; i +=tileSize)
    {
        // this is all we need
        int tileIndex = i/tileSize;
        Tile tile =tileMap[tileIndex];

        // render tile at position (i - viewPortMin)
    }
}

// 0  64  128 192 256 320 ....... 512
// |   |   |   |   |   |   |   |   |
//     [     X     ]                  // Move left

public void Move(int signDirection)
{
    int step = tileSize * signDirection; // signDirection = +1 or -1

    viewPortMin += step;
    viewPortMax += step;
    characterPos += step;
}

public void Update()
{
    DrawBackground();
    DrawCharacter();
}

Edit: Bug fix

DerHulk Themenstarter:in
270 Beiträge seit 2005
vor 17 Jahren

Dumm gelaufen für mich, habe die Tage ausprobiert das übern Viewpoint zu machen,
Problem an der Stelle ist nur das Die DirectX.Direct3d Sprites von der Transformation der Kamera nicht betroffen sind.Also kann ich meine Kamera drehen und wend en wie ich will meine Sprites sind immer an der selben Stelle! 🤔

mfg derHulk!