2D Spiel portieren - was tun mit den Bildschirmauflösungen/Aspect Ratios

  • Antworten:8
Michael Haar
  • Forum-Beiträge: 55

02.11.2010, 11:15:09 via Website

Hallo,
ich habe ein 2D-Spiel portiert. Leider sind die Grafiken für 640x480 damals gemacht worden und müssen auch in derselben Form verwendet werden da keine Quelldaten mehr vorhanden sind.
Selbst mit Skalierung bleibt aber z.B. beim Milestone ein unschöner Rand weil die Aspect Ratio nicht "normal" ist. Außerdem wird das Spiel so auf schwacher Hardware (die scheinbar mit einem scale von 640x480 auf 480x320 oder gar 320x240 überfordert ist) extrem langsam.

Jemand schon Erfahrungen gemacht? Was getan? Vorschläge?

Hier (http://forum.unity3d.com/threads/62257-Force-Screen-Resolution-480x320) schreibt jemand wenn ich das richtig verstehe die Hardware könne schneller skalieren als wenn ich das mit drawBitmap mit scale in meinem Code mache. Ich habe im Manifest auch die dort genannten Einträge aber das Spiel scheint trotzdem je nach Gerät einen unterschiedlich großen SurfaceView/Canvas zu bekommen.
<supports-screens android:smallScreens="false"
android:normalScreens="true"
android:largeScreens="false"
android:anyDensity="false"/>

Bisher habe ich noch kein OpenGL benutzt - ist die Skalierung des fertigen 640x480 Screens dann schnell genug auch auf schwacher Hardware?

Grüße,
Michael

— geändert am 02.11.2010, 22:41:55

Antworten
Michael Haar
  • Forum-Beiträge: 55

04.11.2010, 08:23:26 via Website

Spiel ist nun im Market (erstmal eine beschränkte Werbeversion um etwas Erfahrungen abzuwarten und zu entscheiden ob ich es lieber ganz free mache oder wenige Verkäufe bevorzuge).

Habe mich nun entschieden Aspect Ratio erstmal zu ignorieren und Ränder an der Seite zu lassen wenn der Bildschirm zu breit ist. Über Lösungen mache ich mir dann Gedanken wenn irgendjemand das Problem überhaupt hat ;) Im Moment sieht es nicht so aus als wollte überhaupt jemand das Spiel spielen :)

Falls wer gucken will ob es auf seiner Hardware (habe nur ein Magic) Probleme macht oder einfach nur mal 5 Sterne geben will ohne hinzusehen:

Knuddel's Quest
http://market.android.com/details?id=com.dngames.knuddelsquest


Antworten
Frank W.
  • Forum-Beiträge: 5.103

04.11.2010, 08:50:10 via Website

Hallo Michael! Erstmal Herzlich Willkommen bei AndroidPIT! :grin:

Ich bin zwar kein Entwickler, hab dein Spiel aber trotzdem mal kurz angetestet. Ist ein schöner Zeitvertreib und erinnert an alte Zeiten. :grin: Läuft auf meinem "froyo"-Magic ausreichend flüssig.

Wir haben hier eine Kategorie "Ich zeig euch meine App". Was hältst du davon, das Spiel dort mal kurz vorzustellen? Dort kannst du deine kostenlosen Apps der Community schmackhaft machen.

Eine Frage habe ich noch zur Steuerung. Ist es vielleicht möglich, das Männchen nicht nur ein Kästchen laufen zu lassen? So lange es geradeaus geht, würde ich es besser finden, dass es dahin geht, wo man hingeklickt hat (also auch mal 4 oder 5 Felder auf einmal). :)

Frank

"Irgendwann, möglicherweise aber auch nie, werde ich dich bitten, mir eine kleine Gefälligkeit zu erweisen." (Don Corleone) Für ein friedliches Miteinander"

Antworten
Michael Haar
  • Forum-Beiträge: 55

04.11.2010, 08:56:19 via Website

Hallo Frank,
vielen Dank für das erste positive Feedback.

