我正在使用按需渲染构建自定义GLKView
。大多数情况下,视图只会重新绘制触摸事件(并且这是行得通的),但有时会有短的动画,我想在循环中重绘。从GLKView drawRect调用setNeedsDisplay with/without dispatch_async
我第一次尝试是这样的:
-(void)drawRect:(CGRect)rect {
NSLog(@"Jo");
glClearColor(1, 0, 0, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
[self setNeedsDisplay];
}
我的理解,从Android
未来是,这应保持尽可能快地清除屏幕和记录大量的“乔”的。 实际情况是什么“乔”记录每秒大约一次,观点根本就不会被清除,但CPU
使用保持为0
如果我改变
[self setNeedsDisplay];
到
dispatch_async(dispatch_get_main_queue(), ^{
[self setNeedsDisplay];
});
一切正如预期一样。
据我所知,drawRect
无论如何都是从主线程调用的,那么为什么dispatch_async
会有所作为?
所以现在我有三个问题:
- 什么在那一秒的“乔”日志之间是怎么回事?
- 为什么
dispatch_async
有所作为? - 在生产中使用这种方法不好吗?
非常感谢!
编辑:
有一件事我不明白。
当我使用[self setNeedsDisplay];
方法时,主队列上的所有其他调用似乎都很匮乏。触摸事件不再触发,并且RestKit的回调不会传递。不知何故[self setNeedsDisplay];
不会在队列末尾添加,但在开始?