【发布时间】:2015-06-02 19:12:32
【问题描述】:
我正在使用按需渲染构建自定义 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]; 是否不会以某种方式添加到队列的末尾,而是添加到队列的开头?
【问题讨论】: