【厚積薄發】LuaJIT性能熱點函數優化

1)LuaJIT性能熱點函數優化
​2)Unity 2019.4打包Android疑問
3)RenderTexture.GetTemporary報錯問題
4)WaitForTargetFPS耗時過高
5)ParticleSystem.Main的有效性html


這是第214篇UWA技術知識分享的推送。今天咱們繼續爲你們精選了若干和開發、優化相關的問題,建議閱讀時間10分鐘,認真讀完必有收穫。android

UWA 問答社區:answer.uwa4d.com
UWA QQ羣2:793972859(原羣已滿員)ios

Script

Q:諮詢項目中的這個函數耗時很是嚴重,有什麼優化的方法嗎? git

A1:這個是table.get,對應獲取字段或者訪問數組時調用的函數:github

  1. 優先使用連續數組而不是英文名字段,能夠顯著提高訪問效率並下降內存消耗,不少團隊喜歡使用Class的寫法,能夠這樣改造:
    local obj = ClassA.New()
    obj.abc = 1
    obj.cde = "test"
    變成:
    local obj = ClassA.New()
    obj[1] = 1
    obj[2] = "test"
    這個方法能夠針對使用頻率較高的代碼進行改造。
  2. 本身開發工具,在編譯Lua以前,將Lua代碼中的常量從英文名變量轉換爲數值,這個能夠結合1使用,就能夠在開發期寫英文名字段名,而後編譯時轉換爲數組。

感謝招文勇@UWA問答社區提供了回答數組

A2:字符串應該是哈希值計算的消耗,這樣的開銷應該是很頻繁地調用了。

感謝王歡@UWA問答社區提供了回答網絡

A3:贊成你的觀點,但可讀性變差了,得不償失。第二點,可能比較容易出錯。

感謝Robot.Huang@UWA問答社區提供了回答app

Build

Q:Unity版本由2018.4.0f1升級到2019.4.5f1,其中Android的Custom Manifest、Custom Gradle Template都拆分爲了兩個,分別爲Main和Launcher。以前對接的各個Android SDK感受須要從新作了。請問有比較熟悉的,能夠指點一下這裏嗎?函數

咱們以前各個SDK都是以JAR和AAR的形式直接放在Unity工程內,直接Unity出包,如今直接Build會有各類報錯,感受是不兼容以前的格式了。 工具

A1:咱們也遇到了外部編譯的AAR內的Manifest和Unity內的Manifest衝突問題。因爲2019實際上是能夠直接編譯Java的,咱們乾脆取消了外部工程,直接把Java代碼和OC的代碼放入Unity工程,而後只使用Unity內的Manifest,就沒有衝突錯誤了。

咱們項目是2017的,當時記得MM能夠,可是Java不行。後來用2018開的其餘項目由於暫時沒遇到相似需求,就沒試,最近另一個項目直接2019來作就這樣對應了。

感謝黃程@UWA問答社區提供了回答

A2:找了找文檔 https://forum.unity.com/threads/using-unity-as-a-library-in-native-ios-android-apps.685195,咱們是手動把原來一個Manifest文件的內容給拆了一下,LauncherManifest只放圖標和App Name相關的設置。

以後有時間也準備試試黃程大佬的方法。

感謝題主張斌@UWA問答社區提供了回答

Script

Q:使用GetTemporary這個方法進行圖片資源的建立時,發生了這個錯誤:ArgumentException: RenderTextureDesc width must be greater than zero.

望各位賜教。請問這部分源代碼在哪裏能夠看到?

A:源代碼:
https://github.com/Unity-Technologies/UnityCsReference

參數Width不能小於等於0。

感謝羽飛@UWA問答社區提供了回答

Script

Q:使用GPM查看項目性能,發現WaitForTargetFPS耗時過高,均值在20ms左右。網上查找說是由於開了垂直同步的問題,按照網上的解決方式從新打包事後,並沒什麼效果。

A1:在真機上,若是Application.targetFrameRate = -1 仍是會自動與屏幕的刷新率同步,想把這個「消耗」降下來,就設置成144。

其實這個只是CPU在等待屏幕刷新,有這個「消耗」實際上是好事,說明CPU和GPU的負載不高,發熱不厲害。

感謝張首峯@UWA問答社區提供了回答

A2:你能夠看看Unity官網文檔上關於WaitForTargetFPS的解釋。

https://docs.unity.cn/cn/2019.4/Manual/ProfilerCPU.html#samples-rendering

感謝tyer@UWA問答社區提供了回答

Script

Q:Main爲Struct值類型的只讀屬性,在不從新設置回對象字段的狀況下修改有效。請問各位大佬,在運行時進行屬性修改操做時,這種機制的底層實現原理是什麼?

A1:能夠參考 《Particle System Modules – FAQ》

感謝jim@UWA問答社區提供了回答

A2:我的理解是,這個是一個包Property的結構體。每一個Property的Get和Set又指向的內部子模塊的參數。

因此操做這些Property就直接操做到了內部的子模塊。

感謝歐月鬆@UWA問答社區提供了回答

A3:MainModule這個結構體就是一個對Native接口的封裝。

感謝羽飛@UWA問答社區提供了回答

封面圖來源於網絡


今天的分享就到這裏。固然,生有涯而知無涯。在漫漫的開發週期中,您看到的這些問題也許都只是冰山一角,咱們早已在UWA問答網站上準備了更多的技術話題等你一塊兒來探索和分享。歡迎熱愛進步的你加入,也許你的方法恰能解別人的燃眉之急;而他山之「石」,也能攻你之「玉」。

官網:www.uwa4d.com
官方技術博客:blog.uwa4d.com
官方問答社區:answer.uwa4d.com
UWA學堂:edu.uwa4d.com

官方技術QQ羣:793972859(原羣已滿員)

相關文章
相關標籤/搜索