2011-08-26 97 views
0

我考慮使用Apple的GLPaint示例(http://developer.apple.com/library/ios/#samplecode/GLPaint)來做一些手指繪畫。GLPaint - 它真的很慢嗎?

但是,我注意到樣本中記錄數據的回放非常慢。我瀏覽了代碼並找不到任何人工延遲(在繪製每條線段之前有0.01秒的延遲,但這並不能解釋爲什麼整個回放速度如此之慢,並且如果消除了延遲,性能不會改變)。

我需要能夠在我的應用程序中記錄數據並在用戶詢問時顯示,但數據應立即顯示而不是動畫。

我不能保存最終圖像,因爲我需要實際的點。

在OpenGL ES中繪製真的很慢,還是我錯過了什麼?

回答

1

繪製機制設置爲在連接每個觸摸點後調用-presentRenderbuffer:。如果要一次繪製所有內容,請取消0.01秒的延遲,循環遍歷所有幾何圖形並同時繪製它,並將渲染緩衝區的設置/呈現從循環中移出,以便只執行一次。

+0

不幸的是0.01秒的延遲不是原因。這些段是完整的人手勢,而不是連接觸點的段。全字母S是單個段,字母H是三個。這可以通過在延遲處設置斷點來輕鬆驗證。正如我所說,消除延遲沒有任何明顯的影響。 –

+0

@Amiram。很公平。我看了一下示例代碼。答案已更新。 –

+0

謝謝......它確實有幫助,但還不夠。我把所有我能想到的東西都移到了循環之外,儘管比以前更快,但仍然看起來很動人。使用Quartz 2D仍然快得多。 –

0

我使用OpenGL繪畫。爲了做UNDO和REDO,在一系列要點上保持了「觸及移動」點。然後,使用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]; 
}