Wie mache ich ein auflösungsunabhängiges System?


10

Ich mache hier einen Blank. Ich kann natürlich Dinge an Kanten verankern, die meine UI-Auflösung unabhängig machen würden ... bis sie sich so stark ändert, dass die Grafiken zu klein sind. Wie skaliere ich bei Bedarf angemessen? Wie halte ich meine Grafiken beim Skalieren im richtigen Verhältnis? Ich möchte nicht, dass sie gedehnt werden, wenn die Auflösung ein anderes Verhältnis wie 16:10 hat als alles andere.

Gibt es dafür einen echten und erprobten Ansatz? Videoplayer zeigen aufgrund dieses Problems schwarze Ränder. Ist dies nicht richtig lösbar?


1
Siehe [diese] [1] Frage. Meine Antwort erklärt einige der blutigen Details. [1]: gamedev.stackexchange.com/questions/34/…
Ingenieur

Antworten:


5

Denken Sie zunächst daran, dass es bei der Rasterung technisch gesehen keine echte Unabhängigkeit von der Auflösung gibt. Bei ausreichend hoher Vergrößerung werden einzelne Texel sichtbar. Die einzige Lösung hierfür besteht darin, ein Vektorgrafiksystem zu schreiben.

Abgesehen davon gibt es einige Schritte zum Erstellen eines robusten, rasterbasierten, auflösungsunabhängigen Systems: Größe, Koordinatensysteme und Layout.

Für die Dimensionierung und Positionierung müssen einige Einheiten verwendet werden, die ein Verhältnis zur tatsächlichen Anwendungsauflösung beibehalten. In diesem Fall können Sie Zoll verwenden, da ich Amerikaner bin und Sie Elemente mit DPI (Punkte pro Zoll) skalieren können. Angenommen, Ihre Anwendung wird mit 800 x 600 ausgeführt. Die Standard-Windows-DPI ist 96, dh die Anwendung hat eine Auflösung von (800/96) x (600/96) Zoll oder 8,33 x 6,25 Zoll.

Da Sie zumindest mit den Seitenverhältnissen 4: 3 und 16: 9 arbeiten müssen, wird der Umgang mit Ihrem Bildschirmkoordinatensystem etwas schwierig. Ich empfehle, (0,0) in die Mitte des Anzeigebereichs (sowie in Fenster und Steuerelemente) zu setzen. Dies funktioniert gut, denn wenn Sie (0,0) in eine Ecke einfügen, werden alle Ihre Sprites übersetzt, wenn sich diese Ecke basierend auf Auflösung und Seitenverhältnis bewegt, während die Mitte des Bildschirms immer die Mitte des Bildschirms Nr. 1 ist egal das Gerät. Wenn wir unser Beispiel mit 800 x 600 fortsetzen, würde dies zu einem Koordinatensystem führen, das (von links nach rechts) -4,165 Zoll bis 4,165 Zoll und (von oben nach unten) 3,125 Zoll bis -3,125 Zoll beträgt.

Im Moment haben Sie also ein DPI-unabhängiges UI-System mit Elementen, die sich immer an derselben Stelle relativ zur Bildschirmmitte befinden - nicht ganz auflösungsunabhängig. Glücklicherweise können Sie mit der DPI-Unabhängigkeit die Benutzeroberfläche skalieren, indem Sie die DPI anhand einer Heuristik skalieren. Zum Beispiel können wir DPI mit vertikaler Auflösung als Heuristik skalieren. Wenn 800 x 600 96 DPI ist, verwenden wir 123 DPI für 1024 x 768 oder 115 DPI für 1280 x 720.

Zuletzt müssen Sie ein Layoutsystem erstellen, das sowohl die absolute als auch die relative Positionierung übernimmt. Hervorragende Beispiele hierfür sind WPF und das Web. Sie können festlegen, dass Steuerelemente / Felder einige% des übergeordneten Elements ausfüllen, während Sie es zusammen mit vielen anderen nützlichen automatischen Layoutoptionen an eine Kante andocken. All dies zusammen führt zu einem UI-System, das über viele verschiedene Auflösungen und Seitenverhältnisse hinweg nahezu identisch aussehen kann.

