一,问题

在之前的手游项目中,内存使用过多,都开始崩溃了,所以得做iOS内存统计。内存统计有好几种方法:XCode内存使用统计、UnityInternalProfile内存统计,Mono内存统计等方法。

二、测试研究

但是XCode统计需要连手机,UnityInternalProfile的内存统计值与XCode内存统计值差距又太大,崩溃时的内存值跟谁有关系?如何在手机上自己显示内存总量?后面就自己琢磨怎样实现一个适合的内存统计功能。

研究了下UnityInternalProfile,发现它拿的是mach_base_task_info里的resident_size(物理内存占用)。

然后我做了个测试,每几帧分配使用一定大小的内存,然后打印出xcode统计的内存和resident_size。

横坐标是时间,纵坐标是内存。

resident_size值的增长随着内存增长,但增长到一定程度就不怎么变了,当时猜测可能是被压缩了,查资料(MacOS有使用内存压缩技术)和代码,发现iOS还有task_vm_info 这个结构体,里面刚好有compress这项。

然后增加compress这项数值的输出,重新测试!

在内存使用持续增加过程中,游戏账号购买平台当resident_size(物理内存)不再增加时,compress这项线性增长。

三、推论

由图可以看出:实际内存使用 = resident + compress。由此可以认为iOS通过压缩内存来减少内存占用。

并且在测试过程中,发现当实际使用内存达到系统物理内存一半时,系统会不断发送memorywarning的警告,达到60%时就会Q掉App。

四、应用

现在只需要实时拿到task_vm_info里的resident 和 compress 就可以统计App的实际内存的使用量了,对于Unity手机项目来说,需要写Native和C#代码,幸运的是,我已经帮你把代码写好了。

在XCodePostProcess::OnPostProcessBuild()里加入如下代码,会在Unity生成的XCode工程自动插入如下Native代码:

XClass AppRender = new XClass(pathToBuiltProject + "/Classes/UnityAppController+Rendering.mm");
        if( AppRender != null)
        {
            string TCode = "";
            TCode +=   "#include <mach/mach_time.h>\n";
            TCode +=   "#include <mach/mach.h>\n";
            TCode +=   "#include <mach/mach_host.h>\n";
            TCode +=   "#include <mach/task_info.h>\n";
            TCode +=   "#include <mach/task.h>\n";
            TCode +=   "static float GetTotalPhysicsMemory( )\n";
            TCode +=   "{\n";
            TCode +=   "    kern_return_t kr;\n";
            TCode +=   "    mach_msg_type_number_t info_count = TASK_VM_INFO_COUNT;\n";
            TCode +=   "    task_vm_info_data_t vm_info;\n";
            TCode +=   "    kr = task_info(mach_task_self(), TASK_VM_INFO, (task_info_t)&vm_info, &info_count);\n";
            TCode +=   "    if (kr == KERN_SUCCESS) return (float)(vm_info.compressed  + vm_info.resident_size) / 1024.0 / 1024.0;\n";
            TCode +=   "    return 0;\n";
            TCode +=   "}\n";
            TCode +=   "extern \"C\" float _Get_Profiler_TotalPhysicMemory(){return _fLockStepPhysicMemory;}\n";
            TCode +=   "extern \"C\" void UnityRepaint()";

AppRender.Replace("extern \"C\" void UnityRepaint()",TCode );
        }

在UnityC#里加入以下托管代码,调用 Get_Profiler_TotalPhysicMemory()即可实时拿到内存使用值。

#if ( UNITY_IPHONE && !UNITY_EDITOR )

[DllImport("__Internal")]
    static extern float _Get_Profiler_TotalPhysicMemory( );

public static float Get_Profiler_TotalPhysicMemory( )
    {
        return _Get_Profiler_TotalPhysicMemory( );
    }
#endif

五、补充

由于系统有分页机制,即你申请使用1字节的内存,系统也有可能会给你一整页(16k大小的物理页),所以会导致这里的实际内存使用量(内存分页总和)与XCode内存统计(精确统计)不完成相等,但大致符合一定比例。

关于腾讯游戏学院专家团

如果你的游戏也富有想法充满创意,如果你的团队现在也遇到了一些开发瓶颈,那么欢迎你来联系我们。腾讯游戏学院聚集了腾讯及行业内策划、美术、程序等领域的游戏专家,我们将为全世界的创意游戏团队提供专业的技术指导和游戏调优建议,解决团队在开发过程中遇到的一系列问题。

