傻大方提要:【「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内存优化?