Das mit dem Hinklicken ist auf jeden Fall geplant (habe im Prinzip den Wegfindungs-Code auch für die Monster schon drin) - ich muss aber nochmal checken ob man dann nicht über Fallen laufen könnte.

So richtig vorstellen wollte ich das Spiel erst wenn ich eine Vollversion mache wozu ich ein paar Tests abwarten wollte. Außerdem hatte ich bisher für einige Sachen noch keine Zeit (ist ja nur ein Hobby und ich habe zwei kleine Kinder und einen Job :). Aber im Prinzip gerne. Nur durch das Einstellen in den Market kommt man wohl kaum zu Downloads.

Antworten
Frank W.
  • Forum-Beiträge: 5.103

04.11.2010, 21:26:32 via Website

Wenn du Tester hast, kannst du die erst abwarten. War auch nur eine Idee von mir. :)

Ich finde die App vielversprechend und hier bekommst du bestimmt gutes Feedback.

Frank

P.S. wegen der Vollversion: Du musst nur aufpassen, da das Unterforum nur für kostenlose Apps genutzt werden darf. Aber solange du dort die Free-Version mit Werbung vorstellst, ist alles gut. :)

"Irgendwann, möglicherweise aber auch nie, werde ich dich bitten, mir eine kleine Gefälligkeit zu erweisen." (Don Corleone) Für ein friedliches Miteinander"

Antworten
Tobias Eckert
  • Forum-Beiträge: 155

05.11.2010, 19:48:27 via Website

Michael Haar
Hallo,
ich habe ein 2D-Spiel portiert. Leider sind die Grafiken für 640x480 damals gemacht worden und müssen auch in derselben Form verwendet werden da keine Quelldaten mehr vorhanden sind.
Selbst mit Skalierung bleibt aber z.B. beim Milestone ein unschöner Rand weil die Aspect Ratio nicht "normal" ist. Außerdem wird das Spiel so auf schwacher Hardware (die scheinbar mit einem scale von 640x480 auf 480x320 oder gar 320x240 überfordert ist) extrem langsam.

Jemand schon Erfahrungen gemacht? Was getan? Vorschläge?

Du kannst entweder die Lösung mit Rand wählen, die Grafik verzerren (aspect ratio ändern), oder eine Lösung wählen die einen Teil der Grafik anzeigt und scrollt. Alles nicht optimal. Am optisch schönsten ist wahrscheinlich die Lösung die Grafik so anzupassen dass sie entweder die volle Höhe oder volle Breite des Screens füllt, und den verbleibenden schwarzen Rand nicht schwarz zu lassen sondern mit einem netten Muster oder Hintergrund zu füllen.

