位置: 编程技术 - 正文

[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游戏开发打砖块)

  • 什么是一般业务
  • 应收账款平均余额包括应收票据吗
  • 超过库存现金限额的现金要及时存入银行
  • 疫情期间公司买水
  • 网上商城的主要功能以及购物流程
  • 一个月作废发票多会有影响吗?
  • 采购是进项还是销项
  • 企业之间无偿借款
  • 未提供一般纳税人证明
  • 物业公司收物业费如何入账
  • 其他应付款冲销怎么做
  • 个人购买车辆的发票可以贷款吗
  • 应收账款贷方余额怎么处理
  • 开公司怎么报账
  • 偷税罪立案标准最新
  • 收入纳税明细怎么打印
  • 怎么查询发票记录
  • 失业保险退保怎么返
  • 待处理财产损益科目编码
  • 出口退税免退税办法
  • 定期结汇会计分录?
  • 公司给职工买工伤险流程
  • 如何禁用Windows10更新
  • 经济作物国家有什么补助吗
  • 三星电脑安装系统按哪个键
  • 手机cpu性能天梯图排行榜
  • 企业开发产品转为自用的,不得在税前扣除折旧费用
  • 利息股息红利个税计算表
  • 销售费用税前扣除吗
  • php log函数
  • vue父子组件加载顺序
  • 加计抵减现代服务税率
  • 深入php第五版中文版pdf
  • php抽象类和普通类的区别
  • Nat Biotechnol –精准 CRISPR-Cas噬菌体疗法将为重症感染患者带来福音
  • echarts中的legend能被监听吗
  • html渐变色背景
  • curl命令上传文件到服务器
  • 支付宝服务窗支付是啥
  • 财政拨付注册资金怎么填
  • 软件开发费属于什么费用
  • 物流破损拒收的理由
  • php安装不了
  • 资本公积和盈余公积都与利润有关
  • 现金周期和经营周期的计算公式
  • 根据工资总额组成的规定下列哪些列入工资总额的范围
  • 小微企业报税是多久报一次
  • 个人独资企业最新税收政策
  • 金税四期的主要功能
  • 应收账款资金占用费怎么算
  • 金税盘注册码怎么查
  • 房产税应纳税额计算例题
  • 外币账户的钱怎么转成人民币
  • 已抵扣认证的发票开红字发票需要将原票退回吗
  • 生产成本有贷方余额怎么调整
  • 疫情期间水电费补贴收入申报企业所得税吗
  • 银行手续费没有发票
  • 发票内容可以写工程款吗
  • 为什么留存收益不考虑筹资费用
  • 知识产权代理所代理
  • 利润表每股收益增加说明什么
  • mysql 模型
  • win造字软件
  • windows8安装程序
  • xp系统怎么弄成win7
  • win8系统升级
  • 如何配置centos7下的apache服务
  • youphone.exe是什么
  • win7打开文件提示用户没有访问权限怎么办
  • android:ViewPager与FragmentPagerAdapter
  • 编辑器ui
  • ubuntu安装选哪个
  • 什么叫屏蔽屏幕按键
  • linux bash命令详解
  • javascript中的类型转换
  • jquery弹出div遮罩层
  • javascript几种类型
  • 善意取得的条件和效力
  • 电子税务局错误代码
  • 青霉素过敏是因为提纯不好吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设