2011-09-20 123 views
1

我一直在學習OpenGL ES 2.0/GLSL和相關的iOS怪癖,通過查看代碼和開發人員視頻,我注意到從來沒有提到異步着色器編譯。除了講師,作家或推銷員(呃,工程師)擔心增加他們的例子的複雜性之外,是否有這個原因呢?例如,大多數Web數據檢索教程都會回顧需要做某種體操(pthreads,NSOperation,GCD,以異步實例方法烘焙等),以防止阻塞主線程 - 爲什麼會阻止應用程序發射被認爲可以接受?爲什麼不在後臺線程上編譯着色器?

回答

1

同步兩個EAGLContext可能有點棘手,除此之外,在後臺加載這種東西(通常是加載各種資源,紋理,着色器等)沒有任何反應。

可能真正的原因是,大多數人認爲OpenGL(ES)是單一的,只能在單一線程上工作,或者他們從來沒有加載時間的問題,使得它值得在後臺線程中加載或他們只是不在乎(對於一些人來說,它可能是一切)。

對於你的最後一個問題:網絡可以添加一個巨大的延遲和「可以」我的意思是「將」。與網絡訪問相比,資源加載並不是問題,與加載着色器或紋理相比,加載着色器或紋理花費的時間更少,並且已知它會在正常情況下花費多少時間。此外,人們習慣於在遊戲中加載屏幕,而他們不希望在滾動表格視圖時看到加載屏幕,以便您的應用程序可以從未響應的服務器獲取圖片。

+0

所以,解釋你的回答:1)這不是不可能的,只是困難的2)延遲可能不會影響到足夠的用戶是值得的。感謝您的輸入! – user396030

+0

@ Mr.Pleasant - 對於這裏的一些具體數字,我認爲我的九個着色器程序總共需要在iPad 1上編譯200毫秒,而且如果沒有編譯它們,我就不能顯示任何東西,所以我從來沒有想過要將它們卸載到後臺線程。我的實際OpenGL ES渲染是在後臺使用GCD串行調度隊列完成的,並且這確實會在多核iPad 2和iPhone 4S上帶來不錯的性能提升。 –

+0

我知道這是一個古老的線程,有沒有人設法做到這一點? – Burf2000