Zusammenfassend kann ich Ihnen nur empfehlen, WPF zu studieren, da es fast alles tut, außer dass es einen Ursprung im Koordinatensystem der oberen linken Ecke beibehält und DPI nicht automatisch basierend auf der vertikalen Auflösung skaliert.


-1

Im Allgemeinen hängt das, was Sie tun möchten, vom Spiel ab.

Eine Möglichkeit besteht darin, schwarze Ränder zu haben, wenn das Seitenverhältnis (Proportionen) unterschiedlich ist (wahrscheinlich am einfachsten, einfach in Textur rendern und dann auf dem Bildschirm rendern und die Größe entsprechend anpassen).

Eine andere Möglichkeit besteht darin, unterschiedliche Renderpfade für unterschiedliche Seitenverhältnisse zu haben. Sie könnten eine für Breitbild, eine für "normal" haben.

Eine weitere Möglichkeit besteht darin, die Dinge separat zu skalieren, z. B. ein UI-Meldungsfeld je nach Auflösung größer oder kleiner zu machen. Wann immer Sie herausfinden müssen, wohin Sie zeichnen sollen, anstatt exakte Pixel zu verwenden, führen Sie Dinge wie 0,2 nach unten, 0,8 nach unten, Breite 0,1, Höhe 0,3 aus. In diesem Fall kommt es offensichtlich zu einer Dehnung der Dinge, obwohl dies davon abhängt, wie Sie Dinge zeichnen, die in Ordnung sein könnten (dh einen UI-Hintergrund strecken, aber nicht den Text).

In Bezug auf 3D sollten Widescreen-Player, solange Sie das Ansichtsfenster korrekt eingerichtet haben, etwas mehr als Nicht-Widescreen-Setups sehen können. (Alternativ können Sie auch schwarze Ränder zeichnen oder die Ansicht erweitern.)


"Nur in Textur rendern, dann auf Bildschirm rendern und die Größe entsprechend anpassen" Nein. Das würde ein wirklich verschwommenes und seltsam aussehendes Bild erzeugen. Und wenn die Auflösung zu niedrig ist? Alles wird unlesbar.
Tara

Lesen Sie weiter, das ist eine von wenigen Möglichkeiten. Sie würden definitiv nicht die Probleme bekommen, die Sie beschreiben (obwohl, wenn einfach / falsch gemacht, dann ja, es wäre verschwommen und gedehnt usw.)
George Duckett

Ich las weiter. Aber Ihre Antwort ist sehr unspezifisch. Außerdem würden Sie definitiv die von mir beschriebenen Probleme bekommen, da Sie nicht einfach alles auf eine niedrige Auflösung rendern können und erwarten, dass der Text perfekt lesbar bleibt.
Tara

Ich sage nicht, dass das Rendern mit einer niedrigeren Auflösung als das Ziel erfolgt, obwohl das Rendern mit höherer Auflösung natürlich auch Artefakte erzeugen würde. Meine Antwort hätte auch konkretisiert werden können, aber da es bereits eine gut akzeptierte Antwort gibt, werde ich nicht auf diese zurückkommen. Ich habe das Rendern von Text speziell erwähnt, da dies etwas anders ist als die Auswahl, wo (und wie groß) etwas gezeichnet werden soll, aber es ist wahr, dass es sehr kurz war und hätte ausgearbeitet werden können.
George Duckett

Ich habe auch nicht gesagt, dass die Auflösung niedriger ist als das Ziel. Sie können die Benutzeroberfläche einfach nicht 1: 1 mit einer niedrigeren Auflösung rendern, als sie vorgesehen war (das habe ich mit einer niedrigeren Auflösung gemeint).
Tara
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.