銷售一個產品的網站怎么做網站設計公司怎么樣
Unity與Android混合開發(fā)
為什么使用Flutter構建
Flutter 是 Google 的開源工具包,用于從單個代碼庫為移動、Web、桌面和嵌入式設備構建應用程序(一套代碼跨平臺構建app是它最大的優(yōu)點),并且可以構建高性能、穩(wěn)定和豐富UI的應用程序。
Flutter向Unity發(fā)送消息
通過unityWidgetController.posMessage
來發(fā)送一個string,參數為GameObject name和方法名。
Unity向Flutter發(fā)送消息
Unity通過AndroidJavaClass獲取jar實例并調用其中某個方法。
AndroidJavaClass jc = new AndroidJavaClass("com.xraph.plugin.flutter_unity_widget.UnityPlayerUtils");
jc.CallStatic("onUnityMessage", message);
Flutter通過onUnityMessage接收來自unity傳來的message。
Unity向Andorid發(fā)送消息
Unity通過AndroidJavaClass獲取jar實例并調用其中某個方法。
public static void CallAndroidMethod(string methodName, string str) {using var clsUnityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); //獲取UnityPlayerusing var objActivity = clsUnityPlayer.GetStatic<AndroidJavaObject>("currentActivity"); //獲取當前activityobjActivity.Call(methodName, str); //調用實例中的方法
}
Unity怎么導出給Andorid使用的?
在Flutter中嵌入Unity3D,需將Unity項目導出為Android Library,該包可以添加到 Flutter 應用程序的原生代碼庫中。
從 Unity 構建 Gradle 項目時,無需進行任何其他操作。Unity 生成的每個Android Gradle項目中都具有以下結構:
- unityLibrary 模塊中的一個庫部分,可以集成到其他任何 Gradle 項目中。這包含 Unity runtime和Player數據。
- launcher 模塊中的thin launcher部分,其中包含應用程序的名稱及其圖標。這是一個可啟動 Unity 的簡單 Android 應用程序。您可以將此模塊替換為自己的應用程序。
要將 Unity 集成到另一個 Android Gradle 項目中,必須通過 settings.gradle 文件將生成的 Android Gradle 項目的 unityLibrary 模塊包含在您的 Android Unity 項目中。
Shader
計算機圖像渲染流水線
-
應用階段。應用主導的,由CPU實現(xiàn)。1. 準備好場景數據。2. 剔除不可見物體。3. 設置模型的渲染狀態(tài)。
分為3個階段:1. 將數據加載到顯存中。2. 設置渲染狀態(tài)。3. 調用Draw call(CPU-> GPU)。
-
幾何階段。處理與要繪制的幾何相關的事情。通常在GPU上實現(xiàn)。將頂點坐標變換到屏幕空間中。
-
光柵化階段。產生屏幕上的像素,渲染出最終圖像。逐像素處理。
GPU 流水線
幾何階段和光柵化階段。
頂點著色器
頂點著色器完全可編程的,實現(xiàn)頂點的空間變換(坐標變換:從模型空間轉換為齊次裁剪空間)、頂點著色(逐頂點光照)。
輸入來自于CPU,處理單位是頂點。
片元著色器
可編程的。逐片元(像素)操作。決定每個片元的可見性和顏色的混合。
模板測試
GPU會讀取模版緩沖區(qū)中該片元位置的模版值,然后將該值和讀取到的參考值進行比較。
深度測試
GPU把該片元的深度值和已經存在于深度緩沖區(qū)中的深度值進行比較
性能優(yōu)化
如何減少Draw Call
把很多小的DrawCall合并成一個大的Draw Call,即合批處理。比如那些靜態(tài)的物體更適合批處理,也可以對動態(tài)物體進行批處理。
此外應該注意:
(1)避免使用大量很小的網格,如果要使用的話考慮是否可以合并它們。(我們使用了MeshBaker插件來合并mesh和模型貼圖)
(2)避免使用過多的材質,盡量在不同網格之間共用一個材質。
我們在實際開發(fā)過程中可使用Frame Debugger來發(fā)現(xiàn)不合批原因,從而對癥進行優(yōu)化。
渲染Rendering優(yōu)化
看下pass的次數與set pass 次數, pass 次數,比如陰影這些都會導致多次pass,多光源這些會導致多次pass, 我們可以通過定制渲染管線,優(yōu)化shader代碼, 優(yōu)化光照計算等,從Shader+渲染管線級別來做好渲染優(yōu)化,還有LOD優(yōu)化。
物理引擎優(yōu)化
減少物理引擎的迭代參數,減少計算量,減少物理剛體的數目。
如何減少GC
GC可以保證內存安全,而不用擔心內存未釋放而導致的內存泄漏,但GC需要很大量的CPU時間,不合理的GC會影響到性能。
- 避免分配臨時數據
- 可使用對象池重用Object,避免頻繁的Create和Destroy。
- 字符串連接使用StringBuilder
- 避免在函數中創(chuàng)建Array,而是作為參數傳進去去改變它的值
- 避免在Update中每次創(chuàng)建List對象(字典或Array),而是重用它們。
資源如何優(yōu)化
紋理圖片
- 降低最大分辨率
- 采用二次冪壓縮格式
- 制作紋理圖集
- 取消Read/Write Enabled
- 禁用多余的Mip Map
模型
美術規(guī)范可以進行優(yōu)化,我們可以在導入時,禁用Read/Write Enables,設置一些Mesh Compression或者Optimize Mesh。
使用LOD(多層次細節(jié))
可使用服務器上部署資源包來實現(xiàn)打空包機制進一步減少包體體積。
資源部署與熱更新
可使用AssetBundle, Addressable, YooAsset來組織和管理資源,資源可以打補丁包傳輸到CDN服務器,這樣就可以進行資源的熱更新,而無需重新build程序。
Addressable
資源(例如預制體)被標記為“可尋址”后,就會為該資源生成一個全局地址,系統(tǒng)可在任何地方通過該全局地址定位該資源。該地址是可尋址對象系統(tǒng)與資產位置關聯(lián)的字符串標識符,無論該資產是駐留在您構建的游戲本地還是遠程CDN網絡上。如果資產位置發(fā)生更改,也無需重寫代碼。并且在需要加載資源的時候才會將資源加載進內存。