# Java mit bestimmter GPU ausführen



## Bananabert (2. Jul 2014)

Moin,

ist es möglich ein Java Programm mit einer bestimmten GPU zu starten ohne eine extra Libarie?

Momentan greift Java immer auf die Integrierte Grafikkarte zurück, jedoch würde ich gerne NVidia benutzen.
Ich habe bereits versucht in der NVidia Systemsteuerung die bevorzugte Grafikkarte für Java umzustellen, jedoch ohne Erfolg. Zudem noch über eine EXE starten zu lassen, welche ich mit Launch4j erstellt habe, diese ich mit der NVidia GPU gestartet habe.

Bananabert


----------



## fischefr (4. Jul 2014)

Hallo!

Ich glaube, du denkst gerade etwas zu hardwarenah!

Ich nehme an, du benutzt DualScreen mit 2 Monitoren, oder?
Über welches Grafik-Framework reden wir denn? Swing? Falls ja, gibts da die Möglichkeit, ein Fenster auf dem n-ten Schirm zu platzieren.

swing - java, show JFrame in a specific screen in dual monitor configuration - Stack Overflow


----------



## Bananabert (4. Jul 2014)

Moin,

ja 2 Monitore benutze ich, und ja Swing benutze ich auch. Aber Nein, das ist nicht das was ich Suche.

Nach ein wenig mehr googlen bin ich auf einige Einträge zu Minecraft gestoßen, wenn auch nicht weiter hilfreich. Hier wird meist geschrieben, einfach Rechtsklick auf die .exe und im Kontextmenü "Mit Grafikkarte x ausführen".

Da ich Minecraft besitze habe ich dies auch direkt mal getestet und siehe da, Nvidia ControlPanel zeigt mir an, es wird mit der GPU gerendert. Mit einigen anderen Programmen konnte ich die Auslastung der GPU auch sehen.

Jedoch dieses selber hinbekommen, habe ich bisher nicht. Und leider auch nichts weiter zu gefunden.


----------



## Anti-Banane (4. Jul 2014)

ich hab mich jetzt mal eben schnell registriert nur um dir folgendes zu sagen : dein rechner hat das problem wie schon damals zu urzeiten als das mit den 3d-beschleunigern losging : Java Swing ist 2D ! wird daher also auch nur von deiner 2d-gpu, in diesem fall nun mal das onboard-dingens, gerendert

das was du unter auslastung deiner 3d-gpu siehst ist alles das was aktiv in 3d gerendert wird .. also richtig mit DirectX oder OpenGL

willst du deinen code also auf deiner 3d-gpu laufen lassen musst du auch entsprechenden 3d-code schreiben ... z.b. mit jogl oder java3d



zur anspielung was das mit der urzeit zu tun hat : damals hatten rechner in der regel nur einen 2d-chip der auch nur in der lage rudimentär vesa darzustellen ... wenn es dann um richtige 3d-berechnung ging brauchte man dafür in der regel eine 3d-beschleuniger karte zusätzlich

wenn man sich mal so die wiki-artikel über modernes multi-gpu-rendering durchliest fällt dort einem sehr schnell die referenz auf die vergangenheit auf das man auf die idee schon sehr viel früher gekommen ist ... nämlich zwei grakas ... eine für normales 2d-"desktop-gedöns" und einen 3d-beschleuniger
damals musste das ganze dann noch meist extern mit so ner art gekreuztem monitor-kabel durchgeschleift werden

erst relativ spät kam man dann auf die idee sowohl 2d- als auch 3d-rendering in einem chip zu vereinen so wie wir es heute kennen


der hinweis mit minecraft ... naja ... ich möchte nich wissen wer so einen schrott mal wieder unter die leute bringt ... aber das system kann es einfach vorher nicht wissen das wenn java code geladen wird dieser irgendwo umschaltet auf 3d-rendering ... halte daher das zitat für absoluten bullshit von so nem kleinen möchtegern-kiddie


----------



