位置: 编程技术 - 正文

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

  • 小规模纳税人月收入多少免征增值税
  • 增值税核算应设置什么
  • 办理出口业务流程
  • 公司给员工发放福利的说辞
  • 教育培训行业成本怎么结转
  • 兼职劳务报酬需要发票吗
  • 车辆购置税能否退税
  • 分公司法人必须是总公司法人吗
  • 贴现利息应计入什么费用
  • 一般纳税人可以开1%的发票吗
  • 股东借款利息收入放什么科目
  • 分公司企业所得税怎么缴纳
  • 零余额账户收到钱怎么办
  • 员工借款可以直接转账吗
  • 企业收到非金融机构利息收入怎么做账务处理
  • 地税能不能查到个人的贷款行为?
  • 企业所得税如何计提会计分录
  • 建筑机械租赁站
  • 有进项无销项会计分录
  • 出差餐费报销怎么报销
  • 宣告分派现金股利影响所有者权益变动吗
  • 会计准则规定的关联方
  • 公司旅游的费用怎么算
  • 计提福利费会计科目
  • win11系统更新卡在25%
  • 生育津贴的相关法律规定
  • 每股收益增长率计算公式
  • 公司贷款过桥费合法吗
  • 公司招的兼职员工怎么报个税
  • win10版本1909和22h2
  • linux如何管理进程
  • 金融工具减值会影响什么
  • 往来款项账务处理
  • 去年买的设备今年入固定资产如何做账
  • AttributeError: ‘bytes‘ object has no attribute ‘encode‘异常解决方案
  • 解决城市内涝的题目
  • 个体经营所得税申报表a
  • 安装exclipse
  • pyecharts怎么用
  • php实现有序数组的数据
  • 交税务局的工会经费现金流
  • 企业交的社保包含什么
  • 企业所得税那些是免税的收入
  • php是什么
  • python爬虫入门教程
  • 应付职工薪酬期末余额是什么意思
  • 印花税申报时间填错造成逾期怎么办
  • 技术内部化
  • 水利基金申报表在哪找
  • SQLSERVER2008中CTE的Split与CLR的性能比较
  • sql server如何进行安全设置
  • 超市小规模税负怎么算
  • 社保局会给失业人员打电话吗
  • 产品研发项目管理 系统 国外
  • 现金日记账退款怎么记账
  • 应收票据背书支付是什么
  • 包工包料怎么开13个点发票
  • 产品成本核算要求有哪几项
  • ubuntu的快捷键
  • 修改linux系统ip
  • win 8.1 preview ISO镜像安装方法简易教程
  • setlang.exe - setlang是什么进程 有什么用
  • linux收发邮件
  • win10系统预览版
  • windows7 sp1升级包
  • windows进程太多
  • Win10 Mobile RedStone预览版14267已知问题与修复内容汇总
  • javascript scrollTop正解使用方法
  • vue scoped属性作用?实现原理
  • Android AsyncTaskLoader需要注意的问题
  • svn如何cleanup
  • node的express
  • unity网络模块
  • ug编程代码意思
  • beautiful python
  • 铁路货运的费用有哪些
  • 四个落实是哪四个落实
  • 增值税发票选择确认平台已勾选未确认的发票怎么撤销?
  • 石家庄经开区税务局
  • 法治税务示范基地枫桥
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设