objective-c - 奇怪的dispatch_async内存行为

标签 objective-c ios multithreading 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];

    });

在 Instruments 中,即使动画运行良好,我也会得到大量永远不会被释放的“64 字节 malloc”。有谁知道为什么吗?

最佳答案

我终于能够使用信号量解决问题:

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

谢谢 :)

关于objective-c - 奇怪的dispatch_async内存行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7627386/

相关文章:

ios - mkmapview 在指定帧中显示路线和注释

objective-c - ExtAudioFileWriteAsync上的EXC_BAD_ACCESS

java - Android 客户端/服务器通信的最佳实践

ios - 如何在 Xcode 中找到行号?

java - 内存不足错误: Could not allocate JNI Env

c++ - 在 openmp 中使用不同线程组装 vector 时缩放比例不佳

ios - 设置自定义 UITableView tableHeaderView

objective-c - 更改 MAC 地址 Cocoa - Objective-C

iphone - iOS - 在动画过渡期间更新标签?

ios - 如何从 iOS 的另一个 nsarray 中不存在的核心数据中删除对象?