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