Sto usando un FBO + RBO, e invece del doppio buffering regolare sul framebuffer predefinito, sto disegnando sull'RBO e poi blit direttamente sul buffer GL_FRONT dell'FBO predefinito (0) in un contesto OpenGL con buffer singolo.doppio buffering con FBO + RBO e glFinish()
Va bene e non ho alcun sfarfallio, ma se la scena diventa un po 'complessa, ho un calo enorme in fps, qualcosa di così strano che sapevo che qualcosa doveva essere sbagliato. E non intendo da 1/60 a 1/30 a causa di una sincronizzazione saltata, voglio dire un improvviso calo del 90% dei fps.
Ho provato un glFlush() dopo il blit - nessuna differenza, poi ho provato un glFinish() dopo la "blit", e ho avuto un boost di 10x fps.
Quindi ho usato il normale buffering di doble sul framebuffer e lo swapbuster() predefiniti, e anche l'fps ha avuto un boost, come quando si usa glFinish().
Non riesco a capire cosa sta succedendo. Perché glFinish() fa tanta differenza quando non dovrebbe? e, è corretto usare un RBO e blittare direttamente sul buffer frontale, invece di usare una chiamata swap in un doppio contesto di buffering? So che mi manca il vsync ma il gestore composito si sincronizzerà comunque (in realtà non vedo alcuno strappo), è come se il monitor mancasse 9 fotogrammi su 10.
E proprio per curiosità, uno swapbuffer nativo() usa glFinish() su Windows o Linux?
* "poi ho provato un glFinish() dopo il blit, e ho avuto un boost 10x fps" * - Piuttosto suona come un problema con il tuo metodo di temporizzazione, qualcosa di simile non è sincronizzato bene con la tua GPU (che ' glFinish' ovviamente raggiunge). Qualche altro codice sarebbe interessante. –
Non vedo come reimplementare Double Buffering sarebbe comunque meglio, considerando tutte le cose in driver come Triple Buffering, Adaptive VSync e così via. –
@BartekBanachewicz Ha senso se è necessario il buffer sia per il rendering su schermo sia per quello fuori schermo, ma in effetti avrai un po 'di lavoro per (ri) ottimizzare la parte sullo schermo. – KillianDS