Re: [請益] Unity 遊戲使用了多少記憶體

看板GameDesign (遊戲設計)作者 (什麼....)時間10年前 (2015/01/13 20:38), 10年前編輯推噓2(202)
留言4則, 1人參與, 最新討論串2/2 (看更多)
※ 引述《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
謝謝你,這招我有試過,要用development build才看的到
01/14 08:32, 1F

01/14 08:35, , 2F
目前我是在c#中寫一個exe,去抓遊戲的pid抓他的記憶體量
01/14 08:35, 2F

01/14 08:36, , 3F
然後按一個按鈕,開啟EXE並回傳記憶體量 QQ
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
文章代碼(AID): #1KjH6j-h (GameDesign)
討論串 (同標題文章)
文章代碼(AID): #1KjH6j-h (GameDesign)