## Bananabert (4. Jul 2014)

Moin,

ah danke @Anti-Banane, das erklärt natürlich einiges. Schönen Abend noch

[OT]
Mit absicht die Anti-Banane gewählt ?
[/OT]


----------



## Ruzmanz (4. Jul 2014)

> der hinweis mit minecraft ... naja ... ich möchte nich wissen wer so einen schrott mal wieder unter die leute bringt ... aber das system kann es einfach vorher nicht wissen das wenn java code geladen wird dieser irgendwo umschaltet auf 3d-rendering ... halte daher das zitat für absoluten bullshit von so nem kleinen möchtegern-kiddie



Was ist dein Problem?! Ich kenne mich mit der Thematik nicht aus, aber deine Aussage ist logisch falsch. Wenn er explizit eine Grafikkarte VOR dem Start anfordert, dann müsste der Computer diese auch verwenden. Ob die Grafikkarte nun das Bild erzeugen / darstellen kann, ist erstmal nebensächlich. Wenn es nicht geht, dann kommt halt ein Bluescreen oder das Programm stürtzt ab ... so wurde das meiner Ansicht nach, aber nicht beschrieben!

Er hat explizit eine Grafikkarte ausgewählt und diese wird nicht genutzt. Ich habe schon öfter gesehen, dass die Programme mit einer Fehlermeldung abstürzen, sofern die 2. Grafikkarte nicht genutzt werden kann. Aus diesem Grund gehe ich nicht davon aus, dass seine Nvidia Grafikkarte geladen wird und dass das Betriebssystem als Fallback auf die andere Grafikkarte zurückspringt.



> ist es möglich ein Java Programm mit einer bestimmten GPU zu starten ohne eine extra Libarie?



Habe da selbst keine Ahnung. Möchtest du eine andere Grafikkarte wählen, weil deine Applikation zu langsam ist? Evtl. kann man da noch deutlich nachbessern ...


----------



## Bananabert (5. Jul 2014)

Moin,

@Rumanz, es geht um eine kleine Spiele Engine. Die Engine benutzt nur die draw Methoden von Graphics.
Auf meinem Laptop läuft es mit der Integrierten Grafikkarte mit rund 500fps und mit OpenGL Pipeline (nicht die Librarie) ~ 1500 FPS.

Jedoch auf einem MAC, selbst die etwas besseren, schmiert das Programm total ab, läuft mit < 20 FPS.
Ein großteil der MACs hat auch jeweils 2 Grafik-Karten. Natürlich auch möglich, dass die Treiber für die Integrierte Out-Of-Date sind.

Jedes Spiel das ich Starte, kann korrekt mit der NVidia ausgeführt werden. Daher wundert es mich.

Für weitere Posts : Nein ich will keine Libraries benutzen, ich schreibe gerne etwas selber und suche nach einer Lösung. Nur finde ich momentan hier keine.


----------



## Anti-Banane (7. Jul 2014)

@Ruzmanz
mein problem ist mal sicherlich überhaupt nicht ... fakt ist jedoch : man KANN einfach nicht vorher sagen : "binary X soll mit GPU-kern Y laufen" ... völlig egal ob man vorher weis das der code irgendwo mal umschalten wird auf aktives 3D-rendering oder nur im 2D-mode "zeichnet"

[ot]hier sei noch erwähnt : auch 2D-zeichnen ist schon eigentlich "rendern", denn der begriff "rendering" bezeichnet den vorgang der grafikkarte aus den roh-daten ein "bild" aufzubereiten und "fertigzustellen" ... das übertragen und letztenendes anzeigen des monitors ist dann schon wieder der nächste schritt und hat mit dem eigentlichen "rendern" nichts mehr zu tun
allerdings wird für 2D-operationen gebräuchlich lediglich "drawing" bzw im deutschen "zeichnen" genutztn wohingegen 3D-operationen als "(aktives) rendern" bezeichnet werden

