GLPaint - 真的很慢吗?

时间:2011-08-26 16:27:36

标签: opengl-es

我考虑使用Apple的GLPaint示例(http://developer.apple.com/library/ios/#samplecode/GLPaint)进行手指画。

但是,我注意到样本中记录数据的播放非常慢。我逐步完成代码并且找不到任何人工延迟(在绘制每个线段之前有0.01秒的延迟,但这并不能解释为什么整个播放速度如此之慢,如果删除此延迟,性能不会改变)。

我需要能够在我的应用中记录数据并在用户询问时显示,但数据应立即显示而不是动画。

我不能保存最终图像,因为我需要实际的点数。

在OpenGL ES中画画真的那么慢,还是我错过了什么?

2 个答案:

答案 0 :(得分:1)

绘图机制设置为在连接每个触摸点后调用-presentRenderbuffer:。如果要一次绘制所有内容,请移除0.01s延迟,循环遍历所有几何体并同时绘制它,并将渲染缓冲区的设置/存在移出循环,这样您只需执行一次。

答案 1 :(得分:0)

我正在使用OpenGL进行绘画。而要做UNDO和REDO,就是把点数保持在“touchesMoved”中。然后,使用renderLineFromPoint,这非常缓慢地再现了这些点。我通过使用以下代码绘制所有点来解决这个问题。希望你能像我一样工作,让你快乐:)

NSMutableArray *puntos;


// this code in renderLineFromPoint
    NSData  * pointObject = [NSData dataWithBytes:&start length:sizeof(CGPoint)];
    [puntos addObject:pointObject];
    pointObject = [NSData dataWithBytes:&end length:sizeof(CGPoint)];
    [puntos addObject:pointObject];



// Drawings a line onscreen based on points in nsmutable array 
- (void) renderLineFromPoints:(NSMutableArray *) ptos
{
    static GLfloat*     vertexBuffer = NULL;
    static NSUInteger   vertexMax = 64;
    NSUInteger          vertexCount = 0,
    count,
    i;

    [EAGLContext setCurrentContext:context];
    glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);

    CGFloat scale = self.contentScaleFactor;

    CGPoint start;
    CGPoint end;

    for (int j=0; j < ptos.count; j++){
        // Convert locations from Points to Pixels
        start = *(CGPoint*)[[ptos objectAtIndex:j] bytes];
        end = *(CGPoint*)[[ptos objectAtIndex:j+1] bytes];
        start.x *= scale;
        start.y *= scale;
        end.x *= scale;
        end.y *= scale;

        // Allocate vertex array buffer
        if(vertexBuffer == NULL)
            vertexBuffer = malloc(vertexMax * 2 * sizeof(GLfloat));

        // Add points to the buffer so there are drawing points every X pixels
        count = MAX(ceilf(sqrtf((end.x - start.x) * (end.x - start.x) + (end.y - start.y) * (end.y - start.y)) / kBrushPixelStep), 1);

        for(i = 0; i < count; ++i) {
            if(vertexCount == vertexMax) {
                vertexMax = 2 * vertexMax;
                vertexBuffer = realloc(vertexBuffer, vertexMax * 2 * sizeof(GLfloat));
            }

            vertexBuffer[2 * vertexCount + 0] = start.x + (end.x - start.x) * ((GLfloat)i / (GLfloat)count);
            vertexBuffer[2 * vertexCount + 1] = start.y + (end.y - start.y) * ((GLfloat)i / (GLfloat)count);
            vertexCount += 1;
        }

        j++; // de 2 en 2
    }

    // Render the vertex array
    glVertexPointer(2, GL_FLOAT, 0, vertexBuffer);
    glDrawArrays(GL_POINTS, 0, vertexCount);

    // Display the buffer
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
    [context presentRenderbuffer:GL_RENDERBUFFER_OES];
}