PowerVR架構(gòu)能快速支持最新的技術(shù),Vulkan API便是實(shí)證。Vulkan是一款現(xiàn)代的API,使開發(fā)人員能夠獲得底層圖像硬件的“低級”訪問權(quán)限,確保硬件性能的最大化。
任何需要顯示大量數(shù)據(jù)的應(yīng)用程序(如導(dǎo)航軟件)便是Vulkan的絕佳使用案例。導(dǎo)航應(yīng)用程序需要大量的后臺處理,使大量的相關(guān)信息盡可能以較高的幀速率進(jìn)行渲染。在這里,我將詳細(xì)介紹最新的衛(wèi)星導(dǎo)航演示系統(tǒng),我將闡述其如何利用Vulkan圖像API、對比Vulkan與OpenGL ES的性能、闡釋為何PowerVR適合運(yùn)行這類使用了現(xiàn)代圖像API(如Vulkan)的程序。
Vulkan and OpenGL ES
首先,讓我們先回顧Vulkan和OpenGL ES之間的差異。與OpenGL ES相比,Vulkan基本上設(shè)計(jì)有完全和明確的控制,其中包括對多線程分布工作負(fù)載的嚴(yán)格控制。
GPU資源可以在一個線程上分配,而其他GPU可以同步在另一個線程上工作。此外, OpenGL ES是調(diào)用GPU命令,并隨后立即執(zhí)行;而在Vulkan中,命令則“記錄”在命令緩沖區(qū)(基本上只是一個指令列表)。隨后,整個命令緩沖區(qū)將提交給GPU用于渲染。這種結(jié)構(gòu)意味著,對于開發(fā)人員而言,命令提交是完全可預(yù)測的。當(dāng)渲染命令發(fā)送至GPU時,他們可以準(zhǔn)確控制,而這與OGLES恰恰相反。在OGLES中,有些GPU命令在調(diào)用時不會執(zhí)行,而是在渲染循環(huán)中的其他任意點(diǎn)執(zhí)行——超出了開發(fā)人員的控制范圍。更為關(guān)鍵的是,假設(shè)內(nèi)容不變,命令緩沖區(qū)在每幀渲染時會被再次使用。這樣,每一幀它們都將被再次記錄,并再次提交。OpenGL ES中則不存在這種構(gòu)造。
此外,命令緩沖區(qū)可以由多個二級緩沖區(qū)構(gòu)成,使這部分圖像工作負(fù)載在每幀被再次記錄時可以得到很好地控制。記錄一次后則只剩下靜態(tài)緩沖區(qū),動態(tài)緩沖區(qū)則在所要求的時間間隔內(nèi)被再次記錄。這個間隔通常為一幀,但也不一定。
衛(wèi)星導(dǎo)航系統(tǒng)的架構(gòu)
現(xiàn)在的問題是,這如何映射到衛(wèi)星導(dǎo)航應(yīng)用程序中?對于我們的衛(wèi)星導(dǎo)航演示系統(tǒng),我們使用來自O(shè)penStreetMap.org的映射數(shù)據(jù),這樣便能夠查詢指定貼圖區(qū)域內(nèi)所有映射元素的數(shù)據(jù)庫。這是一種常見且直觀的處理數(shù)據(jù)的方式,十分適合Vulkan,因?yàn)檫@意味著,我們可以將每個貼圖所有的渲染命令記錄至自己的命令緩沖區(qū)中。由于映射數(shù)據(jù)永遠(yuǎn)不會改變,因此只需要處理一次。
攝像機(jī)掠過映射圖時,我們需要在新貼圖中進(jìn)行定期加載,但應(yīng)用程序又需要保持響應(yīng)——我們無法停止主線程。有了Vulkan,便可以在新貼圖中分配GPU資源,并在單獨(dú)的工作線程中記錄其命令緩沖區(qū),且不用分配主線程,這樣便可以在輸入中進(jìn)行渲染和響應(yīng)。對于這個應(yīng)用程序,有一個額外的工作線程便足矣,但如果我們有需要,可以一次生成多個線程來處理更多的貼圖。這甚至可以動態(tài)地?cái)U(kuò)展,基于有多少CPU資源可以使用,或者設(shè)備功率是否需要被管理。這些在OpenGL ES中是非常重大的,但卻是Vulkan設(shè)計(jì)中最基本的部分。
正如貼圖可見,其又可以不可見,這意味著命令緩沖區(qū)將被釋放。當(dāng)貼圖可見時,并非是解除分配和再次分配,而是在從命令池對象中預(yù)分配一組緩沖,再從這組緩沖中,對使用過的緩沖進(jìn)行循環(huán),這樣便可以降低應(yīng)用程序的動態(tài)內(nèi)存分配成本。
PowerVR
相比先前的API,Vulkan使PowerVR可以以更高的效率處理這些任務(wù)。作為基于貼圖的延遲渲染器(TBDR),我們的硬件能夠充分利用所需的信息進(jìn)行預(yù)渲染。Vulkan使用“渲染通道”結(jié)構(gòu)(由包含命令緩沖區(qū)的子通道組成)來定義渲染工作。相比單個的繪制調(diào)用,這更像基于貼圖的渲染器所使用的基本工作單元。這些結(jié)構(gòu)于貼圖器而言也很便利,因?yàn)樗鼈兛梢苑乐乖诶L制調(diào)用之間出現(xiàn)幀沖刷,不然,則需要對貼圖進(jìn)行多次渲染。為更深入地了解這層含義及PowerVR架構(gòu)如何與Vulkan有效合作,請閱讀托拜厄斯·赫克托所撰寫的文章。
PowerVR SDK關(guān)鍵詞
Vulkan編寫的這款應(yīng)用程序使用了PowerVR SDK,這表示,生成OpenGL ES版則非常簡單。SDK反映了Vulkan API架構(gòu),但對底層API進(jìn)行了抽象化,所以相同的代碼只適用于Vulkan和OpenGL ES。唯一重大的變更便是描述符集(OpenGL ES沒有這些概念),且將GPU資源分配到主線程中。此外,使用SDK也意味著,在所有的平臺上(Android、Windows和Linux),相同的代碼僅僅只是工作,不會制造麻煩。
性能對比
讓我們將Vulkan和OpenGL ES的演示進(jìn)行對比。以下視頻和圖像都是在基于Android的Nexus Player上運(yùn)行所生成的——一款包含了PowerVR G6430 GPU的消費(fèi)設(shè)備。從視頻中可以看出,Vulkan應(yīng)用不斷呈現(xiàn)更高的幀率,加載新貼圖時性能也未出現(xiàn)明顯下降。相反,在OpenGL ES中,基本幀率則較低,因?yàn)樾枰龃罅康墓ぷ鱽砀嬖VGPU每幀的任務(wù)是什么。同時,加載新內(nèi)容時還會出現(xiàn)斷斷續(xù)續(xù)的情況,因?yàn)橹骶€程必須中斷后分配GPU資源。
映射數(shù)據(jù)由? OpenStreetMap貢獻(xiàn)。這些數(shù)據(jù)在開放數(shù)據(jù)庫許可時可用。
看看上述的性能圖。Vulkan運(yùn)行的幀速率十分穩(wěn)固,為每秒60幀(FPS),且CPU使用率一直很低——平均不到30%。而OpenGL ES如預(yù)期一般,一旦加載所有的內(nèi)容,幀速率便在24FPS和27FPS之間徘徊,且總體CPU使用率更高,甚至有一個內(nèi)核完全是超負(fù)荷運(yùn)行。因此,很顯然,相同的工作負(fù)載,Vulkan的性能要優(yōu)于OpenGL ES。
總結(jié)
雖然OpenGL ES仍有許多有效的用例,但Vulkan才是更適于處理渲染衛(wèi)星導(dǎo)航應(yīng)用等任務(wù)的API,且PowerVR可以將效率最大化。Vulkan融入了現(xiàn)代的設(shè)計(jì)理念,如多線程等,當(dāng)頻繁讀取新的動態(tài)映射數(shù)據(jù)時,這一點(diǎn)尤為重要,其不會干擾主線程,因而可以更自由地渲染內(nèi)容,同時又可以保持一個交互式的幀速率。這只是Vulkan配以PowerVR TBDR架構(gòu)的一個案例,在這個例子中,開發(fā)人員最充分地發(fā)揮了其應(yīng)用程序的性能。
英文鏈接:https://www.imgtec.com/blog/vulkan-3d-satnav-app-powervr/
評論