Re: [請益] Unity 遊戲使用了多少記憶體
※ 引述《Euteamo (Euteamo)》之銘言:
: 嗨 各位先進大家好
: 小弟最近在研究Unity3D,想要在Unity得到系統資訊:
: 例如 : CPU資訊、顯卡資訊、作業系統版本、記憶體大小等等
: 這些都可以很容易可以利用Unity的SystemInfo得到,但是如標題,我想從Unity得到當前這個遊戲的記憶體使用量
: 有試過用.NET的System.Diagnostics.Process裡面的方法,利用PID去取記憶體大小,在Visual Studio的環境可以正確取得,但是在Unity下怎麼取都只會得到"0"
: 也有試過直接用Unity的profiler去取記憶體,只是跟我在工作管理員下看到的記憶體大小有點差距
: 不知道有沒有先進,可以提點一下,為什麼在Unity下取道的都是"0",或是有其他方法可以取到當前遊戲的記憶體使用量?
小弟試著寫了一下....大概像下面這樣子
http://imgur.com/WzJZ9yZ

扣掉Profiler用的記憶體,應該是有對應到實際用量
如果有錯歡迎各位大大指教
程式碼如下所示 (其實我不太喜歡用GUI, 不過隨便啦XD)
public class MemShow : MonoBehaviour
{
public float MonoMemUsage = 0f;
public float UnityMemUsage = 0f;
StringBuilder _str = new StringBuilder();
void Update ()
{
//! Calculate memory usage
MonoMemUsage = System.GC.GetTotalMemory(true) / 1048576f;
UnityMemUsage = Profiler.usedHeapSize / 1048576f;
}
void OnGUI()
{
_str.Length = 0;
_str.Append("Memory Usage : \n");
//! Mono memory allocation
_str.Append(" - Mono : ");
_str.Append(string.Format("{0:0.00}", MonoMemUsage));
_str.Append(" MB\n");
//! Unity memory allocation
_str.Append(" - Unity : ");
_str.Append(string.Format("{0:0.00}", UnityMemUsage));
_str.Append(" MB\n");
//! Draw GUI
GUI.Box(new Rect(10, 10, 160, 70), "");
GUI.Label(new Rect(15, 15, 150, 60), _str.ToString());
}
}
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.163.12.157
※ 文章網址: https://www.ptt.cc/bbs/GameDesign/M.1421152685.A.FAB.html
※ 編輯: chowleft (118.163.12.157), 01/13/2015 21:58:53
推
01/14 08:32, , 1F
01/14 08:32, 1F
→
01/14 08:35, , 2F
01/14 08:35, 2F
→
01/14 08:36, , 3F
01/14 08:36, 3F
Profiler 類別在 non-development build 會完全失效沒錯 QQ
如果你是在Window上開發,又只想看Process記憶體的話
也可以使用GetProcessMemoryInfo
因為Unity最近的版本開始有支援64位元的版本
需要在參數結構上多做一些判斷
[StructLayout(LayoutKind.Sequential)]
private struct MemInfo
{
public uint cb;
public uint PageFaultCount;
//! 64bit version ?
//! http://feedback.unity3d.com/suggestions/additional-define-variables
#if (UNITY_64 || UNITY_EDITOR_64)
public ulong PeakWorkingSetSize;
public ulong WorkingSetSize;
public ulong QuotaPeakPagedPoolUsage;
public ulong QuotaPagedPoolUsage;
public ulong QuotaPeakNonPagedPoolUsage;
public ulong QuotaNonPagedPoolUsage;
public ulong PagefileUsage;
public ulong PeakPagefileUsage;
#else
public uint PeakWorkingSetSize;
public uint WorkingSetSize;
public uint QuotaPeakPagedPoolUsage;
public uint QuotaPagedPoolUsage;
public uint QuotaPeakNonPagedPoolUsage;
public uint QuotaNonPagedPoolUsage;
public uint PagefileUsage;
public uint PeakPagefileUsage;
#endif
}
[DllImport("psapi.dll", SetLastError = true)]
static extern bool GetProcessMemoryInfo(IntPtr hProcess,
out MemInfo info, uint cb);
MemInfo _memInfo = new MemInfo();
使用時大概像這樣:
IntPtr hWnd = System.Diagnostics.Process.GetCurrentProcess().Handle;
if (GetProcessMemoryInfo(hWnd, out _memInfo,
(uint)Marshal.SizeOf(_memInfo)))
{
//! Total System Memory Usage
WorkingSetSize = _memInfo.WorkingSetSize / 1048576f;
}
不過結果還是會有些誤差,當參考就好XD
http://imgur.com/VEm0jYg

※ 編輯: chowleft (118.163.12.157), 01/14/2015 22:04:19
推
01/17 09:47, , 4F
01/17 09:47, 4F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
GameDesign 近期熱門文章
PTT遊戲區 即時熱門文章
167
417
6
16