位置: 编程技术 - 正文

[Android游戏开发经验分享]游戏开发中内存溢出的OOM解决方案——内存图片回收机制(android游戏开发论文)

编辑:rootadmin

推荐整理分享[Android游戏开发经验分享]游戏开发中内存溢出的OOM解决方案——内存图片回收机制(android游戏开发论文),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:android游戏开发大全 pdf,android游戏开发实训总结,android游戏开发需要学什么,android游戏开发 教程,android游戏开发实训总结,android游戏开发框架,android游戏开发框架,android游戏开发实训总结,内容如对您有帮助,希望把文章链接给更多的朋友!

题记:最近有点忙,同时自己也有点懒,没有更新博客。今天刚好发现并解决了一个困扰已久的蛋疼问题,跟大家分享一下。

(本人也是菜鸟入门级,所以语言我尽量写的简单易懂些,这样更适合于新手,如有错的地方,请及时指正。)

Android内存机制:

现在Android手机端的游戏,有一个非常重要,也是非常难搞的问题就是“内存”问题。(如果你开发的是自己试手的Android小游戏,那内存问题基本不会遇到。如果是公司的大型手游项目,如网络游戏,RPG游戏等,千百张图载入手机内存,必定出现“OOM”错误)

毕竟手机不像PC,手机分配给每个程序的内存是有限制的,而且是动态分配的。有很多引擎工具,像Cocos2d-x,AndEngine等都是目前主流的游戏开发工具,这些工具都有自己的一套内存管理机制,但其实引擎中的内存优化机制也是基于Android内存管理机制进行二次代码优化的,说白了也是人为写的,别人能写出来我们也能写出来。所以无论是否使用引擎做的游戏,都有必要了解一些。

介绍下Android游戏开发中内存方面的一些小知识:

(关于堆内存和栈内存这里就不详细解释了,不理解的可以百度搜索下相关内容。简单理解就是栈内存就是储存你新建的变量名,对象名等,堆内存是存储变量,图片对象等的实际内容。)

首先是关于内存的动态分配:

动态分配其实可以这样理解下:当你载入一款手机游戏或程序时,映入的是LOGO图,这时载入的是LOGO图和特效图等,这时程序占用的内存是4M,这时候手机给你分配6M内存空间,当进入游戏菜单时,会载入更多的图和变量,这时程序占用的内存是6M,这时候手机会给你分配M的内存空间。由此可见,手机分配给程序的内存空间是根据程序本身动态进行分配的。但手机不会无限分配给内存空间,当载入图片过多超过内存限制的时候,就去出现OOM的错误。

其次是关于图片在内存中的空间:

有时候你也许很奇怪,你一个png图片只有几十KB,几百KB,堆内存分配的空间足够存储这些图片了,为什么会经常内存溢出报错呢?其实Android内存加载图片是以位图的形式加载各个图片的,android中处理图片的基础类是Bitmap,顾名思义,就是位图。而且像png图片还要计算它的透明通道,所以占用的内存空间非常大。我曾经加载了一张KB的jpg图片,堆内存显示占用空间就有M之大。

最后是如何查看当前程序占用的堆内存:

当你通过Android手机或模拟器调试程序时,切换到ddms(点击Eclipse-DDMS),选中要分析的应用程序,按下update heap ,右面即显示当前程序的堆内存使用情况。

可能有很多地方看不懂,我简单下面介绍几个关键的地方。

Heap Size:堆内存总大小(动态分配的)

Allocated:已使用的内存

Free:剩余内存

[Android游戏开发经验分享]游戏开发中内存溢出的OOM解决方案——内存图片回收机制(android游戏开发论文)

%Userd:内存占用率

Cause GC:手动干涉GC回收内存垃圾

这只是粗略的了解程序的堆内存使用情况。如果有需要的话可以使用MAT内存分析工具,关于android 内存分析(MAT工具的使用),请参考:

只保存图片尺寸大小,不保存图片到内存

BitmapFactory.Options opts = new BitmapFactory.Options(); //缩放的比例,缩放是很难按准备的比例进行缩放的,其&#;表明缩放的倍数,SDK中建议其&#;是2的指数&#;,&#;越大会导致图片不清晰 opts.inSampleSize = 4; Bitmap bmp = null; bmp = BitmapFactory.decodeResource(getResources(), mImageIds[position],opts);

上面是摘抄网上教程的一部分,通过降低图片画质的方法,减少载入图片所占用的内存空间。虽说有可能可以解决,但程序的质量和体验降低了,对程序质量要求不高的可以采取上述方法。

2:Android堆内存自己定义大小:

private final static int CWJ_HEAP_SIZE = 6* * ;VMRuntime.getRuntime().setMinimumHeapSize(CWJ_HEAP_SIZE);

诸如此类的方法,但实际经测试,这种方法基本是没有效果的。

其实每个应用分配的内存大小是有限制的,是由系统决定的;应用出现了OOM,自定义堆内存是行不通的。

3:内存图片回收机制:

Bitmap.recycle() //回收图片所占的内存

System.gc() //提醒系统及时回收

虽然只有简单的两句,但起到的作用是巨大的,也是解决OOM问题最好的方法。

