1. 程式人生 > >[影象]TexturePacker打包命令指令碼

[影象]TexturePacker打包命令指令碼

TexturePacker是一款把若干資源圖片拼接為一張大圖的合圖工具,在遊戲開發以及網頁製作中經常會使用到這個工具。為什麼需要使用這個工具呢?

1.我們知道,大部分遊戲引擎底層的渲染方式都是基於OpenGL的,但是,你知道嗎?OpenGL載入紋理圖片時,所用記憶體會自動擴張到2的N次方。比如,一張圖片的大小為10*10畫素,OpenGL會按照16*16的規格將圖片載入到記憶體中;如果圖片大小為64*65,那麼就會按照64*128載入了,這就造成了記憶體的無必要開銷。具體浪費了多少記憶體空間呢?
我們這裡需要了解一個概念:圖片格式(Image format)。圖片格式有RGBA8888、RGBA4444、RGBA5555、RGB888等等。
假如我們使用的圖片格式為RGBA8888,也就是說圖片每個畫素點都由R、G、B、A4個值組成,每個值佔用8位(值為0-255),那麼一個畫素點會佔用8位*4=32位=4位元組。所以圖片大小為64*65時我們按照64*128載入,此時會造成64*(128-65)*4位元組=16128位元組=15.75KB的記憶體空間浪費,要知道整張圖片的大小才有64*65*4/1024=16.25KB。

所以,在遊戲開發使用圖片資源時,我們要儘量保證圖片的大小在接近且不大於2的整數倍,理想狀態下,如果每一張圖的長寬都恰好是2的n次方數值,就不會有任何浪費了。TexturePacker正是幫助我們將圖片資源進行這樣優化的一款軟體。

2.TexturePacker不僅能幫助我們在載入圖片時節省記憶體,它將很多小圖拼接成一張大圖後,合成的大圖會比之前所有的散圖所佔用的物理儲存更小,也許一堆散圖的大小為20KB,將它們合成一張大圖後可能就變成了10KB,這樣便從而通過減小圖片資源物理儲存大小起到壓縮遊戲安裝包的作用。
3.將很多小圖拼接成一張大圖,載入記憶體時一次載入,提高了載入速度。

PackTextures.sh打包命令指令碼

#!/bin/bash
CUR_PATH="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
cd $CUR_PATH #當前資料夾路徑

# 填寫自己的路徑
TP="/Applications/TexturePacker.app/Contents/MacOS/TexturePacker"

#檔案輸出路徑
OUTPUT_PATH="$CUR_PATH/out"


# --premultiply-alpha \ #這個引數可以消除白邊,但對白色透明變黑
# --dither-atkinson-alpha \

# --content-protection 5abc11740879b2ff6d36f2c9d4d7d088 \ #這個引數是圖片加密
function PackTextures(){
	if [ -f "${TP}" ]; then
		echo "building Images... ${1}"

		${TP} --smart-update \
		--texture-format pvr2ccz \
		--format cocos2d \
		--enable-rotation \
		--padding 2 \
		--shape-padding 2 \
		--trim-mode None \
		--scale 1.0 \
		--max-width 4096 \
		--max-height 4096 \
		--data  "$OUTPUT_PATH"/"${1}".plist \
		--sheet "$OUTPUT_PATH"/"${1}".pvr.ccz \
		--size-constraints AnySize \
		--opt RGBA8888 \
		--dither-atkinson-alpha \
		"${1}"/*.png
		echo "---------${1}\n\n"
	else
	    #if here the TexturePacker command line file could not be found
	    echo "TexturePacker tool not installed in ${TP}"
	    echo "skipping requested operation."
	    exit 1
	fi
}

#對當前目錄下的子檔案下的png檔案進行合圖操作
for dir in `ls` ;do
	if [ -d $dir ];then
		num="$(ls -l ${dir} | grep '.png' | wc -l)"
		if (($num > 0));then
			PackTextures $dir
		fi
	fi
done