天下武功卒茬,唯快不破
最近網(wǎng)友問了關(guān)于點(diǎn)云岔乔、傾斜攝影數(shù)據(jù)的性能優(yōu)化問題酥筝。本來想刀槍劍戟、斧鉞勾叉給弄了雏门,但是后來想性能其實(shí)是個(gè)系統(tǒng)問題嘿歌,要在第22節(jié)分成數(shù)小節(jié)扎扎實(shí)實(shí)的講一講。
鳴謝
非常感謝王銳王大神的cookbook茁影,我準(zhǔn)備主要參考它里面關(guān)于性能的一章宙帝。也就是第8章。本節(jié)講述性能優(yōu)化的最基本的手段:合并幾何體募闲。
本節(jié)資源
本文集包括本節(jié)所有資源包括模型代碼都在此下載步脓,按節(jié)的序號(hào)有文件或文件夾:
注意:務(wù)必使用瀏覽器打開:
鏈接:https://pan.baidu.com/s/13gwJLwo_LbRnN3Bl2NXXXw
提取碼:xrf5
使用方法:注釋掉第32行的宏MERGE_GEOMETRY你會(huì)得到優(yōu)化前后的結(jié)果
理論知識(shí)
OSG最終繪制的都是osg::Geometry,然后Geometry會(huì)存放在Node里。比如我們要繪制10條線靴患,那么我們有兩種方法仍侥,一種方法是定義10個(gè)Geometry,每個(gè)Geometry定義兩個(gè)頂點(diǎn)繪制1條線鸳君。另一個(gè)方法是我們定義1個(gè)Geometry访圃,里面放20個(gè)頂點(diǎn),一次性繪制10條線相嵌。這兩種方法的性能差異很大腿时。
方法一因?yàn)槎x了10個(gè)Geometry,那么CPU端就會(huì)做Event饭宾、Cull批糟、Update、Draw都會(huì)針對(duì)10個(gè)結(jié)點(diǎn)來做看铆,很花性能徽鼎。GPU也會(huì)接受10次來自CPU端的數(shù)據(jù),之間通信也會(huì)增加弹惦,GPU端的繪制工作量也會(huì)增加變緩否淤。如下是cookbook8,繪制了300x300=90000個(gè)Geometry棠隐。每個(gè)Geometry只有4個(gè)頂點(diǎn)時(shí)的數(shù)據(jù)繪制效率:
我們可以看到幀率只有2.46幀石抡,筆者用的是DEBUG模式。顯卡是GTX1650Ti助泽,顯存4G啰扛。從圖中可以看到大量的時(shí)間花在了cull和draw上。尤其是cull嗡贺,因?yàn)榻Y(jié)點(diǎn)數(shù)量多了隐解,哪怕只以視錐體做揀選cull的時(shí)間就會(huì)很長。
而方法二是只定義1個(gè)Geometry诫睬,壓入了300x300x4=36萬個(gè)頂點(diǎn)煞茫,也是90000個(gè)四邊形,一個(gè)四邊形是4個(gè)頂點(diǎn)摄凡。繪制的結(jié)果是一模一樣的续徽,但是其性能就會(huì)大幅提升:
可以看到,因?yàn)橹挥幸粋€(gè)結(jié)點(diǎn)架谎,沒有什么好揀選的炸宵,于是cull的時(shí)間大幅縮短。Draw和GPU的時(shí)間也均有優(yōu)化谷扣。
總之來說土全,將多個(gè)Geometry合并成一個(gè)Geometry幾乎是業(yè)界普遍認(rèn)為最簡單捎琐、最有效、最普遍裹匙、最應(yīng)該使用的優(yōu)化方法瑞凑。也就是我們追究求的就是CPU盡量少次多量的向GPU提交數(shù)據(jù)。
OSG中的合并工具
OSG有個(gè)類叫做osgUtil::Optimizer概页,大家打開后就發(fā)現(xiàn)里面有好多的優(yōu)化都在里面籽御,其中就有:MERGE_GEOMETRY,當(dāng)我們使用如下語句時(shí)惰匙,正常的就會(huì)將結(jié)點(diǎn)的Geometry進(jìn)行合并:
osgUtil::Optimizer optimizer;
optimizer.optimize(loadedModel.get());
看其內(nèi)部使用了一個(gè)工具類的方法叫做:
MergeGeometryVisitor mgv(this);
mgv.setTargetMaximumNumberOfVertices(10000);
node->accept(mgv);
它的思想也很簡單技掏,先把Group給一級(jí)一級(jí)合,然后多個(gè)Geometry合成一樣项鬼。能合并的PrimitiveSet也者合并哑梳。
osgUtil::Optimizer只能進(jìn)行一些通用的合并。我們理解了思想之后就可以手動(dòng)的或者自己針對(duì)自己的場景寫個(gè)性化的工具绘盟,以免不想合的被合了鸠真,想合的合不了。
代碼解析
這一節(jié)的代碼實(shí)在是有點(diǎn)簡單龄毡,沒有什么好解析的吠卷,可以從網(wǎng)盤上自己下載下來看看就明白了本節(jié)所描述的觀點(diǎn)了。