作者chowleft (什麼....)
看板GameDesign
標題Re: [請益] Unity 遊戲使用了多少記憶體
時間Tue Jan 13 20:38:03 2015
※ 引述《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://webptt.com/m.aspx?n=bbs/GameDesign/M.1421152685.A.FAB.html
※ 編輯: chowleft (118.163.12.157), 01/13/2015 21:58:53
1F:推 Euteamo: 謝謝你,這招我有試過,要用development build才看的到 01/14 08:32
2F:→ Euteamo: 目前我是在c#中寫一個exe,去抓遊戲的pid抓他的記憶體量 01/14 08:35
3F:→ Euteamo: 然後按一個按鈕,開啟EXE並回傳記憶體量 QQ 01/14 08:36
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
4F:推 Euteamo: 謝謝分享 有成功喔!! 01/17 09:47