簡體   English   中英

OpenGL ES 2.0 iPhone - 在后台線程塊主線程上渲染

[英]OpenGL ES 2.0 iPhone - Rendering on background thread block main thread

我在后台線程上使用與主線程不同的EAGLContext渲染OpenGL上下文。

我使用這樣的東西:

- (void)renderInBackground {
      EAGLContext *context = [[EAGLContext] alloc] init];
      [EAGLContext setCurrentContext:context];


       Rendering..
    }

但是,即使這是在后台線程中執行,當使用重型着色器時,主線程也會被阻塞,並且UI會卡住。

為什么后台線程阻塞主線程? 方法不同步。

您確實擁有有限的CPU和GPU資源來執行所有渲染和UI交互,因此如果您最大化GPU,您將減慢應用程序中的所有其他內容。

也就是說,您應該能夠在后台線程上呈現而不會完全停止所有UI元素。 我在我的開源Molecules應用程序中做了一些相當強烈的渲染,所有這些都使用了后台GCD隊列,但你仍然可以在彈出窗口中滾動並以其他方式與界面交互。

我在這個答案中描述了我使用的過程,但是基本設置是一個單寬的GCD隊列,它依賴於一個調度信號量來防止在一個渲染幀被處理時排隊。 線程和塊對它們有一些開銷,因此如果它們被觸發的速度快於它們可以處理的速度,則可能導致資源耗盡。 信號量阻止了這一點。

在此隊列中包含與我的OpenGL ES上下文的所有交互提供了對此共享資源的無鎖使用,並且我發現在多核設備上的主線程上簡單地運行此操作會顯着提升性能。 正如我所說,在這里,即使是重度渲染,我仍然可以與UI進行交互。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM