Sto sperimentando con la scrittura di un motore di gioco per Android con OpenGL ES. Ho creato una discussione di gioco che aggiorna gli oggetti del gioco e GLThread con la scena. Avevo letto che è necessario caricare le trame nel metodo onSurfaceCreated di GLSurfaceView. Sto seguendo questo, ma per qualche scopo di debug stavo cercando di caricare trame dal mio thread di gioco invece del GLThread. Non ho avuto errori e la texture non è stata visualizzata sullo schermo. Ho passato tutta la giornata a cercare di capire il problema e alla fine ho letto il seguente herePerché le funzioni OpenGL ES non possono essere chiamate da un'altra discussione
"Assicurati di utilizzare solo OpenGL nel thread principale." Molto importante. Non puoi chiamare il tuo Game Engine (che potrebbe trovarsi in un'altra discussione) una funzione di caricamento della trama che non è sincronizzata con il gl-thread. Imposta un flag per segnalare il tuo gl-thread per caricare una nuova texture (ad esempio, puoi inserire una funzione in OnDrawFrame (GL gl) che controlla se deve essere caricata una nuova texture
Modificherò il mio codice in modo che le trame vengano caricate dal thread GL. Non riesco proprio a capire perché è così? Perché le funzioni OpenGL non funzionano da un altro thread?
So come creare thread ma non so cosa mezzi di sincronizzazione. L'estratto sopra menziona, "Non puoi chiamare il tuo Game Engine (che potrebbe essere in un altro thread) una funzione di caricamento della trama che non è sincronizzata con il gl-thread." Quindi penso che il mio Thread di gioco potrebbe non essere sincronizzato con il GL Thread. È possibile creare un altro thread che è sincronizzato con il GL Thread in modo che le funzioni GL possano essere chiamate da esso? Cosa dovrei imparare nel threading per comprendere questi concetti?
Non sono un ragazzo Android, ma in iOS ci sono due ragioni per avvertimenti simili: uno è che il contesto GL corrente è specifico del thread, quindi è necessario trasferire la valuta di contesto attraverso i thread e la seconda (altro importante) è che fare confusione con lo stato GL da più thread senza sincronizzazione finisce per danneggiare lo stato del contesto GL. HTH. –
Penso che sia solo per evitare l'accesso concurent –