傻大方提要:【「Android」UE手游研发中,如何做好Android内存优化?】编者按在大年夜多半人的印象里,用UE引擎制造出来的游戏实际占用内存会比较高。腾讯游戏学院专家Leonn,将和大年夜家分享基于UE的手游开辟中,Android内存分布和优化。文|Leonn在基于...

按关键词阅读:

本文插图

编者按 在大多数人的印象里 , 用UE引擎制作出来的游戏实际占用内存会比较高 。 腾讯游戏学院专家Leonn , 将和大家分享基于UE的手游开发中 , Android内存分布和优化 。

文 | Leonn

在基于UE的手游开发中 , 经常会发现Android系统的实际内存占用要比我们预估的高很多 , 优化内存的占用就要先明确究竟每1k实际的内存占用分布在哪里及如何运用工具有效的获取真实的内存组成 , 本文将结合项目经验详细介绍这个部分 , 并据此分别介绍一些常用的瓶颈和优化 。 最终了解你的Android程序中的每1k内存 。

Android程序内存分配原理

Android内存管理基础

Android内存的管理核心是paging和memory-mapping(mmap) 。

Paging

Android系统中使用虚拟内存地址来索引内存 , 虚拟内存被划分为固定大小的page页 , 典型的页大小为4K 。 内存分配最开始都是在虚拟内存上分配 , 当需要访问这段内存的时候 , 如果发现它没有存在于物理内存上(即MMU不能找到这个虚地址va对应的物理地址pa) , 即发生了缺页(page fault) , 缺页有几种可能:Bug , 程序访问了它不应该访问的虚地址空间 , Android系统会触发访问不合法 , kill掉进程 。

Va是合法的 , 但是这块va对应的pa还从来没有被分配出来过(例如你mmap的一段内存空间 , 但是从来没用过 , 这是第一次在这块内存上写入) , 这叫做lazy-allocation , 这时系统会真正分配一段物理内存给你用 , 然后在页表上对应好这段pa和va 。 注意第一次写入这里才算真正占用了物理内存 , mmap的分配并不算 。

Va是合法的 , 但是这va对应的pa内容当前并没有在物理内存上 , 而是被swap到一个backup的file上 , 这时系统会给这个page在pa上分配物理内存 , 然后将这块内容从文件读回到物理内存上(swap-in) 。

本文插图

Swap和zram

典型的linux系统的虚拟内存都有swap操作 , 即一段物理内存在一段时间不用的时候 , 为了节省物理内存将他们备份到它的backup file上 , 一段时间后缺页时再换回 。

但是在Android上大多数情况是没有这套swap机制的 , 因为对于移动端的IO代价太大 , 所以大多数情况被映射到pa的page是不能被swap的 。 只有一种情况除外 , 即如果这段虚拟地址段具有backup file , 并且当他被swap-in到pa后是只读的 , 那么它是有机会被swap-out回disk的 , 因为swap这种内存的代价很小 , 他们不会在物理内存上被更改 , 通常这类情况包括那些代码文件的mmap(如dex so等) 。

稿源:(腾讯创意游戏合作计划)

【傻大方】网址:http://www.shadafang.com/c/04301501222020.html

标题:「Android」UE手游研发中,如何做好Android内存优化?

