精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

性能優化主要圍繞CPU、GPU和內存三大方面進行

Dbwd_Imgtec ? 來源:未知 ? 作者:李倩 ? 2018-04-13 16:21 ? 次閱讀

項目的性能優化主要圍繞CPUGPU和內存三大方面進行。本文和大家分享內存方面的優化心得。

無論是游戲還是VR應用,內存管理都是其研發階段的重中之重。然而,在我們測評過的大量項目中,90%以上的項目都存在不同程度的內存使用問題。就目前基于Unity引擎開發的移動游戲和移動VR游戲而言,內存的開銷無外乎以下三大部分:

資源內存占用;

引擎模塊自身內存占用;

托管堆內存占用。

如果您的項目存在內存問題,一定逃不出以上三種情況。今天,我們就這三種情況逐一進行解釋。

1、資源內存占用

在一個較為復雜的大中型項目中,資源的內存占用往往占據了總體內存的70%以上。因此,資源使用是否恰當直接決定了項目的內存占用情況。一般來說,一款游戲項目的資源主要可分為如下幾種:紋理(Texture)、網格(Mesh)、動畫片段(AnimationClip)、音頻片段(AudioClip)、材質(Material)、著色器(Shader)、字體資源(Font)以及文本資源(Text Asset)等等。其中,紋理、網格、動畫片段和音頻片段則是最容易造成較大內存開銷的資源。

一、紋理

紋理資源可以說是幾乎所有游戲項目中占據最大內存開銷的資源。一個6萬面片的場景,網格資源最大才不過10MB,但一個2048x2048的紋理,可能直接就達到16MB。因此,項目中紋理資源的使用是否得當會極大地影響項目的內存占用。

那么,紋理資源在使用時應該注意哪些地方呢?

(1) 紋理格式

紋理格式是研發團隊最需要關注的紋理屬性。因為它不僅影響著紋理的內存占用,同時還決定了紋理的加載效率。一般來說,我們建議開發團隊盡可能根據硬件的種類選擇硬件支持的紋理格式,比如Android平臺的ETC、iOS平臺的PVRTC、Windows PC上的DXT等等。因此,我們在UWA測評報告中,將紋理格式進行詳細羅列,以便開發團隊進行快速查找,一步定位。

在使用硬件支持的紋理格式時,你可能會遇到以下幾個問題:

色階問題

由于ETC、PVRTC等格式均為有損壓縮,因此,當紋理色差范圍跨度較大時,均不可避免地造成不同程度的“階梯”狀的色階問題。因此,很多研發團隊使用RGBA32/ARGB32格式來實現更好的效果。但是,這種做法將造成很大的內存占用。比如,同樣一張1024x1024的紋理,如果不開啟Mipmap,并且為PVRTC格式,則其內存占用為512KB,而如果轉換為RGBA32位,則很可能占用達到4MB。所以,研發團隊在使用RGBA32或ARGB32格式的紋理時,一定要慎重考慮,更為明智的選擇是盡量減少紋理的色差范圍,使其盡可能使用硬件支持的壓縮格式進行儲存。

ETC1 不支持透明通道問題

在Android平臺上,對于使用OpenGL ES 2.0的設備,其紋理格式僅能支持ETC1格式,該格式有個較為嚴重的問題,即不支持Alpha透明通道,使得透明貼圖無法直接通過ETC1格式來進行儲存。對此,我們建議研發團隊將透明貼圖盡可能分拆成兩張,即一張RGB24位紋理記錄原始紋理的顏色部分和一張Alpha8紋理記錄原始紋理的透明通道部分。然后,將這兩張貼圖分別轉化為ETC1格式的紋理,并通過特定的Shader來進行渲染,從而來達到支持透明貼圖的效果。該種方法不僅可以極大程度上逼近RGBA透明貼圖的渲染效果,同時還可以降低紋理的內存占用,是我們非常推薦的使用方式。

當然,目前已經有越來越多的設備支持了OpenGL ES 3.0,這樣Android平臺上你可以進一步使用ETC2甚至ASTC,這些紋理格式均為支持透明通道且壓縮比更為理想的紋理格式。如果你的游戲適合人群為中高端設備用戶,那么不妨直接使用這兩種格式來作為紋理的主要存儲格式。

(2)紋理尺寸

一般來說,紋理尺寸越大,則內存占用越大。所以,盡可能降低紋理尺寸,如果512x512的紋理對于顯示效果已經夠用,那么就不要使用1024x1024的紋理,因為后者的內存占用是前者的四倍。因此,我們在UWA測評報告中,將紋理的尺寸進行詳細展示,以便開發團隊進行快速檢測

