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