2011-10-02 3 views
0

У меня есть следующий dispatch_async код:Weird поведения dispatch_async памяти

dispatch_async(openGLESContextQueue, ^{ 

     [(EAGLView *)self.view setFramebuffer]; 

     // Replace the implementation of this method to do your own custom drawing. 
     static const GLfloat squareVertices[] = { 
      -0.5f, -0.33f, 
      0.5f, -0.33f, 
      -0.5f, 0.33f, 
      0.5f, 0.33f, 
     }; 

     static const GLubyte squareColors[] = { 
      127, 127, 0, 127, 
      0, 255, 255, 255, 
      0,  0, 0, 0, 
      255, 0, 255, 255, 
     }; 

     static float transY = 0.0f; 

     glClearColor(0.5f, 0.5f, 0.5f, 1.0f); 
     glClear(GL_COLOR_BUFFER_BIT);    

     glMatrixMode(GL_PROJECTION); 
     glLoadIdentity(); 
     glMatrixMode(GL_MODELVIEW); 
     glLoadIdentity(); 
     glTranslatef(0.0f, (GLfloat)(sinf(transY)/2.0f), 0.0f); 
     transY += 0.075f; 

     glVertexPointer(2, GL_FLOAT, 0, squareVertices); 
     glEnableClientState(GL_VERTEX_ARRAY); 
     glColorPointer(4, GL_UNSIGNED_BYTE, 0, squareColors); 
     glEnableClientState(GL_COLOR_ARRAY); 

     glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 

     [(EAGLView *)self.view presentFramebuffer]; 

    }); 

И когда в инструментах, и даже если анимация работает нормально, я получаю тонны «64 байт таНоса» с, которые никогда не высвобождающимися. Кто-нибудь знает, почему?

ответ

1

я, наконец, смог решить эту проблему с помощью семафоров:

if (dispatch_semaphore_wait(frameRenderingSemaphore, DISPATCH_TIME_NOW) == 0) 
    { 
     dispatch_async(openGLESContextQueue, ^{ 

      [(EAGLView *)self.view setFramebuffer]; 

      glClearColor(0.5f, 0.5f, 0.5f, 1.0f); 
      glClear(GL_COLOR_BUFFER_BIT); 

      glMatrixMode(GL_PROJECTION); 
      glLoadIdentity(); 
      glMatrixMode(GL_MODELVIEW); 
      glLoadIdentity(); 
      glTranslatef(0.0f, (GLfloat)(sinf(transY)/2.0f), 0.0f); 
      transY += 0.075f; 

      glVertexPointer(2, GL_FLOAT, 0, squareVertices); 
      glEnableClientState(GL_VERTEX_ARRAY); 
      glColorPointer(4, GL_UNSIGNED_BYTE, 0, squareColors); 
      glEnableClientState(GL_COLOR_ARRAY); 

      glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 

      [(EAGLView *)self.view presentFramebuffer]; 

      dispatch_semaphore_signal(frameRenderingSemaphore); 
     }); 
    } 

Я предполагаю очередь отправки получала затоплена без времени, чтобы обработать каждый OPENGL перерисовки. Таким образом, он будет обрабатывать только одно перерисовку одновременно, асинхронно. Любопытно, что он не имеет побочных эффектов на частоту кадров! : D

Спасибо :)

Смежные вопросы