die nutzung bei z.b. video-bearbeitung oder modellierungen (z.b. Cinema4D oder wie sie nicht alle heißen) ist der begriffsdefinition nach eigentlich falsch[/ot]



> Wenn er explizit eine Grafikkarte VOR dem Start anfordert, dann müsste der Computer diese auch verwenden.


tja ... aber leider geht genau DAS eben nicht ... zumindest nicht so wie es hier beschrieben wurde
es ist richtig das nVidia und teilweise auch AMD in einigen driver-versionen in zusammenarbeit mit der dazugehörigen steuersoftware einstellungen anbieten um die eine oder andere anwendung noch ein bisschen nach zu regeln oder vorab ein system-global zu setzen ... aber explizit einen bestimmten gpu-kern anfordern ... sowas hab ich noch nie gesehen ... nicht mal bei diesen custom-oem-krams den notebook-hersteller gerne nutzen in zusammenhang mit nVid-karten

von daher möchte ich die zitierte aussage, das man einer anwendung vorab einen bestimmten gpu-kern zuweisen kann, an sich schon vom autor her in frage stellen, wenn nicht dessen kompetenz selbst


auch ist deine weitere aussage weder in sich noch generell stimmig, denn DOCH : grundsätzlich verwaltet das OS in zusammenarbeit mit seinem kernel und den treibern die entscheidung welcher hardware-teil welche software abarbeitet
oder kurz : am ende sagt der kernel welche GPU
theoretisch würde es also schon die möglichkeit geben "einen wunsch" anzumelden, ob dies am ende dann aber technisch machbar ist muss halt geprüft und bei fehlschlag umentschieden werden



um mal wieder zurückzukommen auf java

grundsätzlich arbeitet java im normalen 2D-drawing welches durch die hardware "beschleunigt" wird, die sog. 3D-hardware-beschleunigung
unter unix wird dies in der regel durch OpenGL umgesetzt, welches aber (zumindest laut DOC) standardmäßig deaktiviert ist
unter windows hingegen wird auf Direct3D/DirectX zurückgegriffen (typisch halt) um eine 3D-beschleunigung zu erhalten
eine vorgegebene standard-value gibt es dafür nicht da es von mehreren faktoren abhängt, z.b. ob der desktop gerade im 2D- oder 3D-modus läuft, ob Direct3D überhaupt aktiv ist, etc

[ot]bezüglich desktop und 3D : laut M$ wird seit vista auch der normale desktop bei aktivem AERO 3D-gerendert
in wie weit hier wirklich 3D am werk ist müsste man mal in den tiefen des MSDN nachforschen[/ot]

und jetzt kommen wir mal drauf was TO geschrieben hat : er nutzt Swing !
ergo : er "zeichnet" 2D was dann von java durch native-calls an die grafik-API des OS übergeben wird
java selbst versucht (zumindest unter windows) aktive (Direct)3D-beschleunigung umzusetzen, letztenendes hängt es aber von der grafik-API, dem kernel und dem treiber ab ob dies auch wirklich umgesetzt wird


so ... und nun zu dem problem was TO geschildert hat : er hat unter Mac performance-probleme
hmm ... spontan würde mir da erstmal einfallen : zeig mal den "draw-code" wie viel was wo wie gezeichnet wird

spontan würde mir nämlich einfallen : wenn du Swing nutzt musst du entsprechend (z.b. von einem JPanel erbend) paintComponent(Graphics) überschreiben und hier als erstes den super-call "super.paintComponent(Graphics)" einfügen, und ich wette das es bei dir an genau diesem problem hakt ... ist einfach n typischer anfänger-fehler

daher würde es auch nichts bringen das ganze durch die vorhandene 3D-gpu zu schicken, weil das würde nur den call-stack noch weiter aufblähen und die performance noch weiter drücken da es einfach mehr zeit kostet




ps : nein, anti-banane soll nich gegen dich sein sondern ergab sich einfach aus dem kontext da mir nichts anderes eingefallen ist


----------

