Странное поведение памяти dispatch_async

#objective-c #ios #multithreading #grand-central-dispatch

#objective-c #iOS #многопоточность #grand-central-dispatch

Вопрос:

У меня есть следующий 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», которые никогда не освобождаются. Кто-нибудь знает, почему?

Ответ №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

Спасибо 🙂