Frage

Ich arbeite an einem 2D-Scrolling-Spiel für das iPhone. Ich habe ein großes Hintergrundbild, sage 480 × 6000 Pixel, der nur ein Teil sichtbar ist (genau ein Bildschirm im Wert von 480 × 320 Pixel). Was ist der beste Weg, einen solchen Hintergrund auf dem Bildschirm zu bekommen?

Zur Zeit ich den Hintergrund, aufgeteilt in mehrere Texturen (um rund um die maximale Grenze Texturgröße) und den ganzen Hintergrund zieht in jedem Rahmen als texturierte Dreieck Streifen. Das Scrollen wird durch die Übersetzung der Model-View-Matrix durchgeführt. Die Scherenkasten ist mit der Fenstergröße, die 480 × 320 Pixel festgelegt. Dies wird nicht schnell sein soll, ich wollte nur einen funktionierenden Code, bevor ich zur Optimierung erhalten.

Ich dachte, dass vielleicht die OpenGL-Implementierung intelligent genug wäre, den unsichtbaren Teil des Hintergrunds zu verwerfen, aber nach einigem Mess Code, den ich schrieb es sieht aus wie Hintergrund 7 ms dauert im Durchschnitt und 84 ms bei maximaler zu ziehen. (Dies wird in dem Simulator gemessen.) Dies ist etwa die Hälfte der gesamten rendern Schleife, dh. ziemlich langsam für mich.

den Hintergrunds Zeichnung sollte so einfach sein wie einige 480 × 320 Pixel von einem Teil des VRAM zu einem anderen zu kopieren, oder, mit anderen Worten, blitzschnellen. Was ist der beste Weg, um näher an eine solche Leistung zu bekommen?

War es hilfreich?

Lösung

Das ist der schnelle Weg, es zu tun. Dinge, die Sie tun können, die Leistung zu verbessern:

  • Probieren Sie verschiedene Textur-Formate. Vermutlich die SDK-Dokumentation hat Details über das bevorzugte Format, und vermutlich kleiner ist besser.
  • Cull vollständig außerhalb des Bildschirms aus Fliesen selbst
  • Split das Bild in kleinere Texturen

Ich nehme an, Sie bei einer 1 sind Zeichnung: 1 Zoom-Ebene; ist, dass der Fall?

Edit: Oops. Lektüre genauer Ihre Frage, muss ich einen anderen Ratschlag bieten. auf dem Simulator gemacht Timings sind wertlos

Andere Tipps

Die schnelle Lösung:

  • Erstellen eine Geometriematrix von Fliesen (Quads) vorzugsweise so, dass es mindestens eine Reihe / Spalte von Off-Screen-Fliesen auf allen Seiten des sichtbaren Bereichs ist.

  • Karte Texturen auf alle diese Fliesen.

  • Sobald eine Kachel außerhalb des sichtbaren Bereichs ist, können Sie diese Textur lösen und einen neuen binden.

  • die Fliesen Verschieben eines Modulo der Plattenbreite und Fliesenhöhe als Position mit (so dass die Fliese selbst in seinem Ausgang pos neu positionieren, wenn es genau eine Fliese in der Länge verschoben hat). Denken Sie auch daran, die Texturen während dieser Operation neu zuordnen. Auf diese Weise können Sie ein sehr kleines Gitter / sehr wenig Texturspeicher zu einem bestimmten Zeitpunkt geladen haben. Was ich denke, ist besonders wichtig, in GL ES.

Wenn Sie Speicher zu ersparen und sind immer noch mit langsamer Ladegeschwindigkeit geplagt (obwohl Sie sollte nicht für die Menge an Texturen). Sie könnten eine Textur-Streaming-Engine aufbauen, die Texturen in schnellen Speicher preloads (was auch immer das auf dem Zielgerät sein kann), wenn Sie einen neuen Bereich erreichen. Mapping als Texturen in diesem Fall wird von dem schnelleren Speicher gehen, wenn nötig. Seien Sie sicher, dass Sie in der Lage sind, es zu vorzuladen, ohne den gesamten Speicher zu verwenden und vergessen, es dynamisch zu lösen, wenn nicht benötigt.

Hier ist ein Link zu einer GL (nicht ES) Tile-Engine. Ich habe es selbst nicht verwendet, so kann ich nicht für seine Funktionalität bürgen, aber es könnte der Lage sein, Ihnen zu helfen: http://www.mesa3d.org/brianp/TR.html

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top