位置: 编程技术 - 正文

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

  • 需要出口
  • 新成立的公司如何建账
  • 对公账户的钱都是国有资产吗
  • 企业开办费可不交税吗
  • 高新企业要求研发投入
  • 冲减营业税金及附加的分录
  • 股东将投资款转入个人账户
  • 个人独资企业个人所得税税率
  • 销售折扣开票怎么开
  • 存在弃置费用的固定资产有哪些
  • 坏账已核销
  • 失控发票进项税额转出申报表填写
  • 营改增要交增值税吗
  • 计提年终奖金的会计分录怎么写
  • 无票收入如何做账
  • 房产赠与流程是什么意思
  • 培训费用可以开专票吗
  • 关于两套账老板和会计须知的4个点
  • 孵化器 怎么赚钱
  • 销售赠品怎么入账
  • 我的初级备考经验,认真就有收获
  • 软件进项税额分摊方式
  • 研发费用发票怎么入账
  • 盈余积累转增资本的条件
  • 多发的奖金收回怎么做账
  • 捐赠固定资产资产处置损益
  • 所得税招待费用
  • 在win7中怎么安转只兼容win10的软件
  • swimsuitnetwork.exe - swimsuitnetwork是什么进程 有何作用
  • 摊销费用的会计科目
  • pos机刷卡怎么做账务处理
  • bassmod.dll
  • dl是什么文件
  • 员工福利费会计处理
  • 公司修好厂房老板怎么说
  • 股权转让定金怎么做账
  • php写一个函数,对手机号做基础的判断和处理
  • 期末未缴税额是负数,本月申报为什么没有抵扣
  • 期末余额跟年初余额是什么意思
  • 长期应付款核算范围有哪些
  • ChatGPT强化学习大杀器——近端策略优化(PPO)
  • 销售商品怎么做好宣传
  • 修的公路是否上固定资产
  • 个体发票税率开错了怎么办
  • 一般纳税人的账户可以随便转账到私人账户吗
  • mongodb的语句
  • 直接计入所有者权益的利得和损失,影响当期损益
  • 固定资产税会折扣吗
  • 股权激励费用摊销意思是
  • 增值税销项税额抵减账务处理
  • 企业所得税如何计算应纳税所得额
  • 备用金发工资到底可不可以?
  • 非限定性净资产是什么意思
  • 银行承兑汇票能拆分背书吗
  • 个税返还申请流程
  • 成本暂估入帐如何做分录
  • vista ui
  • windows2003怎么修改用户密码
  • 苹果15手机价格和图片颜色
  • 虚拟机中怎么安装VMwareTools
  • win8系统教程
  • win10截图截不了怎么办?
  • win8 metro启动界面
  • pavprsrv.exe - pavprsrv是什么进程 有什么用
  • win10升级最新版
  • 简述javascript中的函数
  • 纯css实现轮播图
  • js 函数执行顺序
  • CSSvista可同时在IE和Fifrefox调试的CSS编辑提供下载
  • unity3d需要什么语言
  • nodejs require原理
  • python怎么弄中文
  • javascripvoid
  • javascript常用函数大全
  • Android开发工具
  • js 进阶
  • jquery基本操作
  • 税款所属期起怎么填写
  • 河北省国家税务总局云办税厅
  • 车辆购置税纳税申报表下载
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设