Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/122.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我怎样才能得到“数量”呢;“免费”;iOS上的Unity3d内存?_C#_Ios_Objective C_Unity3d - Fatal编程技术网

C# 我怎样才能得到“数量”呢;“免费”;iOS上的Unity3d内存?

C# 我怎样才能得到“数量”呢;“免费”;iOS上的Unity3d内存?,c#,ios,objective-c,unity3d,C#,Ios,Objective C,Unity3d,我有一个问题:如果我试图创建一个屏幕截图,游戏会在一些设备上崩溃(最明显的是,iPod 4G)。据推测,这是因为内存不足。在创建屏幕截图之前,我想检测是否可以安全地分配所需的内存量,如果我认为我将崩溃,则向播放器显示警告 然而,像纹理这样的资源似乎是在Mono VM之外管理的。当我有16mb的地图集时,System.GC.GetTotalMemory返回9mb。所以,似乎我必须为此编写一个插件 (有一节描述了我没有收到内存不足的警告,但似乎我弄错了,在Objective-C级别上,成功地发出了警

我有一个问题:如果我试图创建一个屏幕截图,游戏会在一些设备上崩溃(最明显的是,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