Laya學習筆記

 

1.

光照貼圖是場景中3D模型產生的投影、陰影過渡、燈光氛圍、模型材質與材質之間的顏色影響等。 

2.

很少有3D手遊場景是靠燈光與模型即時渲染產生投影及顏色影響,這是非常耗性能的方式,特別又是手機手遊,手機的顯卡功能並不強大,全部用即時光影手遊會變得很卡頓。 

場景光照貼圖就是爲了解決這個問題,它是以貼圖的方式模擬手遊場景的光影光色,減少大量的即時運算。 

光照貼圖建議通過unity3D 編輯器渲染光照貼圖並導出使用,加載場景時,引擎會自動加載光照貼圖達到較好的效果。 

如果unity中並未渲染光照貼圖,導出後引擎也不會加載報錯,但手遊的效果會大打折扣。 

3.

如果攝像機使用了正交投影,天空盒將達不到所要效果,開發者們可以嘗試。 

4.

多攝像機的缺點是非常耗性能,模型三角面數與DrawCall數量會成倍上升,多幾個攝像機就會多出幾倍性能損耗,因此開發者們需酌情考慮。 

3D場景的顯示大小與位置與2D手遊不太一樣,主要是靠攝像機的視口(ViewPort)來控制,通過它來進行屏幕的分割。 

5.

component3D世界中的腳本,繼承自組件,是組件的一種。該類被定義爲 ‘抽象類’ ,不允許實例。該類提供了一系列虛方法。 

6.

onReset重置組件參數到默認值,如果實現了這個函數,則組件會被重置並且自動回收到對象池,方便下次複用 如果沒有重置,則不進行回收複用 此方法爲虛方法,使用時重寫覆蓋即可。 

7.

lh導出的3D顯示對象容器Spirte3D類型數據文件,JSON格式編碼,是unity3DlayaAir導出插件選擇導出預設類別生成,內容比*.ls格式少了光照貼圖,其他全部相同。 

8.

lm格式數據文件無論是導出 場景文件 預設文件 類型,在導出的資源文件夾中都包含了系列*.lm格式文件,本項目中LayaMonkey文件夾爲unity中開發者自建的存儲FBX模型的文件夾,如圖4,在導出時生成了對應的文件夾和.lm資源文件。 

*.lm文件就是模型的網格數據文件。可以生成MeshSprite3DSkinnedMeshSprite3D類型顯示對象的Mesh(網格),文件中包含了模型網格的頂點位置、法線、頂點色、頂點UV等信息。 

9.

lav文件是蒙皮骨骼動畫數據文件。可以生成SkinnedMeshSprite3D蒙皮網格精靈的Avatar(骨骼)。文件中包含了骨骼節點信息。 

10.

lmat文件是材質數據文件。可以生成模型可以使用的material(材質)。其中包含了材質貼圖,材質球顏色信息,定點色信息,紋理偏移信息等材質相關的信息。 

11.

PrimitiveMesh創建時需注意的是,加載到場景中的引擎自帶模型,軸心點在模型正中心,因此我們是以模型中心點爲參考進行移動、旋轉、縮放。加載到場景中時,模型默認會放置到場景的世界座標原點上。 

12.

修改子對象模型網格。獲取子對象時還應注意一個問題,就是模型與材質未加載完成,是無法獲取子對象的,因此需要資源預加載,或異步加載時進行完成事件監聽。 

13.

支持Shader列表中LayaAir3D目錄中的所有Shader。如果使用非LayaAir3D Shader會強制轉換爲LayaAir3D的默認Shader,之後可能會出現無法預知的錯誤。 

14.

關於材質優化。引擎在加載場景時會對物體進行合併處理,可大幅度提升場景性能。合併原則爲同材質的模型,所以開發者在編輯場景模型時儘量使用相同材質,並且越少越好。這樣就可以達到今後性能優化的最基本條件。更具體的會在今後的性能優化篇講解。 

15.

設置相機的清除標識爲天空盒(這個參數必須設置爲CLEARFLAG_SKY,否則無法使用天空盒)。 

16.

當紋理大於三維圖形表面時,導至一個像素被映射到許多紋理像素上;當維理小於三維圖形表面時,許多個像素都映射到同一紋理。 

當這些情況發生時,貼圖就會變得模糊或發生錯位。要解決此類問題,必須通過技術平滑紋理元素和像素之間的對應。這種技術就是紋理過濾。 

雙線性過濾 (最常用,性能挺好的

17.

動畫過度融合是用於在給定的時間內從一個動畫狀態平滑過渡到另一個動畫狀態。如果一個動作跳轉到另一個完全不同的動作耗時很短,那麼過渡通常的表現令人滿意。下面我們的例子演示效果就是將跑步動作與瞄準動作混合起來。 

18.

骨骼掛點技術在3D手遊中運用非常普遍,比如武器要隨着角色的手的動作而變化,那麼我們就可以把武器與手上骨骼進行掛點綁定,武器作爲手骨骼的子節點,自然就可以跟隨手的動作而變化。當然,綁定後的3D模型也可以通過代碼來移除綁定或者更換另外的3D模型,通過這種方式可以實現武器或裝備的換裝功能,騎乘功能等。 

19.

LayaAir3D中有內置的2個天空盒網格:SkyBox盒型網格 SkyDome 球形網格。 

20.

顯存不像內存,內存有垃圾回收機制,而顯存不一樣,必須手動釋放,因此顯存的資源釋放必須受到重視! 

如果單純的銷燬使用該網格的精靈,不對網格資源本身做處理,顯存是不會有減少的,網格資源還是在顯存中。 

//銷燬了使用了該網格的精靈

layaMonkey.destroy(); 

//對網格進行銷燬

mesh.destroy();  

21.

Sprite3D在調用 destroy() 之後,精靈所引用的材質,紋理,網格並不會跟隨精靈的銷燬而一起銷燬。這些殘留下的資源需要分別使用Laya.loader.getRes(url:String)接口獲取到資源(Resource)對象之後,再調用資源對象的destroy()方法進行銷燬。 

但是這種方法是非常麻煩的。LayaAir2.0爲了方便開發者,提供了Resource.destroyUnusedResources()接口統一銷燬。 

Tip:注意需要清理一個的Scene3D或者Sprite3D 相關的資源時,需要銷燬(destroy)的不單單是他的本體精靈,克隆的精靈也需要進行銷燬。此時destroyUnusedResources 方法會自動釋放掉所有沒有使用且沒有 上鎖 的資源。 

22.

2D中,圖片使用的是Texture紋理(注意不是3D中的Texture2D)。但是實質上Texture就是對Texture2D的再封裝,Texturebitmap 屬性就是他所屬的Texture2D Texture本身是記錄了Texture2uv屬性,來實現圖集中的單圖片顯示。 所以在2D中,同一個圖集中的多個不同 Texture 是共用的一個 Bitmap。這樣的機制,就可能讓開發者在內存管理時產生誤解:"銷燬了一個2D Texture ,那麼他所佔的顯存也應該被釋放" 

由於多個Texture引用同一個bitmap ,而Texture並不是真正的顯存,bitmap纔是真正的顯存對象。銷燬Texture並不等於銷燬bitmap 所以在這個時候是釋放不掉顯存的。所以2D圖集與圖片資源加鎖,實際上是對相對應的Texturebitmap上鎖。在加載圖集之後,還是使用Laya.loader.getRes(url)拿到圖集中的一個Texture紋理,然後通過Texturebitmap屬性上鎖。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章