android linux 优化,【「Android」UE手游研发中,如何做好Android内存优化?】|Linux|DEX|腾讯游戏|_傻大方...相关推荐

  1. UE 手游在 iOS 平台运行时内存占用太高?试试这样着手优化

    性能优化,对游戏开发来说是一个需要不断钻研的课题,性能越好,游戏才会运行的更加顺畅,玩家的体验感才会更好.腾讯游戏学院专家.游戏客户端开发 Leonn,将和大家分享 UE 手游在 iOS 平台上的内存 ...

  2. 「CTS2019」氪金手游

    「CTS2019」氪金手游 解题思路 考场上想出了外向树的做法,居然没意识到反向边可以容斥,其实外向树会做的话这个题差不多就做完了. 令 \(dp[u][i]\) 表示单独考虑 \(u\) 节点所在子 ...

  3. 【LOJ3124】「CTS2019」氪金手游

    [题目链接] 点击打开链接 [思路要点] 考虑给出的图为外向树的情况,各个点都需要早于子树中所有的点,记 sizeisize_isizei​ 表示 iii 子树中所有点的 wiw_iwi​ 之和,则获 ...

  4. Loj #3124. 「CTS2019 | CTSC2019」氪金手游

    Loj #3124. 「CTS2019 | CTSC2019」氪金手游 题目描述 小刘同学是一个喜欢氪金手游的男孩子. 他最近迷上了一个新游戏,游戏的内容就是不断地抽卡.现在已知: - 卡池里总共有 ...

  5. 「CTS2019 | CTSC2019」氪金手游 解题报告

    「CTS2019 | CTSC2019」氪金手游 降 智 好 题 ... 考场上签到失败了,没想容斥就只打了20分暴力... 考虑一个事情,你抽中一个度为0的点,相当于把这个点删掉了(当然你也只能抽中 ...

  6. Android中对图片的内存优化方法

    Android 中对于图片的内存优化方法 1. 对图片本身进行操作 尽量不要使用 setImageBitmap.setImageResource.BitmapFactory.decodeResourc ...

  7. 夸奖对方代码写的好_不仅会写代码,「得到」程序员还研发了一套“钢铁直男夸人公式”...

    原标题:不仅会写代码,「得到」程序员还研发了一套"钢铁直男夸人公式" 来源:网络 说起程序员,就会想到那句经典的"多喝热水".程序员常常给人一种不擅长聊天的&q ...

  8. 从使命召唤手游国际版将于暑假公测 谈论代理IP在游戏中的作用

    本文关键词:代理IP,手机代理IP软件 从使命召唤手游国际版将于暑假公测 谈论代理IP在游戏中的作用 使命召唤手游官方3月18日发布了最新爆料,正式宣布<使命召唤>国际版将于今年暑假进行公 ...

  9. 【cocos2d-x 手游研发----目录】

    感谢大家一直支持我写这样一系列的博客,从中我自己也获益良多,cocos2d-x这样一款非常棒的引擎,是值得我们去学习和分享的,谈到分享,那我就把这套写了差不多一两个月的框架给大家开源下载,写的很一般, ...

最新文章

  1. 精选SpringBoot+Vue开发的开源系统(前端+后端+小程序)
  2. 第十五届全国大学生智能车竞赛华南赛区成绩与奖项
  3. CentOS 7常用命令
  4. MySql中启用InnoDB数据引擎的方法
  5. DevExpress v19.1新版亮点——WinForms篇(五)
  6. iOS之深入解析操作系统的架构
  7. 汇编语言练习_1_数字分解_显示
  8. SUSE11 搭建iscsi target 配置
  9. Linux多线程实践(10) --使用 C++11 编写 Linux 多线程程序
  10. java 程序更新_如何关闭JAVA更新程序
  11. Maven常见异常及解决方法
  12. [原]逆向iOS SDK -- “添加本地通知”的流程分析
  13. 电商项目——分布式基础概念和电商项目微服务架构图,划分图的详解——第二章——上篇
  14. Android屏幕共享与直播-red5流媒体服务器搭建
  15. c语言入门经典的作用,C语言入门经典
  16. python发送邮件群发软件_python使用tkinter写的邮件群发软件-python图形界面编程
  17. Python Network(二)绘图draw系列draw(),draw_networkx(),draw_networkx_nodes(),draw_networkx_edges()
  18. 高斯公式_注解_高数
  19. 第9章 数据库完整性
  20. STM32 Combined PWM的用法

热门文章

  1. android fragment 优势,Android Fragment详解
  2. androidStudio快捷键概览
  3. Android studio修改包
  4. 基于Python+Django的图书馆管理系统
  5. 基于JAVA+SpringBoot+Vue+Mybatis+MYSQL的图书馆管理系统
  6. 基于JAVA+Servlet+JSP+MYSQL的在线鲜花商城系统
  7. 基于JAVA+SpringMVC+MYSQL的网上订餐系统
  8. 心理软件测试自学,软件测试中的心理学
  9. Linux—文件命令之touch命令
  10. django项目验证码(PIL库实现)