當滾動視圖滾動時,Brad Larson爲CADisplayLink
凍結問題提供了solution。即使我沒有滾動,爲什麼dispatch_semaphore_wait()始終返回YES?
我的OpenGL ES繪製方法是由CADisplayLink
調用的,我嘗試了Brad的技術,但無法使其工作。核心問題是我的OpenGL ES視圖由UIScrollView
託管,當U IScrollView
滾動時,CADisplayLink
停止觸發。
描述布拉德應該讓CADisplayLink
繼續開火,即使在滾動(將其添加到NSRunLoopCommonModes
而不是默認的runloop模式),並且使用一個奇特的信號欺騙呈現回調的技術應該確保它不當UIKit被佔用太多時渲染。
問題是雖然信號量技巧阻止渲染回調繪製,不管怎麼樣。
首先,我創建在我的這樣的OpenGL ES視圖的initWithFrame
方法串行GCD隊列和信號量(在主線程):
frameRenderingQueue = dispatch_queue_create("com.mycompany.crw", DISPATCH_QUEUE_SERIAL);
frameRenderingSemaphore = dispatch_semaphore_create(1);
顯示鏈接被創建並添加到NSRunLoopCommonModes
:
CADisplayLink *dl = [[UIScreen mainScreen] displayLinkWithTarget:self selector:@selector(renderFrame)];
[dl addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
渲染回調執行布拉德的技術:
- (void)renderFrame {
if (dispatch_semaphore_wait(frameRenderingSemaphore, DISPATCH_TIME_NOW) != 0) {
NSLog(@"return"); // Gets called ALWAYS!
return;
}
dispatch_async(drawingQueue, ^{
@autoreleasepool {
// OpenGL ES drawing code
dispatch_semaphore_signal(frameRenderingSemaphore);
}
});
}
dispatch_semaphore_wait
函數總是返回YES
,因此render回調從不呈現。即使我沒有滾動。
我想我錯過了重要的東西在這裏。有人能指出嗎?
編輯:這似乎只有當我打電話dispatch_sync
而不是dispatch_async
,但根據布拉德dispatch_async
會在這裏給更好的表現工作。