如何让手游内存占用更小?从内存消耗iOS实时统计开始相关推荐

  1. HarmonyOS内存占用,华为HarmonyOS对比EMUI11:内存占用更少 系统更流畅

    互联网/电商, 互联网/电商,华为HarmonyOS对比EMUI11:内存占用更少 系统更流畅华为HarmonyOS对比EMUI11:内存占用更少 系统更流畅,华为HarmonyOS对比EMUI11: ...

  2. 想让云端平台内存占用变小的方法参考

    云端平台真是个好软件,我现在大部分软件都虚拟化(即通过云端绿化了),用得很舒服,但一开始的内存占用过大问题一直困扰着我,经过一段时间尝试,琢磨出方法降低内存,并将此方法发在了云端论坛内,现在博客园共享 ...

  3. 【Android 内存优化】Bitmap 内存占用计算 ( Bitmap 图片内存占用分析 | Bitmap 内存占用计算 | Bitmap 不同像素密度间的转换 )

    文章目录 一.Bitmap 内存占用 二.Bitmap 内存占用计算示例 三.Bitmap 内存占用与像素密度 四.Bitmap 内存占用与像素密度示例 一.Bitmap 内存占用 在 Android ...

  4. 狐妖小红娘手游服务器维护,狐妖小红娘手游官网-腾讯游戏

    各位红线仙大家好,我是苏苏.你们平时如何与自己的恋人联系呢?容容姐说,很久以前,涂山没有没有电话和网络,情人若相隔两地,想要互诉衷肠,必须依靠最古老的方式---书信. 如今,咱们<狐妖小红娘&g ...

  5. 狐妖小红娘手游服务器维护,狐妖小红娘手游日常任务速刷攻略

    狐妖小红娘手游日常任务怎么速刷?狐妖小红娘手游必做日常任务有哪些?来看看9k9k小编带来的狐妖小红娘手游日常任务速刷攻略 日常分为20次除虫,10次一起气,20次委托,10次答题,10次比武. 除虫和 ...

  6. android 内存占用60m,占60M内存的吃鸡

    占60M内存的吃鸡是一款卡通像素风格的休闲向枪战游戏,游戏采用的是2.5D视角,这里炫酷的技能伴随着欢乐无限的射击,你还可以和自己的朋友一起组队激战,痛快吃鸡.感兴趣的朋友们快来西西下载体验吧! 游戏 ...

  7. linux 内存占用_分享Linux内存占用几个案例

    案例一 问题 最近一台 CentOS 服务器,发现内存无端损失了许多,free 和 ps 统计的结果相差十几个G,非常奇怪,后来Google了许久才搞明白. 分析 1.linux系统内存消耗主要有三个 ...

  8. 计算机内存占用过高,电脑内存占用高怎么办 Win7内存占用高解决办法

    Win7系统在正常使用的时候会占用很多资源,比如网络诊断,缓存还有其他各种平时大部分时候我们都用不上的资源,如果我们电脑本身内存比较小只有2G内存或者以下,打开程序稍微多加个就会造成Win7内存占用高 ...

  9. win7计算机内存占用高,win7系统内存占用高的解决方法

    我们在操作win7系统电脑的时候,常常会遇到win7系统内存占用高的困惑吧,一些朋友看过网上零散的win7系统内存占用高的处理方法,并没有完完全全明白win7系统内存占用高是如何解决的,今天小编准备了 ...

最新文章

  1. 4月份阿里云ECS和VPC升级公告
  2. HTTP协议的六种请求方法
  3. 「后端小伙伴来学前端了」分析Vue脚手架结构
  4. 免费下载 |《数据分析从理念到实操》白皮书上线!先收藏!
  5. RMI原理及开发实例
  6. Buffers与cached啥区别
  7. mysql执行计划中的temp_MYSQL语句调优:GROUP BY ORDER BY语句中出现USING TEMPATORY
  8. 只考计算机知识吗,计算机二级只考一门吗?计算机二级考什么?
  9. ubuntu 16.04 apache 开启Rewrite功能
  10. [archlinux] linux boot process/order/stage
  11. Linux 学习记录 二 (文件的打包压缩).
  12. html 中写注释吗,html怎么注释?
  13. win10关闭快速启动_Win10系统做了这3项优化,让你的电脑告别卡顿
  14. 流畅的 Python
  15. 支付宝”向他付款”,定额付款收款链接生成
  16. matlab 简介_MATLAB简介
  17. /etc/fstab文件的详解
  18. 卅三先生的工程电磁场讲座.EEm05——边界条件001
  19. 个人成长 | 电子设计大赛感受
  20. K8S 在微服务架构下做服务注册中心的一种思路

热门文章

  1. 全称是什么_JDK,JRE和JVM是什么?三者有什么关系?二分钟搞定!!!
  2. web python php golang_python go 语言完成最简单的web应用
  3. 深度学习-Tensorflow2.2-卷积神经网络{3}-电影评论数据分类/猫狗数据集实例-15
  4. 开发chrome插件(扩展)
  5. maven上传源码脚本
  6. ORA-39095: Dump file space has been exhausted
  7. django中的中间件执行顺序
  8. MySQL的基本语法
  9. 我的Android进阶之旅------gt;Android 关于arm64-v8a、armeabi-v7a、armeabi、x86下的so文件兼容问题...
  10. MongoDB 的 upsert