SpriteBatchNode進行優化

2021-09-25 13:16:52 字數 4394 閱讀 9747

opengl是乙個基於c語言的三維圖形api,是乙個開放的、跨平台的圖形介面。

opengl es是opengl在移動裝置上的版本。

cocos2d-x是乙個基於opengl的遊戲引擎,渲染功能由opengl實現。

遊戲中會用到許多資源,對資源渲染進行優化能明顯提高效率。

opengl中紋理的長和寬畫素是2的冪,大小不足的紋理補充到2的冪大小;可以通過把多張小合成一張大圖載入到遊戲中,減少紋理載入次數,減少補齊2的冪大小的空白。

之前學習的紋理快取、精靈幀緩衝可以把紋理等預先載入到記憶體中,訪問時候節省訪問時間;除此之外還可以通過ccspritebatchnode節省渲染次數來達到優化的目的。

ccspritebatchnode(精靈批處理類):

當你需要顯示兩個或兩個以上相同的精靈時,如果逐個渲染精靈,每一次渲染都會呼叫opengl的函式;

因為當系統在螢幕上渲染一張貼圖的時候,圖形處理硬體必須首先準備渲染,然後渲染圖形,最後完成渲染以後的清理工作。

以上是每次渲染固定的開銷,這樣幀率就會下降15%左右或者更多。

如果將所有需要渲染的同一張貼圖只進行一次準備,一次渲染,一次清理就可以解決這個問題了。

這時可以使用ccspritebatchnode類來批處理這些精靈。

ccspritebatchnode:

[cpp]view plain

copy

print?

class cc_dll ccspritebatchnode : public ccnode, public cctextureprotocol  

static ccspritebatchnode* createwithtexture(cctexture2d* tex, unsigned int capacity);  

static ccspritebatchnode* createwithtexture(cctexture2d* tex)   

}  由上述**可以看到ccspritebatchnode可以通過檔案直接建立,也可以通過紋理來建立。

ccspritebatchnode

(一)、通過檔案建立ccspritebatchnode並且使用它

[cpp]view plain

copy

print?

static ccspritebatchnode* create(const char* fileimage, unsigned int capacity);  

static ccspritebatchnode* create(const char* fileimage)  

通過紋理直接建立精靈批處理我們可以使用兩個建立函式,不過由上述**可以看出其實只有乙個建立函式;

只指定紋理路徑名稱時候,其第二個引數capacity(表示紋理影象容量)為乙個系統預設值,並且此函式呼叫的為兩個引數的create函式。

例項:[cpp]view plain

copy

print?

ccspritebatchnode* batchnode = ccspritebatchnode::create("helloworld.png");  

for (int i = 0; i < 50; i++)  

addchild(batchnode);  

首先,通過紋理建立乙個精靈批處理;

之後,通過迴圈建立50個精靈,把這50個精靈新增到批處理當中;

最後把批處理加入到父節點。

(二)通過cctexture2d建立ccspritebatchnode並且使用它

[cpp]view plain

copy

print?

cctexture2d * texture = cctexturecache::sharedtexturecache()->addimage("helloworld.png");  

ccspritebatchnode* batchnode = ccspritebatchnode::createwithtexture(texture);  

for (int i = 0; i < 29; i++)  

addchild(batchnode);  

[cpp]view plain

copy

print?

cctexture2d * texture = cctexturecache::sharedtexturecache()->addimage("helloworld.png");  

ccspritebatchnode* batchnode = ccspritebatchnode::createwithtexture(texture);  

for (int i = 0; i < 50; i++)  

addchild(batchnode);  

上訴兩種方式實際上使用起來同樣效果,解釋如下:

首先,通過紋理快取獲取乙個紋理;

之後,通過迴圈建立50個精靈,把這50個精靈新增到批處理當中,此時建立精靈的時候可以使用紋理名稱,也可以使用之前從紋理緩衝中獲取的紋理;

最後把批處理加入到父節點。

例項二:通過直接建立乙個紋理(cctexture2d)來建立精靈批處理,此後精靈建立時候必須使用之前建立的紋理來建立精靈。

[cpp]view plain

copy

print?

ccimage* image = new ccimage();  

image->initwithimagefile("helloworld.png");  

image->autorelease();  

cctexture2d* texture = new cctexture2d();  

texture->initwithimage(image);  

texture->autorelease();  

ccspritebatchnode* batchnode = ccspritebatchnode::createwithtexture(texture);  

for (int i = 0; i < 50; i++)  

addchild(batchnode);  

首先,通過new的方式獲取乙個紋理;

之後,通過迴圈建立50個精靈,把這50個精靈新增到批處理當中,此時的精靈需要用到之前建立的紋理來建立;

最後把批處理加入到父節點。

[cpp]view plain

copy

print?

ccspriteframecache::sharedspriteframecache()->addspriteframeswithfile("batch.plist");  

ccspritebatchnode* batchnode = ccspritebatchnode::create("bach.png");  

addchild(batchnode);  

上訴**在精靈幀緩衝中加入乙個plist檔案;

利用plist對應的建立ccspritebatchnode;

之後[cpp]view plain

copy

print?

static bool flag = true;  

ccsprite * sprite;  

for (int i = 0; i < 1000; i++)  

else  

flag = !flag;  

sprite->setposition(ccp(ccrandom_0_1() * 480, ccrandom_0_1() * 320));  

batchnode->addchild(sprite);  

}  之前把紋理新增到精靈幀緩衝中後使用ccspritebatchnode建立同一張;

此後通過精靈幀緩衝中的精靈幀建立精靈同樣為優化後的。

總結:

當我們需要多次使用同一張紋理建立的精靈時候使用它。

因為所有ccsprite節點都新增到同乙個ccspritebatchnode中,所以所有ccsprite的zorder相同。

新增到同乙個ccspritebatchnode中的ccsprite必須使用同乙個紋理。

精靈幀緩衝(ccspriteframecache)與精靈批處理(ccspritebatchnode)結合使用效果更好!

如何進行HIBERNATE效能調優

大體上,對於hibernate效能調優的主要考慮點如下 資料庫設計調整 hql優化 api的正確使用 如根據不同的業務型別選用不同的集合及查詢api 主配置引數 日誌,查詢快取,fetch size,batch size等 對映檔案優化 id生成策略,二級快取,延遲載入,關聯優化 一級快取的管理 針...

使用modin針對pandas進行效能優化

1.為什麼要使用modin?modin 是加州大學伯克利分校 riselab 的乙個早期專案,旨在促進分布式計算在資料科學領域的應用。它是乙個多程序的資料幀 dataframe 庫,具有與 pandas 相同的應用程式介面 api 使使用者可以加速他們的 pandas 工作流。該系統是為希望程式執行...

乙個使用share memory進行效能優化的例項

下面是這段 是我的乙個演算法中用來求和以及求平方和的kernel函式 global static void compsumandsquare int rate,int i n,int size,int width,int wsize,int image,float sum,float sumofsq...