(3) Mipmap功能

Mipmap旨在有效降低渲染帶寬的壓力,提升游戲的渲染效率。但是,開啟Mipmap會將紋理內存提升1.33倍。對于具有較大縱深感的3D游戲來說,3D場景模型和角色我們一般是建議開啟Mipmap功能的,但是在我們的測評項目中,經常會發現部分UI紋理也開啟了Mipmap功能。這其實就沒有必要的,絕大多數UI均是渲染在屏幕最上層,開啟Mipmap并不會提升渲染效率,反倒會增加無謂的內存占用。因此,建議研發團隊在UWA的測評報告中通過Mipmap一項進行排序,詳細檢測開啟Mipmap功能的資源是否為UI資源。

(4) Read & Write

一般情況下,紋理資源的“Read & Write”功能在Unity引擎中是默認關閉的。但是,我們仍然在項目深度優化時發現了不少項目的紋理資源會開啟該選項。對此,我們建議研發團隊密切關注紋理資源中該選項的使用,因為開啟該選項將會使紋理內存增大一倍。

二、網格

網格資源在較為復雜的游戲中,往往占據較高的內存。對于網格資源來說,它在使用時應該注意哪些方面呢?

Normal、Color和Tangent

在我們深度優化過的大量項目中,Mesh資源的數據中經常會含有大量的Color數據、Normal數據和Tangent數據。這些數據的存在將大幅度增加Mesh資源的文件體積和內存占用。其中,Color數據和Normal數據主要為3DMax、Maya等建模軟件導出時設置所生成,而Tangent一般為導入引擎時生成。

更為麻煩的是,如果項目對Mesh進行Draw Call Batching操作的話,那么將很有可能進一步增大總體內存的占用。比如,100個Mesh進行拼合,其中99個Mesh均沒有Color、Tangent等屬性,剩下一個則包含有Color、Normal和Tangent屬性,那么Mesh拼合后,CombinedMesh中將為每個Mesh來添加上此三個頂點屬性,進而造成很大的內存開銷。正因如此,我們在UWA測評報告中為每個Mesh展示了其Normal、Color和Tangent屬性的具體使用情況,研發團隊可以直接針對每種屬性進行排序查看,直接定位出現冗余數據的資源。

一般來說這些數據主要為Shader所用,來生成較為酷炫的效果。所以,建議研發團隊針對項目中的網格資源進行詳細檢測,查看該模型的渲染Shader中是否需要這些數據進行渲染。

限于篇幅,我們今天只針對紋理和網格資源進行詳細介紹,對于動畫片段、音頻片段等其他資源,建議您直接通過UWA測評報告中進行查看。

2、引擎模塊自身占用

引擎自身中存在內存開銷的部分紛繁復雜,可以說是由巨量的“微小”內存所累積起來的,比如GameObject及其各種Component(最大量的Component應該算是Transform了)、ParticleSystem、MonoScript以及各種各樣的模塊Manager(SceneManager、CanvasManager、PersistentManager等)...

一般情況下,上面所指出的引擎各組成部分的內存開銷均比較小,真正占據較大內存開銷的是這兩處:WebStream 和 SerializedFile。其絕大部分的內存分配則是由AssetBundle加載資源所致。簡單言之,當您使用new WWW或CreateFromMemory來加載AssetBundle時,Unity引擎會加載原始數據到內存中并對其進行解壓,而WebStream的大小則是AssetBundle原始文件大小 + 解壓后的數據大小 + DecompressionBuffer(0.5MB)。同時,由于Unity 5.3版本之前的AssetBundle文件為LZMA壓縮,其壓縮比類似于Zip(20%-25%),所以對于一個1MB的原始AssetBundle文件,其加載后WebStream的大小則可能是5~6MB,因此,當項目中存在通過new WWW加載多個AssetBundle文件,且AssetBundle又無法及時釋放時,WebStream的內存可能會很大,這是研發團隊需要時刻關注的。

對于SerializedFile,則是當你使用LoadFromCacheOrDownload、CreateFromFile或new WWW本地AssetBundle文件時產生的序列化文件。

對于WebStream和SerializedFile,你需要關注以下兩點:

是否存在AssetBundle沒有被清理干凈的情況。開發團隊可以通過Unity Profiler直接查看其使用具體的使用情況,并確定Take Sample時AssetBundle的存在是否合理;

對于占用WebStream較大的AssetBundle文件(如UI Atlas相關的AssetBundle文件等),建議使用LoadFromCacheOrDownLoad或CreateFromFile來進行替換,即將解壓后的AssetBundle數據存儲于本地Cache中進行使用。這種做法非常適合于內存特別吃緊的項目,即通過本地的磁盤空間來換取內存空間。

3、托管堆內存占用

對于目前絕大多數基于Unity引擎開發的項目而言,其托管堆內存是由Mono分配和管理的。“托管” 的本意是Mono可以自動地改變堆的大小來適應你所需要的內存,并且適時地調用垃圾回收(Garbage Collection)操作來釋放已經不需要的內存,從而降低開發人員在代碼內存管理方面的門檻。

但是這并不意味著研發團隊可以在代碼中肆無忌憚地開辟托管堆內存,因為目前Unity所使用的Mono版本存在一個很嚴重的問題,即:Mono的堆內存一旦分配,就不會返還給系統。這意味著Mono的堆內存是只升不降的。舉個例子,項目運行時,在場景A中開辟了60MB的托管堆內存,而到下一場景B時,只需要使用20MB的托管堆內存,那么Mono中將會存在40MB空閑的堆內存,且不會返還給系統。這是我們非常不愿意看到的現象,因為對于游戲(特別是移動游戲)來說,內存的占用可謂是寸土寸金的,讓Mono毫無必要地鎖住大量的內存,是一件非常浪費的事情。所以,我們在UWA測評報告中,為研發團隊統計了測試過程中累積的函數堆內存分配量,大家只需要通過查看堆內存分配Top10的函數,即可快速對其底層代碼實現進行查看,定位是否有分配不必要堆內存的代碼存在。

讀到這里,你可能會產生這樣的疑問:我知道了哪些函數的堆內存分配大了,但是我該如何去進一步定位不必要的堆內存呢?

這是我們經常遇到的問題,所以在我們的深度項目優化服務中,我們都會直接進駐到項目團隊,現場查看項目代碼并對問題代碼進行定位。在經過了大量的深度檢測后,我們發現用戶不必要的堆內存分配主要來自于以下幾個方面:

高頻率地 New Class/Container/Array等。研發團隊切記不要在Update、FixUpdate或較高調用頻率的函數中開辟堆內存,這會對你的項目內存和性能均造成非常大的傷害。做個簡單的計算,假設你的項目中某一函數每一幀只分配100B的堆內存,幀率是1秒30幀,那么1秒鐘游戲的堆內存分配則是3KB,1分鐘的堆內存分配就是180KB,10分鐘后就已經分配了1.8MB。如果你有10個這樣的函數,那么10分鐘后,堆內存的分配就是18MB,這期間,它可能會造成Mono的堆內存峰值升高,同時又可能引起了多次GC的調用。在我們的測評項目中,一個函數在10分鐘內分配上百MB的情況比比皆是,有時候甚至會分配上GB的堆內存。

Log輸出。我們發現在大量的項目中,仍然存在大量Log輸出的情況。建議研發團隊對自身Log的輸出進行嚴格的控制,僅保留關鍵Log,以避免不必要的堆內存分配。對此,我們在UWA測評報告中對Log的輸出進行了詳細的檢測,不僅提供詳細的性能開銷,同時占用Log輸出的調用路徑。這樣,研發團隊可直接通過報告定位和控制Log的輸出。

UIPanel.LateUpdate。這是NGUI中CPU和堆內存開銷最大的函數。它本身只是一個函數,但NGUI的大量使用使它逐漸成為了一個不可忽視規則。該函數的堆內存分配和自身CPU開銷,其根源上是一致的,即是由UI網格的重建造成。

關于代碼堆內存分配的注意點還有很多,比如String連接、部分引擎API(GetComponent)的使用等等,這些已經是老生常談了,鑒于篇幅限制不在此處多作介紹,大家感興趣可以Google自行搜索。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • cpu
    cpu
    +關注

    關注

    68

    文章

    10825

    瀏覽量

    211142
  • 內存管理
    +關注

    關注

    0

    文章

    168

    瀏覽量

    14125
  • vr
    vr
    +關注

    關注

    34

    文章

    9633

    瀏覽量

    150058

原文標題:游戲性能優化技術干貨分享——內存管理

文章出處:【微信號:Imgtec,微信公眾號:Imagination Tech】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    CPU內存GPU內存進行分組方式實戰

    CPU+GPU協同計算中,CPUGPU的計算能力不同,靜態地給CPUGPU劃分任務會導致CPU
    的頭像 發表于 05-03 09:01 ?7096次閱讀
    <b class='flag-5'>CPU</b><b class='flag-5'>內存</b>或<b class='flag-5'>GPU</b><b class='flag-5'>內存</b><b class='flag-5'>進行</b>分組方式實戰

    CPUGPU內存知識科普

    本文內容包括CPU內存GPU知識,本期重點更新GPUCPU部分知識。比如:GPU更新包括架
    的頭像 發表于 11-13 11:47 ?1837次閱讀
    <b class='flag-5'>CPU</b>、<b class='flag-5'>GPU</b>和<b class='flag-5'>內存</b>知識科普

    GPU的作用、原理及與CPU、DSP的區別

    今天,GPU已經不再局限于3D圖形處理了,GPU通用計算技術發展已經引起業界不少的關注,事實也證明在浮點運算、并行計算等部分計算方面GPU可以提供數十倍乃至于上百倍于
    發表于 11-04 10:04

    GPU

    ;L之外,還要做內存管理、輸入響應等非3D圖形處理工作,因此在實際運算的時候性能會大打折扣,常常出現顯卡等待CPU數據的情況,其運算速度遠跟不上今天復雜維游戲的要求。即使
    發表于 01-16 08:59

    如何在vGPU環境中優化GPU性能

    大家好,我收到了關于如何在vGPU環境中優化GPU性能的兩個請求,并認為這將是我們的GRID論壇上的一個很好的線程,每個人都可以在他們如何微調vGPU環境方面添加他們的經驗。讓我從一些
    發表于 09-29 14:18

    CPU,GPU,TPU,NPU都是什么

    嵌入式算法移植優化學習筆記5——CPU,GPU,TPU,NPU都是什么一、什么是CPU?二、什么是GPU?
    發表于 12-15 06:07

    充分利用Arm NN進行GPU推理

    ACL19.05版本中,調諧器進行優化,現在我們可以從個級別的調優中進行選擇:“窮舉”、“快速”和“正常”。這些級別在調優性能和調優時間
    發表于 04-11 17:33

    一文帶你詳解芯片--SL8541e-系統性能優化

    背景 伙伴反饋,設備操作卡頓,OH基礎系統版本應用操作慢,應用人機交互體驗差。本文為你總結芯片解決方案–SL8541e-系統性能優化主要內容包括: *1. 確定優化思路 幀率
    發表于 08-22 09:12

    什么是GPUGPU主要作用和工作原理以及GPUCPU的區別

    圖像和特效時主要依賴CPU的處理能力,稱為軟加速。3D顯示芯片是將維圖像和特效處理功能集中在顯示芯片內,也即所謂的硬件加速功能。顯示芯片通常是顯示卡上最大的芯片(也是引腳最多的)。GPU
    發表于 09-13 09:43 ?13次下載

    Linux CPU性能應該如何優化

    在Linux系統中,由于成本的限制,往往會存在資源上的不足,例如 CPU內存、網絡、IO 性能。本文,就對 Linux 進程和 CPU 的原理進行
    的頭像 發表于 01-18 08:52 ?3335次閱讀

    Unity 3D優化個的注意方面

    Unity優化是一個很大的概念,我們優化時需要注意方面CPU優化
    的頭像 發表于 03-13 16:47 ?3374次閱讀

    cpu主要性能指標是什么 CPUGPU的設計區別

    CPUGPU的設計區別 CPU需要很強的通用性來處理各種不同的數據類型;GPU面對的則是類型高度統一的、相互無依賴的大規模數據和不需要被打斷的純凈的計算環境。
    的頭像 發表于 08-31 12:03 ?9352次閱讀

    CPUGPU之間的主要區別

    的任務。GPU的指令有限,只能執行與圖形相關的任務。它通常可以執行任何類型的任務,包括圖形,但不是以非常優化的方式。雖然GPU的唯一目的是比CPU更快地處理圖像和3
    的頭像 發表于 12-14 08:28 ?760次閱讀
    <b class='flag-5'>CPU</b>和<b class='flag-5'>GPU</b>之間的<b class='flag-5'>主要</b>區別

    為什么GPUCPU更快?

    大規模數據集時比CPU更快的根本原因。內存帶寬:GPU內存帶寬比CPU高得多。內存帶寬是指數據
    的頭像 發表于 01-26 08:30 ?2242次閱讀
    為什么<b class='flag-5'>GPU</b>比<b class='flag-5'>CPU</b>更快?

    Windows管理內存主要方式

    Windows操作系統提供了多種方式來管理內存,以確保系統資源的有效利用和性能優化。以下是關于Windows管理內存
    的頭像 發表于 10-12 17:09 ?408次閱讀