Sto provando a convertire un po 'di codice Java2D in JavaFX e sono bloccato da un problema relativo alle prestazioni di JavaFX Canvas. Ad un certo punto, dovrò disegnare migliaia di piccoli cerchi sullo schermo.JavaFX Canvas delay
Il mio problema è che nel primo disegno, il mio codice impiega molto tempo per essere eseguito. Ma se devo eseguire un secondo disegno, ci vuole solo una frazione del tempo per disegnare (è almeno 10 volte più veloce).
C'è qualcosa che sto facendo male? C'è un modo per prevenire quel ritardo iniziale?
Ho scritto questo codice per testarlo. In questo codice disegno 500.000 cerchi in posizioni casuali su una tela 1000 x 1000 (creata in precedenza). Ho collegato questo codice a un evento click del pulsante e la prima volta che faccio clic ci vogliono 10 secondi per eseguirlo. Ma se clicco di nuovo, ci vogliono solo 0,025 secondi.
private void paintCanvas() {
long initTime = System.currentTimeMillis();
GraphicsContext cg = canvas.getGraphicsContext2D();
cg.setFill(Color.WHITE);
cg.fillRect(0, 0, canvas.getWidth(), canvas.getHeight());
cg.setFill(Color.rgb(0, 0, 0, 0.1));
Random rand = new Random();
for (int i = 0; i < 500000; i++) {
cg.fillOval(1000 * rand.nextFloat(), 1000 * rand.nextFloat(), 2, 2);
}
long endTime = System.currentTimeMillis();
System.out.println("Time spent on drawing:" + (endTime - initTime)/1000.0f);
}
In realtà non esiste un numero massimo di nuovi elementi. Può variare da alcune centinaia a centinaia di migliaia, a seconda delle esigenze degli utenti. E sì, va bene se alcuni elementi appaiono nel tempo.
So che la 500.000 il valore è lì per dimostrare il problema, ma quanti nella tua applicazione di destinazione, qual è il numero massimo di * nuovi * elementi necessari per disegnare ogni fotogramma? In questo modo una risposta può essere meglio adattata ai tuoi vincoli specifici. Inoltre, è OK per l'app se alcuni elementi "pop-in" nel tempo? – jewelsea
Ciao jewelsea. In realtà non esiste un numero massimo di nuovi elementi. Può variare da alcune centinaia a centinaia di migliaia, a seconda delle esigenze degli utenti. E sì, va bene se alcuni elementi appaiono nel tempo. –
Riguarda [commento della mailing list dallo sviluppatore canvas] (http://mail.openjdk.java.net/pipermail/openjfx-dev/2014-May/013838.html). – jewelsea