Hallo zusammen!
4 Mitstreiter und ich müssen einen Terraria Klon mithilfe von JavaFX programmieren.
Leider haben wir ein Problem beim Zeichnen mit dem Canvas/Graphicscontext.
Wir haben das Zeichnen(2D) durch eine verschachtelte Schleife realisiert, die ein Array ausließt
und dann anhand der Informationen gewisse 16x16 große Rechtecke an den richtigen
Positionen zeichnet. Also wird in unserer Gameloop das Canvas übermalt und dann werden die
Rechtecke gezeichnet und die Gameloop beginnt von vorne(Logik ist erstmal egal). Irgendwann kommt dann der Moment, an dem nichts mehr gezeichnet wird. Das Innere des Fenster wird nicht mehr aktualisiert, jedoch läuft der
Thread immer noch weiter und man erhält keine Fehlermeldung.
Ich konnte das Problem recht weit von unserem Projekt distanzieren, und hab dazu ein sehr kleines Programm geschrieben, bei dem genau der selbe Fehler auftritt.
Programm muss man leider mit dem Taskmanager beenden.
Das Programm zeichnet einfach den ganzen Bildschirm voll mit 16x16 großen, schwarzen Rechtecken(also wenns läuft dann ist das ganze Fenster schwarz) und übermalt sie dann wieder. Es ist immer unterschiedlich, wann das Programm freezt. Bei mir sieht es dann nach kurzer Zeit zB so aus. Ich benutze Java 8 45u, falls es benötigt wird.

Ich nehme auch gerne andere Zeichnungstechniken mit JavaFX entgegen! Man muss bloß jeden Pixel ansprechen können.
Ich freue mich auf Eure Antworten!
Mfg
4 Mitstreiter und ich müssen einen Terraria Klon mithilfe von JavaFX programmieren.
Leider haben wir ein Problem beim Zeichnen mit dem Canvas/Graphicscontext.
Wir haben das Zeichnen(2D) durch eine verschachtelte Schleife realisiert, die ein Array ausließt
und dann anhand der Informationen gewisse 16x16 große Rechtecke an den richtigen
Positionen zeichnet. Also wird in unserer Gameloop das Canvas übermalt und dann werden die
Rechtecke gezeichnet und die Gameloop beginnt von vorne(Logik ist erstmal egal). Irgendwann kommt dann der Moment, an dem nichts mehr gezeichnet wird. Das Innere des Fenster wird nicht mehr aktualisiert, jedoch läuft der
Thread immer noch weiter und man erhält keine Fehlermeldung.
Ich konnte das Problem recht weit von unserem Projekt distanzieren, und hab dazu ein sehr kleines Programm geschrieben, bei dem genau der selbe Fehler auftritt.
Java:
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.stage.Stage;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* Created by on 14.05.2015.
*/
public class Main extends Application {
private Canvas canvas = new Canvas(800,600);
private GraphicsContext gc = canvas.getGraphicsContext2D();
private Group group = new Group();
private Scene scene = new Scene(group);
private ExecutorService ex = Executors.newSingleThreadExecutor();
public static void main(String[] args){
launch(args);
}
@Override
public void start(Stage stage){
group.getChildren().add(canvas);
stage.setScene(scene);
stage.sizeToScene();
stage.show();
//threadgameloop
ex.execute(() -> {
long before = System.currentTimeMillis(), now, sleep;
while(true){
//clear canvas
gc.clearRect(0,0,800,600);
//rendersimulation
for(int i=0; i<50; i++){
for(int j=0; j<38; j++){
gc.fillRect(i*16,j*16,16,16);
}
}
//thread sleep
now = System.currentTimeMillis();
sleep = Math.max(0, 40 - (now - before));
try {
System.out.println("Thread sleeps: "+sleep+"ms");
Thread.sleep(sleep);
} catch (InterruptedException ignored) {}
before = System.currentTimeMillis();
}
});
}
}
Programm muss man leider mit dem Taskmanager beenden.
Das Programm zeichnet einfach den ganzen Bildschirm voll mit 16x16 großen, schwarzen Rechtecken(also wenns läuft dann ist das ganze Fenster schwarz) und übermalt sie dann wieder. Es ist immer unterschiedlich, wann das Programm freezt. Bei mir sieht es dann nach kurzer Zeit zB so aus. Ich benutze Java 8 45u, falls es benötigt wird.

Ich nehme auch gerne andere Zeichnungstechniken mit JavaFX entgegen! Man muss bloß jeden Pixel ansprechen können.
Ich freue mich auf Eure Antworten!
Mfg