Bonjour à tous
,
Comme le titre du topic l'indique, j'ai un problème majeur lorsque je couple pthread avec les vbos.
En effet, afin de ne pas perdre trop de fps, j'ai décidé de placer l'update des vbo dans un thread (avec pthread). J'utilise une classe VBO disposant d'une methode updateVertexBuffer() qui se charge de recharger les données du buffer :
1 2 3 4 5 6 7 8 9 10 11 12
| template <typename A, typename B, typename C>
void OptimisedVBO<A,B,C>::updateVertexBuffer()
{
glBindBuffer(GL_ARRAY_BUFFER, m_numberVBO[0]);
if(m_vertexBufferCoord2D!=NULL&&m_vertexBufferCoord2D->size())
updateSubData(m_vertexBufferCoord2D,0,GL_ARRAY_BUFFER);
else if(m_vertexBufferCoord3D!=NULL&&m_vertexBufferCoord3D->size())
updateSubData(m_vertexBufferCoord3D,0,GL_ARRAY_BUFFER);
else if(m_vertexBufferDoubleArray!=NULL&&m_vertexBufferDoubleArray->size())
updateSubData(m_vertexBufferDoubleArray,0,GL_ARRAY_BUFFER);
glBindBuffer(GL_ARRAY_BUFFER, 0);
} |
Lorsqu'un vbo est crée quelque part, il est ajouté à la classe updateThread qui met à jour les vbos crées toutes les X millisecondes (ajustables).
Le thread est lié à la fonction update qui prend en paramètre un pointeur sur une variable correspondant au temps écoulé depuis le début du programme :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| template <typename T, typename U, typename V>
void *UpdateThread<T,U,V>::update(void *timeElapsed)
{
if(timeElapsed==NULL)
m_run = false;
Uint32 *time = NULL;
if(m_run)
time =(Uint32 *)(timeElapsed);
while(m_run)
if(timeElapsed==NULL||*time-m_lastTime>=m_timeUpdate*1000)
{
if(pthread_mutex_lock(&m_mutex_stock))
std::cout<<"Erreur !";
m_lastTime = *time;
for(unsigned int i=0;i<m_vbo.size();i++)
if(m_update[i])
m_vbo[i]->updateVertexBuffer();
if(pthread_mutex_unlock(&m_mutex_stock))
std::cout<<"Erreur2 !";
}
return NULL;
} |
Cependant, malgré les mutex, j'ai du mal à comprendre pourquoi le programme plante lorsque, après avoir ajouté 1 VBO dans le tableau par la fonction addVBO (ci-dessous). Le thread plante lorsqu'il update l'unique et premier vbo ajouté, au niveau de la fonction updateVertexBuffer du vbo, lors de l'appel à
glBindBuffer(GL_ARRAY_BUFFER, m_numberVBO[0]);
1 2 3 4 5 6 7 8 9
| template <typename T, typename U, typename V>
void UpdateThread<T,U,V>::addVBO(OptimisedVBO<T,U,V>* vbo, bool update)
{
if(vbo!=NULL)
{
m_vbo.push_back(vbo);
m_update.push_back(update);
}
} |
Pourtant, un appel de
m_vbo[m_vbo.size()-1]->updateVertexBuffer();
lors de l'ajout du vbo ne plante pas. Cela provient donc du thread qui appelle cette même méthode du même vbo.
Voilà, si vous avez une explication je suis preneur
Partager