Automatische Bildschirmskalierung in MonoGame und Windows 8 Store App

So langsam geht die Portierung von VaderpiXX auf Windows 8 dem Ende entgegen. Bei der Anpassung des Viewport beim Wechseln der BIldschirmauflösungen habe ich mir heute etwas die Zähne ausgebissen und möchte nun meine letztliche Implementierung erläutern. In diversen Foren bin ich auf viele Entwickler mit dem selben Problem gestoßen und oft wird ein alternativer Pull angeboten oder ein paar Änderungen in der OpenTK (eine Open-Source C#-Wrapper für OpenGL, OpenAL und OpenCL). Da ich es jedoch bevorzugen wollte den OpenTK-Code nicht zu ändern, habe ich es letztlich wie im folgenden Snippet gelöst:

protected override void Initialize()
{
graphics.IsFullScreen = true;
graphics.PreferredBackBufferHeight = 480;
graphics.PreferredBackBufferWidth = 800;
// ...
graphics.ApplyChanges();
ApplicationViewChanged += Game_ApplicationViewChanged;

this.Window.ClientSizeChanged += Window_ClientSizeChanged;
handleScreenViewState();
base.Initialize();
}

void Window_ClientSizeChanged(object sender, EventArgs e)
{
this.GraphicsDevice.Viewport = new Viewport(0, 0, 800, 480);
graphics.PreferredBackBufferHeight = 480;
graphics.PreferredBackBufferWidth = 800;
graphics.ApplyChanges();

}

void Game_ApplicationViewChanged(object sender, ViewStateChangedEventArgs e)
{
handleScreenViewState();
}

Wichtige Events sind an dieser Stelle ClientSizeChanged der Window-Klasse und speziell in Windows 8 noch ApplicationViewChanged der Game-Klasse, in der man auf die verschiedenen ViewStates reagieren kann und beispielweise das Anzeigeverhalten im Snapped-Mode anpassen kann.


Das Lösung des Problems der fehlenden, automatischen Bildschirmskalierung, wie man es aus XNA gewohnt ist, findet sich im Code des ClientSizeChanged-Events wieder (Zeilen 19 - 22). MonoGame skaliert hier ungewollt den BackBuffer und den ViewPort mit, wodurch die Ausgabe der Grafiken nicht mehr korrekt ist. Ein manuelles zurücksetzen auf die Ausgangsauflösung behebt diesen Umstand.


Comments

Popular posts from this blog

UWPCore: A development acceleration framework for the Universal Windows Platform

How to setup an eGPU on Ubuntu for TensorFlow

Benchmarking Tensorflow Performance on eGPU