Michael Haar
Hier (http://forum.unity3d.com/threads/62257-Force-Screen-Resolution-480x320) schreibt jemand wenn ich das richtig verstehe die Hardware könne schneller skalieren als wenn ich das mit drawBitmap mit scale in meinem Code mache. Ich habe im Manifest auch die dort genannten Einträge aber das Spiel scheint trotzdem je nach Gerät einen unterschiedlich großen SurfaceView/Canvas zu bekommen.
<supports-screens android:smallScreens="false"
android:normalScreens="true"
android:largeScreens="false"
android:anyDensity="false"/>

Die Lösung funktioniert so dass Deiner App eine mittlere Auflösung (320x480) vorgegaukelt wird, und das OS die von Deiner App in mittlerer Auflösung erstellten Grafiken dann auf das größere Telefondisplay skaliert. Das funktioniert eigentlich schon. Kann jetzt nicht sagen warum das bei Dir nicht klappt.

Bei Geräten die stark vom 320/480 Aspect Ratio abweichen wird dann um diese skalierte Darstellung aber auch ein schwarzer Rahmen gemacht. Dann hat Dein Spiel innerhalb der 320x480 Auflösung einen Rand, und die 320x480 Auflösung innerhalb des Geräts nochmal einen Rand.

Michael Haar
Bisher habe ich noch kein OpenGL benutzt - ist die Skalierung des fertigen 640x480 Screens dann schnell genug auch auf schwacher Hardware?

Ich würde in der Situation das folgende machen:
  • Ermittle bei Programmstart (bzw. wenn Du die SurfaceView bekommst) die Canvas Größe
  • Rechne Deine Quell-Grafiken zu diesem Zeitpunkt per Bitmap.CreateScaledBitmap() so um dass sie für die ermittelte Auflösung die perfekte Größe haben
  • Verwende im Spiel dann diese vorskalierten Grafiken
  • Fülle entstehende schwarze Ränder mit einem bunten Muster

Ich habe das z.B. bei einem Vier Gewinnt Spiel genau so gemacht. Kannst Dir's wenn Du magst ja mal anschauen ob das für Dich ähnlich funktionieren würde.

Die Lösung hat den Vorteil dass während des Spiels dann gar nichts mehr skaliert werden muss, wodurch das Spiel wesentlich flotter läuft.

Antworten
Michael Haar
  • Forum-Beiträge: 55

05.11.2010, 20:47:56 via Website

Hallo Tobias,
vielen Dank für deine Antwort. Habe es im Moment genauso gemacht wie du beschrieben hast. Also Vorskalierung und Ränder.
Habe allerdings nicht die screen-Settings wie in meinem ersten Post oben verwendet sondern dann doch alles auf true bis auf anydensity ...

Das Spiel scheint auch auf 480x320-Geräten ganz gut zu laufen.
Leider nicht auf den eigentlich stärkeren Samsung Galaxy S/Tablet und Milestone. Zumindest bekomme ich da für mich unerklärliche Rückmeldungen (nur über Internet/Marketwertungen) dass das Spiel viel zu langsam wäre vom Gameplay was aber eigentlich nicht so sein dürfte - ist zwar kein Actionspiel aber einschlafen sollte man auch nicht. Da hoffe ich nun doch auf OpenGL aber habe im Moment keine Zeit das zu ändern. Meine Vermutung ist dass die höhere Auflösung bei den Geräten die CPU überfordert (wenn es stimmt was ich gelesen habe dass die Bitmap-Geschichten per CPU erledigt werden). Das würde auch evtl. erklären warum ich auch Beschwerden wegen starkem Energieverbrauch auf dem Samsung Galaxy bekomme obwohl ich eigentlich dachte Strom zu sparen indem ich die GPU nicht benutze!

Irgendwie muss ich doch mal an Test-Hardware außer meinem Magic kommen :) Leider reichen die Werbeeinnahmen von bis jetzt 2,5$ dafür nicht aus ;)

Grüße,
Michael

Antworten
Tobias Eckert
  • Forum-Beiträge: 155

06.11.2010, 11:36:51 via Website

Michael Haar
Meine Vermutung ist dass die höhere Auflösung bei den Geräten die CPU überfordert

Da wirst Du wahrscheinlich recht haben. Ich hatte auch schon den Effekt dass ein Spiel auf dem HTC Tattoo wesentlich flotter lief als auf dem Nexus One, obwohl das Nexus One die bessere Hardware hat.

Was Du zur Beschleunigung probieren kannst ist die Farbtiefe Deiner Grafiken zu verändern. Kleinere Sprites etc. sehen in der Regel auch mit 256 Farben oder sogar weniger Farben noch sehr gut aus. Für die CPU gibt's dann aber nicht so viele Bytes zu handhaben wie bei voller 8-Bit Farbtiefe.

Antworten
Michael Haar
  • Forum-Beiträge: 55

07.11.2010, 21:39:26 via App

Das Problem mit der Schneckengeschwindigkeit auf Hires-Geräten habe ich nun durch Trennung von Animation/Gameplay und Grafikdarstellung gelöst. OpenGL probiere ich später noch damit es auch weich statt nur schnell wird - hoffe ich.

Ansonsten ist nun auch die Touch-Zielklick-Steuerung drin. Und deutsche Sprache.

Antworten