位置: 编程技术 - 正文

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

  • 新公司什么时候开始建账
  • 长期股权投资中应采用成本法核算的是
  • 原始凭证分割单样本
  • 供热企业不得抵扣的进项计算
  • 小企业工资薪酬制度
  • 小规模纳税人购置税控设备
  • 劳务费做账是否需要发票
  • 建筑行业如何结合个人例子写论文
  • 营改增之后就没有营业税了吗
  • 银行利息收入要开票吗
  • 固定资产赔偿制度
  • 矿泉水售卖方式
  • 免抵退税额抵减额和不得免征和抵扣税额是一个意思吗
  • 增值税的税额是什么意思
  • 股权成本计算公式rd
  • 企业所得税的账载金额和实际发生额
  • 生产成本明细账怎么填图片
  • 应纳税所得额计算个税
  • 残保金每年什么时候申报缴纳
  • 未开票收入必须全部转开票收入吗为什么
  • 间接生产费用包括
  • 财务费用包括哪些主要内容
  • windows11进入桌面黑屏
  • 调整以前年度错账如何调整报表
  • 重装win10系统怎么跳过创建用户名
  • iphone6p通讯录不见
  • 结转本月发生的费用
  • 公司转让股权交不交增值税
  • asldrsrv.exe
  • 京东最贵的商品排行
  • 企业记账的主要内容包括
  • 斯塔尔德
  • 外购产品会计分录
  • 下岗再就业有什么优惠政策
  • 财务费用为负数是好事还是坏事
  • php最安全的登录功能
  • redux reducer使用教程
  • 查看ls命令的使用手册
  • php 遍历字符串
  • MySQL分表和分区最佳攻略
  • 企业转让固定资产增值税税率
  • 以旧换新有发票抵扣吗
  • 教育行业税收优势分析
  • 公积金发票掉了怎么办
  • 托收承付和委托收款区别
  • 建筑行业现在还能斤不
  • 固定资产折旧指标有哪些
  • 企业非流动资产包括
  • 专利权摊销如何计算
  • 材料采购发票未到
  • 油卡办理需要多久?
  • 长期借款利息计入应付利息吗
  • 储备基金是什么
  • 税额抵减的账务处理
  • 公司租的房子电费发票怎么开
  • 坏账准备计入营业外支出什么明细
  • 会计收入的定义和分类
  • MySQL关键字执行顺序
  • Windows任务计划高级应用
  • vmware安装centos7超详细过程 图文
  • ac1st19.dll
  • 0x80070718配额不足
  • Win7系统打开蓝牙
  • macxi
  • linux系统中的链接文件主要分为两种
  • ios macos
  • win1020h2无法重启
  • linux一键安装软件
  • win10预览版绿屏重启解决
  • js经典案例代码大全
  • android快捷键设置
  • rd命令是什么
  • nodejs xhr
  • python tkinter tabview
  • unityui渲染顺序
  • animate怎么整个图层移动
  • android图片适配方法
  • 江苏电子税务局网站官网
  • 完税凭证验证码
  • 残疾人就业税收优惠政策2021
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设