我在ipad应用程序中遇到了一个非常奇怪的故障。它非常简单:我只使用“touchesMoved”处理程序在两点之间绘制一条线。由于我希望线条留在屏幕上,我不会在我的绘图功能中调用“glClear”,但由于某些原因,某些线条会掉线,而且看起来完全随机。更奇怪的是,它在模拟器中完美运行。有没有人知道为什么会这样?我已经包含了我的触摸和绘制程序。
非常感谢!
皮特
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
NSSet *allTouches = [event allTouches];
switch ([allTouches count])
{
case 1:
{ //Single touch
} break;
case 2:
{ //Double Touch
UITouch *touch1 = [[allTouches allObjects] objectAtIndex:0];
CGPoint location1 = [touch1 locationInView: [touch1 view]];
UITouch *touch2 = [[allTouches allObjects] objectAtIndex:1];
CGPoint location2 = [touch2 locationInView: [touch2 view]];
[self drawLineWithStart:location1 end:location2];
} break;
default:
break;
}
}
- (void)drawLineWithStart:(CGPoint)start end:(CGPoint) end
{
[EAGLContext setCurrentContext:context];
glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);
GLfloat lineVertices[] =
{
(start.x/(768.0/2.0)) - 1.0, -1.5 * ((start.y/(1024.0/2.0)) - 1.0),
(end.x/(768.0/2.0)) - 1.0, -1.5 * ((end.y/(1024.0/2.0)) - 1.0)
};
glDisable(GL_TEXTURE_2D);
// Render the vertex array
glVertexPointer(2, GL_FLOAT, 0, lineVertices);
glDrawArrays(GL_LINE_STRIP, 0, 2);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
[context presentRenderbuffer:GL_RENDERBUFFER_OES];
}
答案 0 :(得分:1)
此代码在双缓冲上下文中执行presentRenderBuffer而没有清除。这意味着它绘制到一个缓冲区,呈现它,绘制到另一个缓冲区,呈现它等。因此,没有一个可见缓冲区具有所有线条绘制,交换(存在)将显示交替缓冲区中的差异。模拟器双缓冲方案与解释您所看到的差异的物理设备不同。
累积数据结构中的行。每个框架都清除然后绘制所有线条。
答案 1 :(得分:0)
根据具体情况,您也可以保留支持。这将解决您的问题,但会降低您的性能。
在OpenGLES2DView.m中将kEAGLDrawablePropertyRetainedBack更改为YES。它看起来像这样:
eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], kEAGLDrawablePropertyRetainedBacking, kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat, nil];
但重申一下,它会耗费性能,不过我会说如果你正在尝试编写一个绘图应用程序(从外观上看)它可能就是你要找的东西。由于在绘制应用程序时,重新运行逻辑以重绘每一帧并不是一个好主意,这是一个很好的解决方案。