多核移動設備上3d模型的并發(fā)加載及渲染方法
【專利摘要】本發(fā)明涉及一種在多核移動設備上的3D模型并發(fā)加載及渲染方法,本發(fā)明包括以下步驟:以當前設備的CPU核心數(shù)作為線程池的容量來創(chuàng)建線程池。然后分別為存于外存設備上的每個3D模型文件分別創(chuàng)建3D模型數(shù)據(jù)加載任務。再為每個3D模型分別創(chuàng)建渲染任務。將所有數(shù)據(jù)加載任務提交到線程池的緩沖隊列中,由線程池并發(fā)執(zhí)行數(shù)據(jù)加載任務。等數(shù)據(jù)加載任務全部執(zhí)行完畢之后,再將渲染任務提交到線程池的緩沖隊列中,由線程池并發(fā)執(zhí)行渲染任務。最后等所有渲染任務執(zhí)行完畢后,銷毀線程池釋放系統(tǒng)資源。
【專利說明】多核移動設備上3D模型的并發(fā)加載及渲染方法
【技術領域】
[0001]本發(fā)明屬于嵌入式軟件領域。尤其涉及一種在多核移動設備上的3D模型并發(fā)加載及渲染方法。
【背景技術】
[0002]隨著嵌入式技術的不斷發(fā)展,以智能手機、平板電腦為首的移動設備得到了迅猛的發(fā)展。移動設備的中央處理器從以前的單核心一直發(fā)展到現(xiàn)在的雙核心、四核心甚至是八核心。在3D應用方面,多核移動設備不但能展示復雜的3D圖形,甚至能運行大型的3D游戲。
[0003]對于復雜場景的3D應用來說,需要加載及渲染多個3D模型?,F(xiàn)有的方法是先將所有的3D模型文件以串行的方式加載至內存中,然后以串行的方式逐個渲染。然而在多核移動設備中,這種串行的3D處理方法并不能發(fā)揮多核處理器的優(yōu)勢來提高3D處理速度。
【發(fā)明內容】
[0004]本發(fā)明所需要解決的技術問題在于提供一種在多核移動設備上的3D模型并發(fā)加載及渲染方法。
[0005]本發(fā)明解決技術問題所采取的技術方案如下:
[0006]在加載及渲染3D模型前先判斷當前移動設備的CPU核心數(shù)。以當前設備的CPU核心數(shù)作為線程池的容量來創(chuàng)建線程池。然后分別為存于外存設備上的每個3D模型文件分別創(chuàng)建3D模型數(shù)據(jù)加載任務。數(shù)據(jù)加載任務用來加載3D模型文件的頂點數(shù)據(jù)、法向量數(shù)據(jù)、紋理坐標數(shù)據(jù)、面數(shù)據(jù)、材質數(shù)據(jù)至內存。再為每個3D模型分別創(chuàng)建渲染任務。最后再將所有數(shù)據(jù)加載任務提交到線程池的緩沖隊列中,由線程池并發(fā)執(zhí)行數(shù)據(jù)加載任務。等數(shù)據(jù)加載任務全部完成之后,將渲染任務提交到線程池的緩沖隊列中,由線程池并發(fā)執(zhí)行渲染任務。最后等所有渲染任務執(zhí)行完畢后,銷毀線程池釋放系統(tǒng)資源。
[0007]本發(fā)明相對于現(xiàn)有技術具有以下有益效果:本發(fā)明根據(jù)移動設備的中央處理器核心數(shù)來創(chuàng)建線程池。線程池以中央處理器核心數(shù)個工作線程來并發(fā)執(zhí)行異步3D模型文件數(shù)據(jù)加載任務、異步3D模型渲染任務。整個過程充分發(fā)揮了多核移動設備的處理性能。并且每個任務都以異步方式執(zhí)行,消除了每個任務之間的同步開銷。因此可以大大提高多核移動設備加載和渲染3D模型的速度。
【專利附圖】
【附圖說明】
[0008]圖1是本發(fā)明的流程圖。
【具體實施方式】
[0009]以下結合附圖對本發(fā)明作進一步說明。
[0010]如圖1所示,多核移動設備上3D模型的并發(fā)加載及渲染方法包括如下步驟:[0011]步驟一:獲取當前移動設備的CPU核心數(shù),具體是:
[0012]根據(jù)移動設備所使用的操作系統(tǒng),直接使用操作系統(tǒng)提供的API或者通過判斷文件系統(tǒng)中存放CPU信息的文件數(shù)來獲取當前移動設備的CPU核心數(shù)。操作系統(tǒng)包括但不限于IOS系統(tǒng)及Android系統(tǒng)。
[0013]對于IOS操作系統(tǒng)的移動設備,可使用"sysctlbyname"函數(shù)來獲取CPU的核心數(shù);
[0014]對于Android操作系統(tǒng)的移動設備,通過判斷"/ sys / devices / system /cpu /"目錄下記錄CPU信息的文件數(shù)來獲取CPU的核心數(shù)。記錄CPU信息的文件數(shù)即為CPU的核心數(shù);
[0015]步驟二:創(chuàng)建容量為CPU核心數(shù)的線程池,具體是:
[0016]創(chuàng)建一個整型的線程池數(shù)變量nThread,將由第一步得到的CPU核心數(shù)賦給變量nThread ;
[0017]使用移動設備所使用的操作系統(tǒng)的應用程序開發(fā)工具包中的線程池類創(chuàng)建容量為nThread的線程池,操作系統(tǒng)包括但不限于IOS系統(tǒng)及Android系統(tǒng);
[0018]對于IOS操作系統(tǒng)的移動設備,使用IOS應用程序開發(fā)工具包中的"NSOperation"來創(chuàng)建線程池,使用
[0019]" queue setMaxConcurrentOperationCount:nThread"語句設置線程池的容量為 nThread ;
[0020]對于Android操作系統(tǒng)的移動設備,可使用Android應用程序開發(fā)工具包中的"Executors "類來幫助創(chuàng)建線程池。具體使用"Executors.newFixedThreadPool (nThread)"來創(chuàng)建容量為 nThread 的線程池;
[0021]步驟三:為每個3D模型文件分別創(chuàng)建異步數(shù)據(jù)加載任務,具體是:
[0022]先遍歷存于外存設備上的3D模型文件,獲取每個模型文件的存放路徑,并且置于數(shù)組中;
[0023]再創(chuàng)建異步數(shù)據(jù)加載任務,具體任務流程是:
[0024]流程一:根據(jù)存于數(shù)組中的3D模型文件的文件路徑打開文件1/0 ;
[0025]所述的3D模型文件格式包括OBJ格式和3DS格式;
[0026]流程二:抽取存于外存設備上的3D模型文件的數(shù)據(jù),包括:頂點數(shù)據(jù)、法向量數(shù)據(jù)、紋理坐標數(shù)據(jù)、面數(shù)據(jù)、材質數(shù)據(jù);
[0027]流程三:將抽取的3D模型數(shù)據(jù)單獨封裝成一個數(shù)據(jù)對象;
[0028]總共創(chuàng)建的數(shù)據(jù)加載任務個數(shù)等于3D模型文件的個數(shù);
[0029]步驟四:為每個3D模型分別創(chuàng)建異步渲染任務,渲染任務流程具體是:
[0030]流程一:使用步驟三封裝的3D模型數(shù)據(jù)對象中的3D模型數(shù)據(jù),為畫筆綁定頂點數(shù)據(jù),法向量數(shù)據(jù),紋理坐標數(shù)據(jù)、面數(shù)據(jù),并且設置材質特性;
[0031]流程二:調用OpenGl ES的gl.glDrawElements函數(shù)來渲染3D模型。
[0032]總共創(chuàng)建的渲染任務個數(shù)等于3D模型文件的個數(shù);
[0033]步驟五:由線程池并發(fā)執(zhí)行所有的異步數(shù)據(jù)加載任務,具體是:
[0034]將由步驟三創(chuàng)建的所有異步數(shù)據(jù)加載任務提交到由步驟二所創(chuàng)建的線程池的緩沖隊列中;[0035]啟動線程池,并發(fā)地執(zhí)行緩沖隊列中所有異步數(shù)據(jù)加載任務。
[0036]步驟六:由線程池并發(fā)執(zhí)行所有的異步渲染任務,具體是:
[0037]等步驟五的異步數(shù)據(jù)加載任務全部執(zhí)行完畢后,將所有的渲染任務提交到由步驟二所創(chuàng)建的線程池的緩沖隊列中;
[0038]啟動線程池,并發(fā)地執(zhí)行緩沖隊列中所有異步渲染任務;
[0039]等所有異步渲染任務執(zhí)行完畢后,銷毀線程池釋放系統(tǒng)資源。
【權利要求】
1.多核移動設備上3D模型的并發(fā)加載及渲染方法,其特征包括以下步驟: 步驟一:獲取當前移動設備的CPU核心數(shù),具體是: 根據(jù)移動設備所使用的操作系統(tǒng),直接使用操作系統(tǒng)提供的API或者通過判斷文件系統(tǒng)中存放CPU信息的文件數(shù)來獲取當前移動設備的CPU核心數(shù)。 步驟二:創(chuàng)建容量為CPU核心數(shù)的線程池,具體是: 創(chuàng)建整型的線程池數(shù)變量,將該變量的值設置為由步驟一獲取的CPU核心數(shù); 以整型的線程池數(shù)變量作為線程池的容量參數(shù),使用移動設備所使用的操作系統(tǒng)的應用程序開發(fā)工具包中的線程池類來創(chuàng)建容量為CPU核心數(shù)的線程池。 步驟三:為每個3D模型文件分別創(chuàng)建異步數(shù)據(jù)加載任務,具體是: 先遍歷存于外存設備上的3D模型文件,獲取每個模型文件的存放路徑,并且置于數(shù)組中; 再創(chuàng)建異步數(shù)據(jù)加載任務,具任務流程是: 流程一:根據(jù)存于數(shù)組中的3D模型文件的文件路徑打開文件I / O ; 流程二:抽取存于外存設備上的3D模型文件的數(shù)據(jù),包括:頂點數(shù)據(jù)、法向量數(shù)據(jù)、紋理坐標數(shù)據(jù)、面數(shù)據(jù)、材質數(shù)據(jù); 流程三:將抽取的3D模型數(shù)據(jù)單獨封裝成一個數(shù)據(jù)對象。 步驟四:為每個3D模型分別創(chuàng)建異步渲染任務,渲染任務流程具體是: 流程一:使用步驟三封裝的3D模型數(shù)據(jù)對象中的3D模型數(shù)據(jù),為畫筆綁定頂點數(shù)據(jù),法向量數(shù)據(jù),紋理坐標數(shù)據(jù)、面數(shù)據(jù),并且設置材質特性; 流程二:調用OpenGl ES的gl.glDrawElements函數(shù)來渲染3D模型。 步驟五:由線程池并發(fā)執(zhí)行所有的異步數(shù)據(jù)加載任務,具體是: 將由步驟三創(chuàng)建的所有異步數(shù)據(jù)加載任務提交到由步驟二所創(chuàng)建的線程池的緩沖隊列中; 啟動線程池,并發(fā)地執(zhí)行緩沖隊列中所有異步數(shù)據(jù)加載任務。 步驟六:由線程池并發(fā)執(zhí)行所有的異步渲染任務,具體是: 等步驟五的異步數(shù)據(jù)加載任務全部執(zhí)行完畢后,將所有的渲染任務提交到由步驟二所創(chuàng)建的線程池的緩沖隊列中; 啟動線程池,并發(fā)地執(zhí)行緩沖隊列中所有異步渲染任務; 等所有異步渲染任務執(zhí)行完畢后,銷毀線程池釋放系統(tǒng)資源。
【文檔編號】G06F9/445GK103455356SQ201310406709
【公開日】2013年12月18日 申請日期:2013年9月5日 優(yōu)先權日:2013年9月5日
【發(fā)明者】王秀敏, 張麒, 單良 申請人:中國計量學院