说白了,就是优化代码,手动管理图片的内存释放,比如打开游戏时,载入“游戏菜单”图片-点击按钮进入游戏内容时-释放“游戏菜单”里的所有图片-载入“进入游戏里”的图片。将游戏里的每一块功能所要载入的图片,手动进行载入和释放。屏幕里显示哪些图片内容就加载哪些图片内容,不显示的全部释放或不加载。

大家也许有小疑问,网上的教程里不是说释放图片,只执行Bitmap.recycle() 不就可以了么?这里吐槽下Android垃圾回收机制,其实将图片变量Bitmap.recycle()时,堆内存中并没有立马释放该图片对象所占用的内存,只是通知而已,只是在合适的时候才释放。所以这时候要手动干涉GC回收内存垃圾,再最后加上System.gc()这一行代码。但不要经常使用它,在recycle()释放完一个模块中所有图片内存的最后,再加上System.gc().

总结:解决OOM最好的方法其实还是优化代码,手动干涉GC及时释放不用的图片资源和变量等,以免发生内存溢出。

(有点啰嗦,但毕竟我也是新手,写的啰嗦些,简单些,语言多一些让其他和我一样的新手们更了解和解决这个问题,有什么错误欢迎指正,我及时修改。谢谢!)

Android游戏开发(一) 本专题将进行Android游戏开发的系列讲解Android图形编程基础对于开发游戏,尤其重要。Android图形编程的基本概念:(一)颜色对象Color(二)画笔对象Pai

Android游戏开发(二) 本篇主要讲Paint和Canvas的常见用法。1.Paint的常见设置方法setAntiAlias:设置画笔的锯齿效果setColor:设置画笔颜色setARGB:设置画笔的a,r,g,bsetAlpha:设

游戏引擎 unity3DCocos2d-x在开发畅销游戏的数量方面,Cocos2d-x占据着较大优势,在中国的2D手机游戏开发中,Cocos2d-x引擎的使用份额已超过%,占据2D游戏开发的绝对

标签: android游戏开发论文

本文链接地址:https://www.jiuchutong.com/biancheng/371204.html 转载请保留说明!

上一篇:剑指XX游戏(一) - 寻找自己的节奏(剑指offter)

下一篇:Android游戏开发(一)(Android游戏开发打砖块)

  • 租车怎么缴纳罚款
  • 土地入账成本包含哪些
  • 销项税额期末余额
  • 财产行为税包括资源税吗
  • 水电费收据可以税前扣除吗
  • 三方合同怎么盖章
  • 收到就业补贴财务如何做账
  • 一般企业和小企业会计准则的区别
  • 税收分类编码不对发票可以用吗
  • 库存商品暂估入库
  • 外购货物对外捐赠企业所得税
  • 高新企业职工教育经费扣除比例
  • 贸易公司发票怎么平衡
  • 物业公司预收的物业费一次性申报还是分期申报
  • 广告物料制作费公司怎么做账
  • 存货跌价准备的账务处理
  • 季度所得税预缴可以弥补以前年度亏损吗
  • 航天金税服务费怎么做账
  • 免税发票有几种类型
  • 减免所得税额明细怎么填
  • 销项税额抵减是怎么回事
  • 个体户金税盘清卡失败怎么办
  • 哪些情况下需要更换轮胎
  • 建筑发票怎么抵税
  • 一般纳税人增值税申报操作流程
  • 列入工资的补贴是什么
  • 高新企业认定 研发委外费用
  • 送给经销商的祝福语
  • 微信小程序前端源码
  • 不锈餐具有几种材质
  • 收入支出如何算利润
  • 有意义的分享
  • imu定位
  • 损失函数解读例题
  • 稳岗补贴什么时候到账
  • 工会经费没有交能买发票吗
  • 增值税普通发票查询真伪
  • 什么是企业的应付账款
  • 税负率过低犯法吗
  • 人工成本与工资的关系
  • 差旅费抵扣所得税标准
  • mysql,if
  • 金融工具占比低
  • 知识产权fa
  • 增值税附加税需要写进合同吗
  • 突然收到财付通转出的钱
  • 公司车辆做账交增值税吗
  • 员工还款还公司会计分录
  • 跨年红冲收入记在本年度
  • 基本户打款个人怎么办
  • 应付账款平账调到哪个科目
  • 现金支票作用
  • 如何抵扣不动产增值税
  • 上期留抵税额可以留多久
  • 小规模与一般纳税人的界定
  • 如何恢复数据库数据
  • win7不能复制文件怎么办
  • ubuntu 12.04 intel集成显卡设置分辨率的步骤分享
  • mac怎样修改用户名
  • 卸载软件后整个盘都清空了
  • ubuntu下的vivado2022怎么打开
  • os x10.11el capitan beta6更新了什么?os x10.11el capitan beta6发布下载
  • win7任务栏窗口总是自动切换
  • PHP 7.0.0 Alpha 2 发布
  • vsftpd 配置限制用户目录
  • linux 怎么样
  • win8.1安装包
  • shell根据时间获取文件
  • 当ie7不认!important之后 [布局的解决办法]
  • js实现隔行变色
  • 圣食颐年
  • js 对象声明
  • 如何给图像应用css滤镜处理效果
  • 网络游戏数据包
  • c# datetime.date
  • 税务大厅买票需要什么东西
  • 1万4千块钱交多少个人所得税
  • 西宁市房屋维修基金收费标准2021
  • 哪些税和费计入应交税费
  • 杭州地税局客服电话
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设