using UnityEngine;
using System.Collections;
using System.Runtime.InteropServices;
public class GetMemoryClass2 : MonoBehaviour
{
private int FreeMemory = 0;
[StructLayout(LayoutKind.Sequential)]
public struct MEMORYSTATUSEX
{
public uint dwLength;
public uint dwMemoryLoad;
public ulong ullTotalPhys;
public ulong ullAvailPhys;
public ulong ullTotalPageFile;
public ulong ullAvailPageFile;
public ulong ullTotalVirtual;
public ulong ullAvailVirtual;
public ulong ullAvailExtendedVirtual;
}
[StructLayout(LayoutKind.Sequential)]
public struct MemoryStatus
{
public uint Length;
public uint MemoryLoad;
public ulong TotalPhysical;
public ulong AvailablePhysical;
public ulong TotalPageFile;
public ulong AvailablePageFile;
public ulong TotalVirtual;
public ulong AvailableVirtual;
}
[DllImport("kernel32.dll")]
public static extern void GlobalMemoryStatusEx(ref MEMORYSTATUSEX stat);
[DllImport("kernel32.dll")]
public static extern void GlobalMemoryStatus(ref MemoryStatus stat);
public void GetMemory()
{
MEMORYSTATUSEX stat = new MEMORYSTATUSEX();
stat.dwLength = (uint)Marshal.SizeOf(typeof(MEMORYSTATUSEX));
GlobalMemoryStatusEx(ref stat);
long ram = (long)stat.ullAvailPhys / 1024 / 1024;
Debug.Log("statullAvailPhys:" + stat.ullAvailPhys / 1024 / 1024);
Debug.Log("statullTotalPhys:" + stat.ullTotalPhys / 1024 / 1024);
Debug.Log("statullTotalVirtual:" + stat.ullTotalVirtual / 1024 / 1024 / 1024);
MemoryStatus stat2 = new MemoryStatus();
stat2.Length = (uint)Marshal.SizeOf(typeof(MemoryStatus));
GlobalMemoryStatus(ref stat2);
Debug.Log("stat2:"+stat2.AvailablePhysical / 1024 / 1024);
}
void Update()
{
GetMemory();
}
}
以上代码两个方法在64位系统获取的剩余内存均显示一样且正确,但是在32位系统方法1显示的内存正常,另一个方法得出的剩余内存偏大,具体原因还在寻找,也欢迎大家有知道原因的给出解释,谢谢!