GLPaint - это действительно так медленно? - PullRequest
0 голосов
/ 26 августа 2011

Я решил использовать пример Apple GLPaint (http://developer.apple.com/library/ios/#samplecode/GLPaint) для рисования пальцем.

Однако я заметил, что воспроизведение записанных данных в образце ОЧЕНЬ медленно. Я прошел по коду и не смогНе найдено никаких искусственных задержек (задержка составляет 0,01 секунды перед прорисовкой каждого отрезка, но это не объясняет, почему воспроизведение в целом происходит так медленно, и производительность не меняется, если эта задержка будет удалена).* Мне нужно иметь возможность записывать данные в мое приложение и показывать их по запросу пользователя, но данные должны отображаться немедленно, а не как анимация.

Я не могу просто сохранить окончательное изображение, потому что янужны фактические точки.

Рисование в OpenGL ES действительно такое медленное, или я что-то упустил?

Ответы [ 2 ]

1 голос
/ 26 августа 2011

Механизм рисования настроен на вызов -presentRenderbuffer: после подключения каждой точки касания. Если вы хотите нарисовать все сразу, уберите задержку в 0,01 с, зациклите всю геометрию и нарисуйте ее одновременно, и переместите установку / представление рендербуфера из цикла, чтобы вы делали это только один раз.

0 голосов
/ 22 мая 2013

Я использую 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];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...