2011-10-02 63 views
0

我有以下dispatch_async代碼:怪異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字節的malloc」 S永遠不會得到釋放。有人知道爲什麼

回答

1

我終於能夠解決使用信號燈的問題:我想調度隊列是越來越沒有時間去處理每個OpenGL的重繪淹沒

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); 
     }); 
    } 

。這樣,它將只能異步地一次處理一次重繪。奇怪的是,它沒有副作用的幀率! :D

謝謝:)