Java zu langsam für sich selbst?
lima-city → Forum → Programmiersprachen → Java
auftauchen
august
beispiel
code
dokumentation
erledigen
erstellung
fetten fehler
funktioniert url
image
laufzeit
methode
normalfall
null
stelle
system
url
verlieren
vermutung
warnung
-
Heyho
Mal ne Frage: Ist Java zu langsam für sich selbst? Ich habe ein Beispiel gefunden, was massive Fehler erzeugt, wenn man das Script ohne Sleeps ausführt. Hier der Code, ein Ausschnitt, hat nichts mit dem anderen zu tun.
public void render() { BufferStrategy bs = getBufferStrategy(); if (bs == null) { createBufferStrategy(1); return; } Graphics g = image.getGraphics(); g.fillOval((int)(Math.random()*this.getWidth()), (int)(Math.random()*this.getHeight()), (int)(Math.random()*this.getWidth()), (int)(Math.random()*this.getHeight())); g.dispose(); try { Thread.sleep(1000/10); } catch(Exception e) { System.out.println(e.getMessage()); } g = bs.getDrawGraphics(); if (g != null) { g.drawImage(image, 0, 0, this.getWidth(), this.getHeight(), null); g.dispose(); bs.show(); System.out.println(i); } else { System.out.println("hat nicht gemalt"); } i++; }
Wenn das sleep zu kurz ist, dann wird gesagt, dass g = null ist, darum die Abfrage, und das ergibt einen fetten Fehler zur Laufzeit.
Wenn ich jetzt mit dem Thread.sleep() spiele, und es zum beispiel insgesamt auf 1000/60 stelle, dann habe ich öfters ein "hat nicht gemalt" in der Konsole. Wenn ich in das sleep sogar ne 0 schreibe, habe ich das "hat nicht gemalt" über 50 mal. Das bedeutet: Java ist zu langsam für sich selbst?
Das ist neu für mich, dass ich auf den Code warten muss, das kenn ich zwar von Javascript, aber von einer so halben Hochsprache?
Gibt es das noch öfters? Also muss ich auf noch weitere Dinge achten, wo das Programm schneller ausgeführt wird, als was ein Objekt erstellt wird?
Ich hab das grad gemerkt, und nach halt fast ner stunde erst ausgemacht, dass das der fehler ist, und ich bin Baff.
Würde mich um Aufklärung freuen...
Liebe Grüße -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Hallo ggamee,
im Normalfall sollte das gar nicht passieren.
Aber ich stelle jetzt mal eine Vermutung in den Raum:
Kann es sein, dass die render()-Methode nicht im Hauptthread (der Thread, in dem das Fenster erzeugt wurde) läuft?
Falls dem so ist, dann könnte ich mir vorstellen, dass die Erstellung der BufferStrategy asynchron an den Hauptthread deligiert wird und es deshalb zu diesem Verhalten kommt.
Leider ist die Dokumentation von createBufferStrategy() und getBufferStrategy() recht dürftig.
Falls Du einen Mac haben solltest. Da habe ich gesehen, dass dieses Verhalten als Bug gemeldet wurde (im August). -
Ja das stimmt. Das render() ist in einer Canvas Klasse untergebracht, welche einen neuen Thread erzeugt für sich selbst. Also wäre es möglich, dass es Asynchron läuft. Das sollte aber eigentlich nicht sein, denn die BufferStrategy wird ja eigentlich in dem Thread erzeugt, in welchem auch render aufgerufen wird, oder nicht? Aber es wäre natürlich möglich, dass die Strategy asynchron überzeugt wird.
Ja du hast recht, die Dokumentation ist leider recht dürftig, aber es funktioniert ja schon einigermaßen. Aber da erstmal drauf zu kommen... Das ist ja ein Laufzeitfehler, da dacht ich jetzt echt nurnoch "hääää"
Ein Mac benutz ich übrigens nicht, ich benutze Ubuntu mit OpenJDK6.
Sind dir, oder auch anderen, ähnliche Fälle bekannt? Sollte man bei anderen Buffern auch auf sowas achten? Oder zum Beispiel bei Filehandles auch? Ich bin hat neu bei Java, da wäre es nett eine kleine vorab Warnung zu haben, ob solche "Laufzeitfehler" öfters auftauchen, oder ich ein wenig beruhigter sein kann und mich nicht paranoid um solche abfänge kümmern muss
Liebe Grüße -
Hallo ggamee,
nur weil man eine Methode in einem Thread aufruft bedeutet das noch lange nicht, dass das was sie machen soll auch in diesem Thread ausgeführt wird.
Es kann durchaus sein, dass die Methode überprüft, ob der aufrufende Thread mit dem Thread übereinstimmt, welcher die Komponente erzeugt hat bzw. Events verarbeitet. Falls es ein anderer ist, dann kann die Methode quasi dem Hauptthread Bescheid geben, dass er das erledigen soll. Wenn das asynchron passiert, d.h. die Methode wartet nicht bis der Vorgang abgeschlossen wurde, dann kommt es zu solchen Phänomenen.
Bei der Methode getDrawGraphics() steht dabei, dass diese aus Performance-Gründen asynchron sein kann. Desweiteren kann die BufferStrategy den/die Buffer verlieren (BufferStrategy.contentsLost()). Hier habe ich noch was gefunden, was evtl. funktioniert:
http://www.java-gaming.org/index.php/topic,8804.
Das letzte Posting würde ich mal versuchen. -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage