⑴ unity 圖集在內存中為什麼大小翻倍
你需要優化紋理圖集(atlases),有時默認產生的atlases有很多空白,裡面的圖片並不是最緊湊的。
⑵ unity2D需要多少內存
需要多少內存,要看你的項目有多少資源,要使用多少插件,要加多少特效,而不是單純地看2d還是3d,關於這個問題你可以到paws3d去看看實例
⑶ unity一個游戲物體類型的變數佔多少內存
經常會遇到考察一個變數佔多大的內存,往往會涉及到很多的細節問題,這里就進行總結一下。1、關於字元變數的內存佔用大小2、關於struct的內
⑷ 如何查看unity 當期內存使用總數
查看內存使用的方式有很多種,但是各個方式查看到的結果可能會有微略不同。
方式一,Running services
通過手機上Running services的Activity查看,可以通過Setting->Applications->Running services進。
關於Running services的詳細內容請參考《Android中使用「running services」查看service進程內存》
方式二,使用ActivityManager的getMemoryInfo(ActivityManager.MemoryInfo outInfo)
ActivityManager.getMemoryInfo()主要是用於得到當前系統剩餘內存的及判斷是否處於低內存運行。
⑸ unity3d texture2d 是用顯存還是內存
這個其實是老版本的Unity的問題,老版本的Unity中使用foreach是比較糟糕的,但是新版本(忘了從哪個版本開始,5.x)這個問題已經搞定了,在有些時候還是挺適合用foreach的。這個是我以前自己嘗試的時候的圖,你可以看一下。這個程序在運行的時候for:foreach可以看到foreach在這個例子中大概比for快了30ms,並且內存差不多。後來做實驗結果是:在固定長度或者不需要計算的時候,for比foreach快,但是在不確定長度或者再計算長度有性能損耗的時候,foreach已經可以了。但是還有一個事就是foreach在跑的時候會鎖定集合中的對象,為此有時候有可能會有額外的程序設計問題,這就靠你自己權衡吧。實驗用的就是unity的性能測試器,你有空可以自己試試看,我也就在我的機器上實驗過。
⑹ Unity3D里3張或者4張512貼圖和1張1024貼圖哪個佔用資源比較多
做測試,從這里可以看到
具體為什麼,你需要了解渲染管線,寄存器等計算機圖形圖像處理知識
⑺ unity waitfortargetfps 佔多大
qualitySetting裡面有垂直同步設置,調成don'tSync能好很多;
手動調整fps,設置 Application.targetFrameRate 為 -1,就是渲染的盡可能快的意思。
⑻ unity3d 游戲app 在ios 佔用內存多大
Unity3D佔用內存太大的解決方法
最近網友通過網站搜索Unity3D在手機及其他平台下佔用內存太大. 這里寫下關於Unity3D對於內存的管理與優化.
Unity3D 里有兩種動態載入機制:一個是Resources.Load,另外一個通過AssetBundle,其實兩者區別不大。 Resources.Load就是從一個預設打進程序包里的AssetBundle里載入資源,而一般AssetBundle文件需要你自己創建,運行時 動態載入,可以指定路徑和來源的。
其實場景里所有靜態的對象也有這么一個載入過程,只是Unity3D後台替你自動完成了。
詳細說一下細節概念:
AssetBundle運行時載入:
來自文件就用CreateFromFile(注意這種方法只能用於standalone程序)這是最快的載入方法
也可以來自Memory,用CreateFromMemory(byte[]),這個byte[]可以來自文件讀取的緩沖,www的下載或者其他可能的方式。
其實WWW的assetBundle就是內部數據讀取完後自動創建了一個assetBundle而已
Create完以後,等於把硬碟或者網路的一個文件讀到內存一個區域,這時候只是個AssetBundle內存鏡像數據塊,還沒有Assets的概念。
Assets載入:
用AssetBundle.Load(同Resources.Load) 這才會從AssetBundle的內存鏡像里讀取並創建一個Asset對象,創建Asset對象同時也會分配相應內存用於存放(反序列化)
非同步讀取用AssetBundle.LoadAsync
也可以一次讀取多個用AssetBundle.LoadAll
AssetBundle的釋放:
AssetBundle.Unload(flase)是釋放AssetBundle文件的內存鏡像,不包含Load創建的Asset內存對象。
AssetBundle.Unload(true)是釋放那個AssetBundle文件內存鏡像和並銷毀所有用Load創建的Asset內存對象。
一個Prefab從assetBundle里Load出來 裡面可能包括:Gameobject transform mesh texture material shader script和各種其他Assets。
你 Instaniate一個Prefab,是一個對Assets進行Clone(復制)+引用結合的過程,GameObject transform 是Clone是新生成的。其他mesh / texture / material / shader 等,這其中些是純引用的關系的,包括:Texture和TerrainData,還有引用和復制同時存在的,包括:Mesh/material /PhysicMaterial。引用的Asset對象不會被復制,只是一個簡單的指針指向已經Load的Asset對象。這種含糊的引用加克隆的混合, 大概是搞糊塗大多數人的主要原因。
專門要提一下的是一個特殊的東西:Script Asset,看起來很奇怪,Unity里每個Script都是一個封閉的Class定義而已,並沒有寫調用代碼,光Class的定義腳本是不會工作的。其 實Unity引擎就是那個調用代碼,Clone一個script asset等於new一個class實例,實例才會完成工作。把他掛到Unity主線程的調用鏈里去,Class實例里的OnUpdate OnStart等才會被執行。多個物體掛同一個腳本,其實就是在多個物體上掛了那個腳本類的多個實例而已,這樣就好理解了。在new class這個過程中,數據區是復制的,代碼區是共享的,算是一種特殊的復制+引用關系。
你可以再Instaniate一個同樣的Prefab,還是這套mesh/texture/material/shader...,這時候會有新的GameObject等,但是不會創建新的引用對象比如Texture.
所以你Load出來的Assets其實就是個數據源,用於生成新對象或者被引用,生成的過程可能是復制(clone)也可能是引用(指針)
當你Destroy一個實例時,只是釋放那些Clone對象,並不會釋放引用對象和Clone的數據源對象,Destroy並不知道是否還有別的object在引用那些對象。
等到沒有任何 游戲場景物體在用這些Assets以後,這些assets就成了沒有引用的游離數據塊了,是UnusedAssets了,這時候就可以通過Resources.UnloadUnusedAssets來釋放,Destroy不能完成這個任 務,AssetBundle.Unload(false)也不行,AssetBundle.Unload(true)可以但不安全,除非你很清楚沒有任何 對象在用這些Assets了。
⑼ Unity3D佔用內存太大怎麼解決
1.壓縮自帶類庫;
2.將暫時不用的以後還需要使用的物體隱藏起來而不是直接Destroy掉;
3.釋放AssetBundle佔用的資源;
4.降低模型的片面數,降低模型的骨骼數量,降低貼圖的大小;
5.使用光照貼圖,使用多層次細節(LOD),使用著色器(Shader),使用預設(Prefab)。
⑽ unity3d中怎麼看預設占內存的大小
由於U3D並沒有很好的詮釋對於圖片的處理方式,所以很多人一直對於圖集的大小和內存的佔用情況都不了解。在此對於U3D的圖片問題做一個實際數據的分析。此前的項目都會存在這樣或者那樣的打包後包大小與內存佔用情況的問題,所以這次所以徹徹底底得分析下U3D對於Texture的處理方式。程序里的內存優化請參考《Unity3d優化之路》。減少U3D包大小請參考《unity3d之如何將包大小減少到極致》。
我打包多種類型的項目,空項目和10張放在Resources文件夾中的圖為比較案例。以下是比較數據。
IPHONE:
1.空項目—-空間佔用量42.3MB—-IPA大小10MB
2.10張1200*520無壓縮Texure 單張圖佔用量2.8MB—-空間佔用量70.2MB—-IPA大小22.9MB
3.10張1200*520壓縮成1024*1024PVRTC4 單張圖佔用量0.5MB—-空間佔用量47.3MB—-IPA大小13.2MB
4. 10張1024*1024無壓縮Texture 單張圖佔用量4MB—-空間佔用量82.3MB—-IPA大小14.6MB
5.10張1024*1024壓縮為PVRTC4格式 單張圖佔用量0.5MB—-空間佔用量47.3MB—-IPA大小11.6MB
宗上數據總結:
一、2的N次方大小的圖片會得到引擎更大的支持,包括壓縮比率,內存消耗,打包壓縮大小,而且支持的力度非常大。
二、減小圖片的佔用大小和內存方式有:圖片大小變化(Maxsize),色彩位數變化(16位,32位),壓縮(PVRC)。
三、U3D對於圖片的格式是自己生成的,而並不是你給他什麼格式,他就用什麼格式,一張1024*1024圖在無壓縮格式下,它會被U3D以無壓縮文件形式存放,也就是說U3D里的Texture Preview里顯示的佔用大小**MB不只是內存佔用大小,還是空間佔用大小。如下圖所示:
U3D的內部機制為自動生成圖片類型來替換我們給的圖片,在圖片的壓縮方式上需要進行謹慎的選擇。
壓縮格式在U3D的Component Reference里有介紹我就不再詳細介紹,只介紹幾個重點的:
RGBA32格式為無壓縮最保真格式,但也是最浪費內存和空間的格式。Automatic Turecolor和它一個意思。
RGBA16格式為無壓縮16位格式,比32位節省一半的空間和內存。Automatic 16bits和它一個意思。
RGBA Compressed PVRTC 4bits格式為PVRTC圖片格式,它相當於把圖片更改了壓縮方式新生成了一個圖片來替換原來的我們給的圖片格式(比如我們給的是PNG格式)。
注意:U3D所有圖片的壓縮格式都會以另一種方式來存儲,不會以你給的方式來存儲,只有你指定了某種格式,它才會轉成你要的格式。而且壓縮格式在Android里並不一定有效,因為Android的機型多,GPU的渲染方式也不一樣,有的是Nvidia,有的是PowerVR,最最好的在安卓機子上啟用RGBA16方式,因為這個是適應所有機型的,並且比32位佔用量少一半,但也需要因項目而異,只是推薦使用的格式,可以多用