# Problem mit setDisplayMode()



## hansch (1. Feb 2009)

Nach langjähriger Javaabstinenz durfte ich endlich wieder zurück und hab mich gleich an was neues gewagt: ein kleines Spielchen 
Prinzipiell spiele ich noch an der Engine und versuch zu verstehen wie alles funktioniert und was so möglich wäre und bin eigentlich sehr zufrieden. Jetzt habe ich allerdings ein kleines Problem:
Wenn ich die Auflösung ändern will, bekomme ich eine  Exception entgegengeworfen 

Hier etwas Beispielcode:

```
if (gd.isDisplayChangeSupported()) {
					for(DisplayMode dm:gd.getDisplayModes()) {
						if (dm.getWidth() == width && dm.getHeight() == height) {
							gd.setDisplayMode(dm);
							break;
						}
					}
				} else {
					System.err.println("no display change supported!");
				}
```

Die Antwort:

```
Exception in thread "main" java.lang.InternalError: Could not set display mode
	at sun.awt.X11GraphicsDevice.configDisplayMode(Native Method)
	at sun.awt.X11GraphicsDevice.setDisplayMode(X11GraphicsDevice.java:382)
	at GameFrame.<init>(GameFrame.java:59)
	at Gui.<init>(Gui.java:21)
	at Gui.main(Gui.java:63)
```

Nach einer kleinen Suche im Netz habe ich ältere Berichte gefunden, laut denen setDisplayMode() auf X11 (hier ne Ubuntukiste) nicht funktioniert. Ich hoffe mal, dass das noch nicht alles war und ich irgend einen Denkfehler gemacht habe.. Achja, die App läuft im Vollbildmodus.

Danke schon mal


----------



## Soulfly (1. Feb 2009)

Java + Linux + Vollbild wirste nicht hinkriegen, weil da irgendwas zwischen X11 und JVM nicht möglich ist. Das war bei Java 5 schon so als ich dass selber auch mal ausprobieren wollte.

Lösung: Keine!
Workaround: Fenster ohne Deko auf ganzen Bildschirm und die Skalierung für die Zeichenfläche manuell anpassen, falls du bei 1280x1024 ne Auflösung von 800x600 realisieren willst.

PS: Windows und Mac sollten keine Probleme machen. Schreibe einfach zwei Klassen (als Rendere) die gegen ein Interface gecodet sind und lass je nach OS die jeweilige Klasse laden.


----------



## hansch (1. Feb 2009)

isFullScreenSupported() gibt true zurück und setFullScreenWindow() funktioniert prinzipiell auch. Es kann allerdings gut sein, dass es nicht ein exklusiver Vollbildmodus ist, wenn du das meinst, aber es funktiniert soweit gut.


> Skalierung für die Zeichenfläche manuell anpassen


Meinst du damit, ich soll einfach alle Sprites etwas größer darstellen? Kommt das Performancetechnisch an eine andere Auflösung ran?

Ich hab gestern den Bomberclone von EgonOlsen auf ner Fedorakiste gespielt und musste, damits gut läuft auf 800x600 runter und da wurde mir auch kurz mein Desktop in der Auflösung angezeigt. Kann sein, dass JOGL, LWJGL & Co das Problem nicht haben oder das anders umgangen wird?


----------



## Soulfly (1. Feb 2009)

Richtig! Bei reinen OpenGL bzw bei der Nutzung der OGLSchnittstelle tritt das problem nicht auf, weil man da, glaube ich weiß es aber nicht, direkt den Context steuern kann. Ich weiß net wie Egon des macht aber das kannste ihn ja fragen.

Und nochmal Richtig! Exklusiv isser nicht und eigentlich auch nicht so wirklich nutzbar. Würde dann einfach  so gehändelt werden, wie du es schon bemerkt hast. Desktop runter mit auflösung und Fenster mit passender Größe druf.

Das käme dann auch auf meine Lösung zu so wie ich meinte. Nur gehe ich einen anderen Weg. Ich halte mir im Hintergrund ein BufferedImage, zeichne darauf und zeichne es skaliert auf den Fensterbereich. So bleibt der Desktop halt so wie er ist.


----------



## hansch (2. Feb 2009)

So, habs jetzt auf mal mit Scaling probiert und es geht soweit.

Zum Thema hab ich noch etwas weitergesucht und es gibt scheinbar ab Java 6 die Möglichkeit eine OpenGL-Render-Pipe zu aktivieren womit dann echter Vollbildsupport und auch Auflösungsänderungen unterstützt werden sollen. Da ich noch am Notebook sitz un das kein DRI support hat, bekomm ich von der VM eine Fehlermeldung und kann die Möglichkeit noch nicht testen.

Da die Performance in den letzten Stunden rapide gesunken ist, muss ich erstmal jenes Problem lösen, vielleicht hat inzwischen ja sonst noch jemand was zu berichten


----------

