W及根據(jù)精靈的材質(zhì)對排序后的精 靈進(jìn)行批量繪制,相對于相關(guān)技術(shù)中,對精靈進(jìn)行批量繪制時,需要邏輯層控制要求批量繪 制的精靈具備完全相同的繪制狀態(tài),導(dǎo)致邏輯層控制煩雜的問題,采用該方案處理,不僅解 決了相關(guān)技術(shù)中對精靈的批量繪制,需要邏輯層煩雜的控制,不僅大大浪費(fèi)了邏輯層的控 制資源,而且繪制效率也不高的問題,進(jìn)而達(dá)到了有效降低CPU的消耗,W及提高精靈繪制 效率的效果。
[0040] 在本實(shí)施例中提供的精靈繪制方法,較佳地,屬于一種非連續(xù)分布精靈自動批繪 制(Auto Batch Render)方法,彌補(bǔ)了相關(guān)技術(shù)中對精靈進(jìn)行批繪制時存在的不足。需要說 明的是,該方法可W基于多種場景,例如,可W基于cocos2d-x 2. X版本,即實(shí)現(xiàn)基于 cocos2d-x2.x版本下,精靈的批量繪制處理。下面W基于cocos2d-x2.x版本為例,對本發(fā) 明實(shí)施例的精靈繪制方法進(jìn)行描述。
[0041] 在依據(jù)精靈的全局Z值對待繪制精靈進(jìn)行排序之前,可W對待繪制精靈進(jìn)行緩存。 良P,改寫精靈的化aw函數(shù),僅將精靈信息放入全局?jǐn)?shù)組隊(duì)列進(jìn)行緩存,不繪制。
[0042] 在對精靈進(jìn)行批量繪制之前,需要進(jìn)行兩方面的準(zhǔn)備:一方面準(zhǔn)備是,需要依據(jù)精 靈的全局Z值對待繪制精靈進(jìn)行排序,即,繪制前對精靈按Global Z值(即上述的全局Z值) 進(jìn)行排序,需要進(jìn)行合并的精靈需要邏輯層指定正確的Global Z值。需要說明的是,該精靈 的該全局Z值用于表述精靈被遮擋的容易程度,例如,Z值越大精靈越不容易被遮擋,Z值越 小精靈越容易被遮擋。比如,精靈A的Z值為日,精靈B的Z值為b,并且,a大于b,那么精靈A相對 于精靈B來說越不容易被遮擋。舉例來說,對于材質(zhì)相同的精靈,在在兩種情況,一種情況 是,相同材質(zhì)精靈非連續(xù)同級分布;另一種情況是,相同材質(zhì)精靈非連續(xù)跨層級分布。針對 運(yùn)兩種情況下對精靈的排序,下面W圖的形式來說明。針對第一種情況,圖2是根據(jù)本發(fā)明 實(shí)施例的排序前相同材質(zhì)精靈非連續(xù)分布的示意圖,圖3是根據(jù)本發(fā)明實(shí)施例的排序后相 同材質(zhì)精靈連續(xù)分布的示意圖;針對第二種情況,圖4是根據(jù)本發(fā)明實(shí)施例的排序前相同材 質(zhì)精靈非連續(xù)跨層級分布的示意圖,圖5是根據(jù)本發(fā)明實(shí)施例的排序后相同材質(zhì)精靈連續(xù) 分布的示意圖。
[0043] 另一方面準(zhǔn)備是,需要確定精靈的材質(zhì),優(yōu)選地,確定排序后各個待繪制精靈的材 質(zhì)可W采用W下方式:獲取精靈的紋理屬性,精靈的著色化ader屬性,精靈的混合方式屬 性;將獲取的紋理屬性,Shader屬性,和混合方式屬性統(tǒng)一為材質(zhì)。即將紋理、shader、混合 方式統(tǒng)一為材質(zhì)ID,繪制時根據(jù)材質(zhì)ID判斷是否可W合并。
[0044] 在確定了上述兩方面后,就可W依據(jù)確定的各個待繪制精靈的材質(zhì),對排序后的 待繪制精靈進(jìn)行批量繪制。而在根據(jù)確定的各個待繪制精靈的材質(zhì),對排序后的待繪制精 靈進(jìn)行批量繪制時,依據(jù)考慮的方面不同,所采用的對應(yīng)處理也可W是多種,例如,在根據(jù) 確定的各個待繪制精靈的材質(zhì),對排序后的待繪制精靈進(jìn)行批量繪制之前,可W先判斷當(dāng) 前時間是否達(dá)到flush時機(jī),其中,flush時機(jī)包括:非精靈節(jié)點(diǎn)繪制時,或者,一帖結(jié)束時; 在判斷結(jié)果為是的情況下,在當(dāng)前時間,根據(jù)確定的各個待繪制精靈的材質(zhì),對排序后的待 繪制精靈進(jìn)行批量繪制。換句話說,Cocos2d-x 2.^精靈在化曰¥的時候,就已經(jīng)調(diào)用〇9611邑1 進(jìn)行繪制,在本發(fā)明實(shí)施例中,為了能夠達(dá)到批量繪制的目的,flush時開始繪制,flush時 機(jī)包括:非精靈節(jié)點(diǎn)繪制時和一帖結(jié)束時。
[0045] 又例如,根據(jù)確定的各個待繪制精靈的材質(zhì),對排序后的待繪制精靈進(jìn)行批量繪 制包括:判斷排序后的待繪制精靈中相鄰待繪制精靈的材質(zhì)是否相同;在判斷結(jié)果為是的 情況下,將相鄰的材質(zhì)相同的待繪制精靈進(jìn)行合并繪制。需要說明的是,在采用該方法繪制 精靈的過程中,子節(jié)點(diǎn)不需要在邏輯層手動添加到父節(jié)點(diǎn);也不需要邏輯保證子節(jié)點(diǎn)使用 的紋理與父節(jié)點(diǎn)相同;子節(jié)點(diǎn)的G1 oba 1 Z值會影響繪制的順序;子節(jié)點(diǎn)的頂點(diǎn)世界坐標(biāo)在 繪制前保存。該繪制批處理會將相鄰的紋理、shader、混合方式相同的精靈進(jìn)行合并。之后, 繪制命令中包含該精靈的模型視圖矩陣信息,繪制前各自轉(zhuǎn)換為世界坐標(biāo)。
[0046] 為體現(xiàn)采用上述方法進(jìn)行精靈批量繪制所帶來的良好效果,下面結(jié)合上述方法所 應(yīng)用的場景來對上述方法所帶來的有益效果進(jìn)行說明。
[0047] (1)繪制精靈數(shù)量較多時,批量繪制效果更好
[0048] 自動批繪制對帖率的提升,體現(xiàn)在有效降低了 CPU消耗,并沒有減少GPU的工作量, 因此,只有當(dāng)繪制精靈數(shù)量較多時效果才能明顯體現(xiàn),例如,待繪制精靈的個數(shù)不少于200 個,即至少繪制200W上個數(shù)的精靈時才考慮使用上述批量繪制。
[0049] (2)繪制精靈尺寸越小時,批量繪制的效果越好
[0050] 隨著精靈在屏幕最終顯示尺寸的增大,GPU會逐漸成為帖率提升的瓶頸,批繪制帶 來的提升效果也逐漸被淹沒。因此,批繪制適合繪制類似子彈,底圖小方格子等尺寸較小的 精靈。
[0051] (3)可W應(yīng)用于相同紋理的精靈非連續(xù)分布的場景
[0052] 相同紋理的精靈非連續(xù)分布時,無法使用cocos2dx自帶的CCSpriteBatcheNode進(jìn) 行批繪制。而ABR自動批繪制通過對Z值進(jìn)行排序可W解決該問題。
[0053] 基于上述各個場景,下面分別對各個場景所對應(yīng)的實(shí)施分別進(jìn)行說明。
[0054] (1)紋理大小、屏幕顯示尺寸對帖率的影響
[0055] 方法:在屏幕指定的3個位置,分別重疊繪制600個帶角度旋轉(zhuǎn)的精靈,采用不同的 紋理并將紋理縮放到不同尺寸。
[0化6] 結(jié)果1:紋理大小79*33
[0化7]
[0061] 結(jié)果3:精靈大小274*274
[0化引 [0化9]
[0060]
[0062]
[0063]
[0064] 結(jié)論分析:
[0065] 在精靈數(shù)量不變的情況下,CPU負(fù)載穩(wěn)定;
[0066] 隨著屏幕顯示尺寸的增加,像素計算量會增加,導(dǎo)致GPU逐漸成為帖率提升的瓶 頸;紋理原始尺寸越大,GPU隨顯示尺寸增加成為瓶頸的速度越快。
[0067] (2)精靈數(shù)目對帖率的影響
[0068] 方法:在屏幕指定的3個位置,分別重疊繪制不同個數(shù)固定大小帶角度旋轉(zhuǎn)的的精 靈。
[0069] 結(jié)果4:精靈大小79*33,屏巷顯不大小32*32
[0070]
[0071]
[0072] 結(jié)論分析:
[0073] 精靈個數(shù)較多時,CPU負(fù)載提升效果明顯;
[0074] 精靈個數(shù)對GPU負(fù)載幾乎沒有影響;
[0075] (3)精靈繪制次序?qū)μ实挠绊?br>[0076] 方法:在屏幕平鋪繪制滿屏帶角度旋轉(zhuǎn)的精靈,分別測試連續(xù)繪制和交叉繪制情 況。
[0077] 結(jié)果5:屏幕顯示大小64*64,精靈個數(shù)48 [007引
[0079] 圖6是根據(jù)本發(fā)明實(shí)施例的在屏幕平鋪繪制滿屏帶角度旋轉(zhuǎn)的精靈,在屏幕顯示 為大小64*64,精靈個數(shù)為48的情況下,分別連續(xù)繪制和交叉繪制時分別對應(yīng)的示意圖,如 圖6所示。
[0080] 結(jié)果6:屏幕顯示大小32*32,精靈個數(shù)150
[0081]
[0082] 圖7是根據(jù)本發(fā)明實(shí)施例的在屏幕平鋪繪制滿屏帶角度旋轉(zhuǎn)的精靈,在屏幕顯示 大小為32*32,精靈個數(shù)為150的情況下,分別連續(xù)繪制和交叉繪制時分別對應(yīng)的示意圖,如 圖7所示。<