我使用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];
}
不幸的是0.01秒的延遲不是原因。這些段是完整的人手勢,而不是連接觸點的段。全字母S是單個段,字母H是三個。這可以通過在延遲處設置斷點來輕鬆驗證。正如我所說,消除延遲沒有任何明顯的影響。 –
@Amiram。很公平。我看了一下示例代碼。答案已更新。 –
謝謝......它確實有幫助,但還不夠。我把所有我能想到的東西都移到了循環之外,儘管比以前更快,但仍然看起來很動人。使用Quartz 2D仍然快得多。 –