作者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/cn.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