這是我在《Unity游戲優(yōu)化 (第2版)》看的,記錄一下~
藝術(shù)是一個非常主觀的領(lǐng)域,由個人的意見和偏好所支配
支持游戲藝術(shù)性的藝術(shù)資產(chǎn)背后的技術(shù)也是非常主觀的
Unity中有多種不同的資源類型
首先探索一下音頻文件
啥玩意是音頻文件?
少數(shù)音效或者單一背景音樂,或者數(shù)百萬行對話、音樂和環(huán)境音效等等
有啥問題呢?
運行時的音頻處理會造成CPU和內(nèi)存的消耗
為啥有這問題呢?
過度壓縮、或者過多的音頻操作、過多的活動音頻組件、低效的內(nèi)存存儲方法和訪問速度等等
將音頻文件導(dǎo)入Unity中

1.加載音頻文件
怎么加載音頻文件呢?
a.音頻文件就是一個二進制數(shù)據(jù)(打包之后)
b.加載音頻需要將其從硬盤拉入主內(nèi)存(RAM)
c.然后由音頻解碼器進行處理
d.最后將數(shù)據(jù)轉(zhuǎn)換為音頻信號,送到耳機或揚聲器
在unity中通過以下幾種設(shè)置可以指定音頻文件的加載方式:
1.Preload Audio Data
決定音頻數(shù)據(jù)是否在場景初始化期間自動加載,還是在以后加載
一般音頻文件的用法都是:
放在AudioSource組件中的audioClip屬性,將音頻文件包裝在AudioClip對象中,然后可以通過AudioSource的Play或者PlayOneShot方法觸發(fā)播放
這樣做會使得每個音頻文件都將在場景初始化期間加載到內(nèi)存中,因為場景包含對這些文件的即時引用,在需要這些文件之前必須先解析這些飲用(啟用了preload audioData)
如果禁用了preload audioData,就會導(dǎo)致unity在初始化場景期間跳過音頻資源的加載
會將加載活動推遲到需要使用的音頻文件時,也就是當(dāng)調(diào)用Play的時候
禁用后會加快場景的初始化,但第一次播放文件的時候,必須將阻塞主線程直至完成
如果資源文件過大,會導(dǎo)致時間過長,卡頓非常明顯,這是接受不了的
(也可以調(diào)用AudioClip.LoadAudioData()可以實現(xiàn)音頻加載)
2.Load In Background
決定是否在完成之前阻塞主線程,還是異步加載
如果禁用了preload audiData后,使用load in background選項
會將音頻加載改為異步加載,加載不會阻塞主線程
AudioCLip.LoadAudioData的調(diào)用會立即完成,可以通過loadState屬性查看當(dāng)前的加載狀態(tài)
如果開啟了 load inbackGround 而且在加載數(shù)據(jù)的情況下調(diào)用 AudioSource.Play()
unity仍然會在播放之間將文件加載到內(nèi)存中,會導(dǎo)致Play和音頻文件實際開始播放之間會有延遲
3.LoadType
定義了將什么類型的數(shù)據(jù)拉入內(nèi)存,以及一次拉多少內(nèi)存
有3種選擇
a.Decompress On Load
設(shè)置壓縮磁盤上的文件節(jié)省空間,在首次加載的時候?qū)⑵浣鈮旱絻?nèi)存中
是大部分情況使用的標(biāo)準(zhǔn)方法
缺點就是解壓文件需要一定時間,導(dǎo)致加載過程中的額外開銷
b.Compress In Memory
加載音頻時只是將其直接從磁盤復(fù)制到內(nèi)存中
只有播放音頻文件時,才會在運行期間對其進行解壓縮
會導(dǎo)致播放音頻文件時消耗更多的CPU,但是提高了加載速度,減少了運行時內(nèi)存消耗
(適合頻繁使用的大型音頻文件)
c.Streaming
將在運行時加載、解碼和播放文件
逐步將文件推過一個小緩沖區(qū),在緩沖區(qū)中一次只存在整個文件的一小部分數(shù)據(jù)
會導(dǎo)致運行時CPU開銷最大,但是內(nèi)存使用最少
每個文件的回放實例都需要生成自己的緩沖區(qū),如果多次引用音頻文件
會導(dǎo)致內(nèi)存中同一音頻文件的多個副本必須單獨處理,不能胡亂使用
使用定期播放的單實例音頻剪輯,不需要與自身的其他實例甚至于其他的流式音頻剪輯重疊
(最好與背景音樂和背景音效因其使用,這些音效需要在場景里的大多數(shù)時間里播放)