C# 我怎样才能得到“数量”呢;“免费”;iOS上的Unity3d内存?
我有一个问题:如果我试图创建一个屏幕截图,游戏会在一些设备上崩溃(最明显的是,iPod 4G)。据推测,这是因为内存不足。在创建屏幕截图之前,我想检测是否可以安全地分配所需的内存量,如果我认为我将崩溃,则向播放器显示警告 然而,像纹理这样的资源似乎是在Mono VM之外管理的。当我有16mb的地图集时,System.GC.GetTotalMemory返回9mb。所以,似乎我必须为此编写一个插件 (有一节描述了我没有收到内存不足的警告,但似乎我弄错了,在Objective-C级别上,成功地发出了警告)C# 我怎样才能得到“数量”呢;“免费”;iOS上的Unity3d内存?,c#,ios,objective-c,unity3d,C#,Ios,Objective C,Unity3d,我有一个问题:如果我试图创建一个屏幕截图,游戏会在一些设备上崩溃(最明显的是,iPod 4G)。据推测,这是因为内存不足。在创建屏幕截图之前,我想检测是否可以安全地分配所需的内存量,如果我认为我将崩溃,则向播放器显示警告 然而,像纹理这样的资源似乎是在Mono VM之外管理的。当我有16mb的地图集时,System.GC.GetTotalMemory返回9mb。所以,似乎我必须为此编写一个插件 (有一节描述了我没有收到内存不足的警告,但似乎我弄错了,在Objective-C级别上,成功地发出了警
我如何才能在不崩溃的情况下获得分配的“空闲”内存量?也许还有其他方法可以实现我想要的功能?因此,在一些objective-c专家的帮助下,我找到了我想要的代码片段。我必须警告你,我不明白这个Obj-C代码到底是怎么做的,它被认为是一个“黑客”;然而,事实证明这是解决我问题的最好办法 在plugin.mm文件中:
#import <mach/mach.h>
#import <mach/mach_host.h>
extern "C"
{
const int HWUtils_getFreeMemory()
{
mach_port_t host_port;
mach_msg_type_number_t host_size;
vm_size_t pagesize;
host_port = mach_host_self();
host_size = sizeof(vm_statistics_data_t) / sizeof(integer_t);
host_page_size(host_port, &pagesize);
vm_statistics_data_t vm_stat;
if (host_statistics(host_port, HOST_VM_INFO, (host_info_t)&vm_stat, &host_size) != KERN_SUCCESS)
NSLog(@"Failed to fetch vm statistics");
/* Stats in bytes */
// Calculating total and used just to show all available functionality
natural_t mem_used = (vm_stat.active_count +
vm_stat.inactive_count +
vm_stat.wire_count) * pagesize;
natural_t mem_free = vm_stat.free_count * pagesize;
natural_t mem_total = mem_used + mem_free;
NSLog(@"used: %u free: %u total: %u", mem_used, mem_free, mem_total);
return (int) mem_free;
}
}
所以,在一些objective-c专家的帮助下,我找到了我想要的代码片段。我必须警告你,我不明白这个Obj-C代码到底是怎么做的,它被认为是一个“黑客”;然而,事实证明这是解决我问题的最好办法 在plugin.mm文件中:
#import <mach/mach.h>
#import <mach/mach_host.h>
extern "C"
{
const int HWUtils_getFreeMemory()
{
mach_port_t host_port;
mach_msg_type_number_t host_size;
vm_size_t pagesize;
host_port = mach_host_self();
host_size = sizeof(vm_statistics_data_t) / sizeof(integer_t);
host_page_size(host_port, &pagesize);
vm_statistics_data_t vm_stat;
if (host_statistics(host_port, HOST_VM_INFO, (host_info_t)&vm_stat, &host_size) != KERN_SUCCESS)
NSLog(@"Failed to fetch vm statistics");
/* Stats in bytes */
// Calculating total and used just to show all available functionality
natural_t mem_used = (vm_stat.active_count +
vm_stat.inactive_count +
vm_stat.wire_count) * pagesize;
natural_t mem_free = vm_stat.free_count * pagesize;
natural_t mem_total = mem_used + mem_free;
NSLog(@"used: %u free: %u total: %u", mem_used, mem_free, mem_total);
return (int) mem_free;
}
}
解释您自己的答案:这不是objective-C代码,而是普通的旧C代码,使用Mach API从内核获取统计信息。Mach API是XNU导出的低级API,它是一个混合内核,由顶层(导出BSD API,就像我们从UN*X知道并喜欢的通常系统调用)和底层(即Mach)组成。 该代码使用Mach“主机”抽象,它(除其他外)提供有关操作系统级资源利用率的统计信息 具体来说,这里有一个完整的注释:
#import <mach/mach.h> // Required for generic Mach typedefs, like the mach_port_t
#import <mach/mach_host.h> // Required for the host abstraction APIs.
extern "C" // C, rather than objective-c
{
const int HWUtils_getFreeMemory()
{
mach_port_t host_port;
mach_msg_type_number_t host_size;
vm_size_t pagesize;
// First, get a reference to the host port. Any task can do that, and this
// requires no privileges
host_port = mach_host_self();
host_size = sizeof(vm_statistics_data_t) / sizeof(integer_t);
// Get host page size - usually 4K
host_page_size(host_port, &pagesize);
vm_statistics_data_t vm_stat;
// Call host_statistics, requesting VM information.
if (host_statistics(host_port, // As obtained from mach_host_self()
HOST_VM_INFO, // Flavor - many more in <mach/host_info.h>(host_info_t)&vm_stat, // OUT - this will be populated
&host_size) // in/out - sizeof(vm_stat).
!= KERN_SUCCESS)
NSLog(@"Failed to fetch vm statistics"); // log error
/* Stats in bytes */
// Calculating total and used just to show all available functionality
// This part is basic math. Counts are all in pages, so multiply by pagesize
// Memory used is sum of active pages, (resident, used)
// inactive, (resident, but not recently used)
// and wired (locked in memory, e.g. kernel)
natural_t mem_used = (vm_stat.active_count +
vm_stat.inactive_count +
vm_stat.wire_count) * pagesize;
natural_t mem_free = vm_stat.free_count * pagesize;
natural_t mem_total = mem_used + mem_free;
NSLog(@"used: %u free: %u total: %u", mem_used, mem_free, mem_total);
return (int) mem_free;
}
#导入//通用马赫数类型定义需要,如马赫数端口
#导入//主机抽象API所需。
外部“C”//C,而不是目标C
{
常量int HWUtils_getFreeMemory()
{
主机端口;
机器型号主机尺寸;
虚拟机大小页面大小;
//首先,获取对主机端口的引用
//不需要特权
主机端口=马赫主机自身();
主机大小=sizeof(虚拟机统计数据)/sizeof(整数);
//获取主机页大小-通常为4K
主机页面大小(主机端口和页面大小);
虚拟机统计数据虚拟机统计;
//调用主机统计信息,请求VM信息。
if(主机\统计信息(主机\端口,//从mach\主机\自身()获取)
HOST\u VM\u INFO,//Flavor-更多输入(HOST\u INFO\t)和VM\u stat,//OUT-这将被填充
&主机大小)//in/out-sizeof(vm\u stat)。
!=KERN_成功)
NSLog(@“无法获取vm统计信息”);//日志错误
/*以字节为单位的统计数据*/
//计算总计并仅用于显示所有可用功能
//这部分是基础数学。计数都在页面中,所以乘以页面大小
//使用的内存是活动页的总和(常驻,已用)
//非活动(常驻,但最近未使用)
//和有线(锁定在内存中,例如内核)
使用的自然内存=(vm\u stat.active\u计数+
虚拟机统计非活动计数+
vm_stat.wire_count)*页面大小;
natural_t mem_free=vm_stat.free_count*页面大小;
自然内存总量=已使用内存+未使用内存;
NSLog(@“已使用:%u空闲:%u总计:%u”,已使用、未使用、总计);
返回(int)mem_free;
}
解释您自己的答案:这不是objective-C代码,而是普通的旧C代码,使用Mach API从内核获取统计信息。Mach API是XNU导出的低级API,它是由顶层组成的混合内核(它导出BSD API,就像我们从UN*X知道和喜欢的通常系统调用一样),以及底层——马赫数。
该代码使用Mach“主机”抽象,它(除其他外)提供有关操作系统级资源利用率的统计信息
具体来说,这里有一个完整的注释:
#import <mach/mach.h> // Required for generic Mach typedefs, like the mach_port_t
#import <mach/mach_host.h> // Required for the host abstraction APIs.
extern "C" // C, rather than objective-c
{
const int HWUtils_getFreeMemory()
{
mach_port_t host_port;
mach_msg_type_number_t host_size;
vm_size_t pagesize;
// First, get a reference to the host port. Any task can do that, and this
// requires no privileges
host_port = mach_host_self();
host_size = sizeof(vm_statistics_data_t) / sizeof(integer_t);
// Get host page size - usually 4K
host_page_size(host_port, &pagesize);
vm_statistics_data_t vm_stat;
// Call host_statistics, requesting VM information.
if (host_statistics(host_port, // As obtained from mach_host_self()
HOST_VM_INFO, // Flavor - many more in <mach/host_info.h>(host_info_t)&vm_stat, // OUT - this will be populated
&host_size) // in/out - sizeof(vm_stat).
!= KERN_SUCCESS)
NSLog(@"Failed to fetch vm statistics"); // log error
/* Stats in bytes */
// Calculating total and used just to show all available functionality
// This part is basic math. Counts are all in pages, so multiply by pagesize
// Memory used is sum of active pages, (resident, used)
// inactive, (resident, but not recently used)
// and wired (locked in memory, e.g. kernel)
natural_t mem_used = (vm_stat.active_count +
vm_stat.inactive_count +
vm_stat.wire_count) * pagesize;
natural_t mem_free = vm_stat.free_count * pagesize;
natural_t mem_total = mem_used + mem_free;
NSLog(@"used: %u free: %u total: %u", mem_used, mem_free, mem_total);
return (int) mem_free;
}
#导入//通用马赫数类型定义需要,如马赫数端口
#导入//主机抽象API所需。
外部“C”//C,而不是目标C
{
常量int HWUtils_getFreeMemory()
{
主机端口;
机器型号主机尺寸;
虚拟机大小页面大小;
//首先,获取对主机端口的引用
//不需要特权
主机端口=马赫主机自身();
主机大小=sizeof(虚拟机统计数据)/sizeof(整数);
//获取主机页大小-通常为4K
主机页面大小(主机端口和页面大小);
虚拟机统计数据虚拟机统计;
//调用主机统计信息,请求VM信息。
if(主机\统计信息(主机\端口,//从mach\主机\自身()获取)
HOST\u VM\u INFO,//Flavor-更多输入(HOST\u INFO\t)和VM\u stat,//OUT-这将被填充
&主机大小)//in/out-sizeof(vm\u stat)。
!=KERN_成功)
NSLog(@“无法获取vm统计信息”);//日志错误
/*以字节为单位的统计数据*/
//计算总计并仅用于显示所有可用功能
//这部分是基础数学。计数都在页面中,所以乘以页面大小
//使用的内存是和o