對于性能來說,很多情況都是用空間換時間,
然后在盡量減少空間的占用,在兩者之間做抉擇,
首先我們了解一下性能指標
- 幀率:每秒游戲回圈執行的次數,即每秒多少幀 越高越好
- drawcall: 一幀中游戲呼叫gpu繪制圖形次數,越少越好
3 . cpu性能: cpu執行速度,越快越好
4 . gpu性能: gpu執行速度,越快越好
5 . 記憶體: 游戲資源占用的運行時空間, 越低越好
6 . 網路請求數: 請求網路下載資源,越少越好
7 . 加載速度: 將硬碟中的資源加載到記憶體中,越快越好
8 . 包體大小: 游戲包大小,越小越好
9 . 節點數量: 游戲中存在的節點數量,越少越好
合并圖集:
這是一個地球人都知道的手段,那為什么要合并圖集?也只是將給初級開發者聽聽而已,
來一個cocoscreator的鏈接:https://docs.cocos.com/creator/manual/zh/asset-workflow/atlas.html

首先我們要了解,xxgl 的繪圖程序都做了什么?
- 啟用對應的著色器程式
this.gl.useProgram(this.program);
- 系結紋理
this.gl.bindTexture(gl.TEXTURE_2D, batchNode.getTexture().getTexture());
3.傳遞頂點資料
let n = indexList.length;
let indices = new Uint8Array(indexList);
//放入緩沖區
let buffer = this.buffer.initBuffers(vertices, 'vertices');
let persize = vertices.BYTES_PER_ELEMENT;
// 設定資料 這里可以優化
let pointer = program.setPointer('a_Position', 3, gl.FLOAT, false, persize * count, 0);
let texPointer = program.setPointer('a_TexCoord', 2, gl.FLOAT, false, persize * count, persize * 3);
this.buffer.initBuffers(indices, 'indices', this.gl.ELEMENT_ARRAY_BUFFER);
- 執行繪制
let u_Sampler = program.getUniformLocation('u_Sampler');
if (!u_Sampler) {
console.log('Failed to get the storage location of u_Sampler');
return false;
}
gl.uniform1i(u_Sampler, 0);
//呼叫一次drawcall加一
gl.drawElements(gl.TRIANGLES, n, gl.UNSIGNED_BYTE, 0);
合并圖集的作用在哪里?
在著色器程式不變的情況下,如果我們很多sprite 使用的都是一張紋理上的碎圖,只是紋理坐標不同,那我們就可以在第3步傳遞資料的時候做文章,其他幾步就可以不動,然后讓繪制一次完成,相反的,如果有兩個sprite使用了不同的紋理,那么就需要系結兩次紋理,這些步驟就需要再執行一次,drawcall也就變成了2,
顯然合并圖集已經影響了幀率和drawcall,
對記憶體和包體的影響
- 這里先說明紋理所占記憶體的計算公式:長x寬x一個像素點的位元組數,
- 如果碎圖有白邊的話合成圖集會省去一部分記憶體,這個cocos官方已經說了;
- 其次,不論是png還是jpg格式,每張圖片都會有頭部資訊,如果合并圖集,也就是說如果有兩張圖片就少了一張圖片的頭部資訊,如果多張呢?自然是省了記憶體又減小包體,
- 雖然合并圖集會產生一個plist組態檔,增大了一些記憶體和包體的占用,但是對于減少的量來說是可以忽略的,
- 如果圖集包含的碎圖越多,節省的空間就越多,如果只是那么三五張圖篇,打成圖集可能沒有省出多少空間,所以對于單張很大的背景圖就不建議使用了,畢竟尺寸的限制是2048*2048,合并不了幾張還產生了plist檔案,
- 如果圖集使用不當,模塊使用的資源劃分的不是很標準,也會出現一個圖集利用率的問題,也可以理解為記憶體的浪費,例如打開的一個界面中就用到了圖集中的幾張碎圖,所以使用圖集的時候要注意圖片資源的劃分情況,
對網路請求次數的影響
這個是顯而易見的,十張圖請求十次,合成圖集就請求兩次(因為多出一個plist檔案),省了很多網路鏈接的程序,但是要注意圖集的大小和體積,過大的圖集也會造成不良影響,
對加載速度的影響
首先我們要看看檔案讀寫的步驟:
- 首先建立通道,
- 然后建立資料存盤空間,
- 然后開始讀寫資料,
- 關閉流,
合并圖集肯定會減少流的開啟和關閉的次數,自然省去了不少加載時間,
結語
總體來看,合并圖集的好處真是太多了,沒有理由不用啊!
歡迎掃碼關注公眾號《微笑游戲》,瀏覽更多內容,

本文由博客群發一文多發等運營工具平臺 OpenWrite 發布
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/33915.html
標籤:其他
上一篇:DirectX11 With Windows SDK--31 陰影映射
下一篇:求指導照片墻的問題,謝謝
