优化Flash中的3D模型加载
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
來(lái)自:Kid's Zone
最近在做一個(gè)公司的Flash3D頁(yè)游項(xiàng)目,遇到了這個(gè)問(wèn)題,前前后后斷斷續(xù)續(xù)也優(yōu)化了一段時(shí)間,覺(jué)得還是有必要記錄一下一些優(yōu)化的心得。
Flash中加載資源一個(gè)最大的問(wèn)題在于難以使用另外的線程加載資源。誠(chéng)然Flash有Worker線程,但Worker存在以下幾個(gè)問(wèn)題:
1. 使用Worker要求客戶的FlashPlayer播放器版本不能過(guò)低。
2. 不同Worker之間傳遞數(shù)據(jù)手段非常少,缺乏共享內(nèi)存。使用ByteArray共享數(shù)據(jù)的話需要先把數(shù)據(jù)序列化成AMF格式,無(wú)論序列化還是解析都是一個(gè)耗時(shí)的操作。
3. Worker實(shí)際上是另一個(gè)swf文件,增加程序復(fù)雜度。
4. 需要使用FlashBuilder4.7才能開(kāi)發(fā)worker,而4.7一堆bug。
既然只能在渲染線程中加載和解析模型,那么我們就只能力求加載速度足夠快。同時(shí),作為頁(yè)游,模型文件的體積也要足夠小。
模型文件格式的選擇
基于多種考慮,我們最終使用MD5作為模型文件格式:
1. 它支持骨骼動(dòng)畫。
2. 它是文本格式文件,便于查錯(cuò)。
3. 它是一種通用的文件格式而非我們自定義的文件格式,因此可以使用多種模型查看器瀏覽。
4. 它的壓縮率在文本格式文件中比較高。
當(dāng)然了,解析文本格式的模型有個(gè)非常嚴(yán)重的問(wèn)題,那就是解析速度慢得難以忍受。因?yàn)榻馕瞿P托枰粩嗟卦贏S3中調(diào)用string.getCharAt(),而這是個(gè)非常耗時(shí)的操作。
使用AMF加速模型解析
我首先做的一個(gè)嘗試就是使用Adobe自帶的AMF格式加速模型解析。具體做法就是先把解析好的模型序列化為AMF然后保存成文件。當(dāng)加載的使用ByteArray.readObject()反序列化文件。這個(gè)方法解析模型相當(dāng)快。快到什么程度呢?解析一個(gè)3000面的模型僅需要6毫秒。然而,序列化成AMF文件后,模型體積會(huì)增大,且無(wú)法使用zip進(jìn)一步壓縮。因此只能忍痛放棄。
使用JSON加速模型解析
其實(shí)解析模型慢的主要原因是AS3本身慢,假如能把解析工作移至C++中做,一切都會(huì)變得很美好。對(duì)于這點(diǎn),我并沒(méi)有選擇使用FlasCC,原因有兩個(gè),一是Flash官方已經(jīng)放棄FlasCC了(囧),二是使用FlasCC需要引入一個(gè)1m大小的庫(kù)(坑爹)。
所以我就想到了使用JSON。Flash本身是自帶JSON解析的,而且效率很高。同時(shí),將MD5轉(zhuǎn)成JSON格式非常簡(jiǎn)單,還保留了可讀性。同樣的一個(gè)3000面模型,JSON解析部分耗時(shí)9毫秒。最終,我們決定使用JSON格式。
進(jìn)一步壓縮文件大小
使用3ds Max導(dǎo)出的模型頂點(diǎn)數(shù)據(jù)精度都很高,有些甚至到了小數(shù)點(diǎn)后8位。實(shí)際上由于游戲中我們并不需要顯示那么大的模型,所以要求的精度也沒(méi)有那么高。根據(jù)實(shí)測(cè),模型文件精確到小數(shù)點(diǎn)后4位,動(dòng)作文件精確到小數(shù)點(diǎn)后6位,從視覺(jué)上看不出和原文件有什么不同。經(jīng)過(guò)這一步處理,文件的體積可以進(jìn)一步縮小20%-25%。
分片加載
實(shí)際上模型除了json本身的解析外,還需要根據(jù)骨骼和權(quán)重生成模型,計(jì)算法線等。一般來(lái)說(shuō),一個(gè)模型的解析耗時(shí)在30-50毫秒之間(AMF則不同。由于AMF是把內(nèi)存中的模型直接序列化成文件,因此在反序列化時(shí)不需要做任何額外處理)。對(duì)于一個(gè)目標(biāo)幀率為60的游戲來(lái)說(shuō),這個(gè)時(shí)間遠(yuǎn)遠(yuǎn)超出了一幀16毫秒。因此,最后要做的事情就是把任務(wù)分拆成小塊,每幀只進(jìn)行一部分的加載。經(jīng)過(guò)這樣的處理以后,就可以實(shí)現(xiàn)在場(chǎng)景中動(dòng)態(tài)加載模型時(shí)不卡幀。
?
=》Away3d官網(wǎng)上關(guān)于away3d的介紹
=》33號(hào)鋪 – 開(kāi)源淘寶客瀑布流發(fā)布和管理系統(tǒng)
http://www.chenlinsheng.com/?p=1241
?
轉(zhuǎn)載于:https://my.oschina.net/clschen/blog/375338
總結(jié)
以上是生活随笔為你收集整理的优化Flash中的3D模型加载的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ASP中随机函数Randomize的使用
- 下一篇: Gradle 2.3 发布