1. 程式人生 > >UnityTips:不要在釋出版本中實現OnGUI方法

UnityTips:不要在釋出版本中實現OnGUI方法

0x00 問題

不知道大家是否在除錯Unity應用效能的時候發現過一條常見的Marker:UIEvents.IMGUIRenderOverlays。

很多情況下,這條叫做UIEvents.IMGUIRenderOverlays的Marker下會有持續的GC記憶體分配以及CPU時間的開銷。如下圖所示:


可以看到在這個截圖中,UIEvents.IMGUIRenderOverlays的GC分配為368B,時間開銷為0.27ms,並且是每幀持續如此的輸出。

0x01 原因

一旦發現UIEvents.IMGUIRenderOverlays中花費了大量的主執行緒CPU時間以及GC分配,這就表明在專案的程式碼庫中的某處使用了Unity的即時模式GUI系統:即便是在程式碼庫中僅出現一次OnGUI方法,也會導致IMGUI系統在遊戲執行時進行初始化和處理。

重要的是IMGUI非常低效,不適合生產程式碼。

void OnGUI() { if(GUI.Button(new Rect(100, 100, 100, 100), "Load UI")) { //TODO } }

  

檢查一下我們的專案,果然在一個測試指令碼中發現了一個OnGUI方法的實現。Ok,現在我們把OnGUI方法註釋掉再來看一看Unity Profiler提供的資料。


可以發現,去掉了OnGUI方法之後,UIEvents.IMGUIRenderOverlays的開銷從之前的每幀GC分配368B降到了0B,CPU的時間開銷從0.27ms降到了0.01ms。
如果點開UIEvents.IMGUIRenderOverlays

的內容,可以看到一個叫做GUI.Repaint的Marker,這個Marker所對應的Unity的底層方法會收集所有實現了OnGUI方法的指令碼,對這個OnGUI方法的實現進行繪製。

可以看到,針對OnGUI的使用不僅僅不易於維護程式碼的可讀性,甚至是可能會引起不必要的開銷,哪怕只有一個OnGUI的實現不小心隨釋出版本一同釋出都會帶來這種開銷。

因此一個小建議是,大家可以在專案的程式碼庫中搜索OnGUI方法並手動刪除它們,或通過使用合適的#if預處理語句將它們包起來,以確保將它們從釋出構建中移除。

https://docs.microsoft.com/zh-cn/learn/?WT.mc_id=DT-MVP-5001664

 

相關推薦

UnityTips:不要釋出版本實現OnGUI方法

0x00 問題 不知道大家是否在除錯Unity應用效能的時候發現過一條常見的Marker:UIEvents.IMGUIRenderOverlays。 很多情況下,這條叫做UIEvents.IMGUIRenderOverlays的Marker下會有持續的GC記憶體分配以及CPU時間的開銷。如下圖所示: 可以

AngularJS1.6版本ui-router路由/#!/的解決方法 - zhuan

ret soft https variable name class over func efi 本地編譯出的文件可以正常運行,但是服務器編譯後到了測試那裏路由上就莫名的出現了/#!/,這導致了很多問題。 後來查了下是服務器編譯器把AngularJS升級到了1.6版本,而我

JS實現循環刪除數組元素的方法介紹

blog 但是 rom 移除 ons 朋友 function cnblogs 調整 這篇文章主要給大家介紹了關於Javascript循環刪除數組中元素的幾種方法,文中給出了詳細的示例代碼供大家參考學習,對大家具有一定的參考學習價值,需要的朋友們下面來一起看看吧。 本文主

在Anaconda實現版本Python共存

anaconda spyder python windows檢查conda版本在Windows的cmd下輸入 conda --version 如圖:其中本機Anaconda自帶的Python3.6版本的。在conda中創建一個名為python27的環境,並下載對應版本的Python2.7cmd下輸入conda

easyui的下拉菜單是樹形結構時如何實現onchange方法

問題 input style 出現 發現 class 如果 box ble 今天碰到一個問題就是我寫的代碼中的一個下拉列表顯示的是樹型菜單,代碼如下(使用的是easyui): .... <tr> <td>地區:</td>

SAP,ABAPBADI的定義,接口,類,實現方法

badi 之前 abap中 可能 需要 nbsp 面向對象 過程 是我 BADI是SAP的第三代用戶出口,采用了面向對象的方式,據說在4.6A版本之後才引入的BADI。 接口:就是定義BADI中方法的樣子,或者說從形式上說明一下BADI有哪些方法,它們大致的功能。 類:

spring boot實現響應圖片的方法以及改進

spring-bootController響應,噴出圖片,是一個很常見的功能,代碼如下@RequestMapping(value = { "/img/{filename:.+}" }, method = RequestMethod.GET, produces = { MediaType.I

Angular2實現基於TypeScript的對象合並方法:extend()

boolean script string ext true false member jquer blog TypeScript裏面沒有現成的合並對象的方法,這裏借鑒jQuery裏的$.extend()方法。寫了一個TypeScript的對象合並方法,使用方法和jQuer

NHibernte 4.0.3版本,使用Queryover().Where().OrderBy().Skip().Take()方法分頁獲取數據失敗

osi ber modal str 問題 res tor 獲取數據 max 問題代碼如下: var result=repository.QueryOver<modal>() .Where(p=>p.Code==Code)

Java小題,通過JNI調用本地C++共享庫的對應方法實現楊輝三角的繪制

question 文件夾 path ron variable iostream ring printf spl 1.在Eclipse中配置Javah,配置如下 位置是你javah.exe在你電腦磁盤上的路徑 位置:C:\Program Files\Java\jdk1.

利用Django的url方法實現地址動態拼接自動生成超鏈接地址

蝴蝶 控制 可選 編寫 alt .html url pytho 條件 目標 建立一個圖書列表頁面,顯示圖書名列表,並實現點擊書名跳轉到圖書詳細頁面,顯示圖書詳細信息。 URL方法簡介 功能:返回一個絕對路徑的引用(不包含域名的URL);該引用匹配一個給定的視圖函數和 一

利用切片操作,實現一個trim()函數,去除字符串首尾的空格,註意不要調用str的strip()方法

調用 字符 去除 nbsp from urn return ret code 首先判斷字符串的長度是否為0,如果是,直接返回字符串 第二,循環判斷字符串的首部是否有空格,如果有,去掉空格,再判斷字符串的長度是否為0,如果是,直接返回字符串 第三,循環判斷字符串的尾部是否

12、xamarin form實現H5 網頁喚醒微信支付的方法

dstar set renderer AC adf app led int 安卓 在微信的支付中有種支付叫微信H5支付。方便用戶在網頁中輕松喚起微信進行支付。 當然微信不推薦大家使用這樣的方式喚起微信支付。建議app還是使用正常的微信支付sdk即可 服務端與其他的建議參

C#實現並發的幾種方法的性能測試

返回 也不會 thead syn image 9.png 結果 次數 存在 原文地址:https://www.cnblogs.com/durow/p/4837746.html 0x00 起因 去年寫的一個程序因為需要在局域網發送消息支持一些命令和簡單數據的傳輸,所以寫了

Ajax的load()方法實現指定區域加載或刷新html與jsp

ext RoCE ron obj req ror The sta 是否 梳理知識方法的時候,筆者還是有數的,就不閑扯了。一、Jquery中的AjaxJquery對Ajax操作進行了封裝,在Jquery中:最底層的是$.ajsx(),第二層是load()、$.get()、$.

django前端檢視與新增在同一個views方法實現

1,前端樣式: 2.html程式碼 {% load staticfiles %} <p class="text-right"><button class="btn btn-primary" id="add_column" onclick="add_column

【eclipse jar包】在編寫java程式碼時,為方便程式設計,常常會引用別人已經實現方法,通常會封裝成jar包,我們在編寫時,只需引入到Eclipse即可。

Eclipse中匯入外部jar包 在編寫java程式碼時,為方便程式設計,常常會引用別人已經實現的方法,通常會封裝成jar包,我們在編寫時,只需引入到Eclipse中即可。 工具/原料 Eclipse

mybatis實現hibernate的saveOrUpdate方法

mybatis實現saveOrUpdate 最近在做專案過程中遇到需要更新或者插入的問題,就想起hibernate有個saveOrUpdate的方法,想著mybatis是不是也有這個方法。於是上網查詢資料。該問題有兩種解決方案。 方法1:使用mybatis的標籤 <insert i

js實現跨域的幾種方法

js中幾種實用的跨域方法原理詳解 這裡說的js跨域是指通過js在不同的域之間進行資料傳輸或通訊,比如用ajax向一個不同的域請求資料,或者通過js獲取頁面中不同域的框架中(iframe)的資料。只要協議、域名、埠有任何一個不同,都被當作是不同的域。 下表給出了相對http://sto

2.0版本如何取得當前的控制器和方法

Nid tro pre var spa pan number 方法 variable 在 控制器 裏面 1 $controllerID = Yii::$app->controller->id; 2 $actionID = Yii::$app->contr