WebGL è bello e asincrono in quanto è possibile inviare una lunga lista di comandi di rendering senza attendere il completamento. Tuttavia, se per qualche motivo hai bisogno di attendere il completamento del rendering, devi farlo in modo sincrono con gl.finish()
. Sicuramente sarebbe meglio se gl.finish
accettasse una richiamata e restituisse immediatamente?WebGL è possibile emulare una chiamata asincrona a gl.finish()
Domanda: C'è un modo per emularlo in modo affidabile?
caso Uso: Sto rendering di un gran numero di vertici per una grande tela fuori dallo schermo e quindi utilizzando drawImage
per copiare sezioni di questo grande tela di piccole tele sulla pagina. In realtà non uso gl.finish()
ma drawImage()
sembra avere lo stesso effetto. Nella mia applicazione, il re-rendering viene attivato solo quando l'utente esegue un'azione (ad esempio facendo clic su un pulsante) e potrebbe richiedere diverse centinaia di millisecondi. Sarebbe bello se durante il rendering il browser fosse ancora reattivo permettendo lo scrolling ecc. Sto cercando in particolare una soluzione Chrome, anche se qualcosa che funziona anche con Firefox e Safari sarebbe buono.
Possible (cattiva) risposta: Si potrebbe cercare di stimare quanto tempo il rendering sta andando a prendere e quindi impostare un timeout che inizia con la chiamata a gl.finish()
. Tuttavia, fare in modo affidabile questa stima per tutte le dimensioni del vertex buffer e tutti gli utenti sarà piuttosto complicato e impreciso.
Possibile risposta (non):requestAnimationFrame
fa quello che sto cercando ... non lo fa, vero?
Non è possibile eseguire il rendering dalla stessa pagina, con 'async' gl.finish() poiché non esiste una versione asincrona.Se il disegno di un'immagine fuori schermo è considerato "pesante", è possibile utilizzare Web Worker per generarlo, quindi postare nuovamente Message con tale immagine e disegnarlo su tela. Ciò salverebbe leggermente le prestazioni, ma il disegno deve essere sincronizzato. Ridurre la risoluzione della tela potrebbe velocizzarlo. – moka
@MaksimsMihejevs - il rendering di un'immagine da un web worker sarebbe asincrono, ma sarebbe utilizzare la CPU non la GPU, quindi sarà molto più lento. (Non puoi accedere a WebGL da WebWorkers.) –
Ho parlato più del contesto di canvas 2d, come hai menzionato 'drawImage'. – moka