笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:《手把手教你架构3D游戏引擎》电子工业出版社和《Unity3D实战核心技术详解》电子工业出版社等。

内存优化不论是游戏开发还是软件开发,都会涉及到这个问题,这个也是所有程序员绕不过的问题,必须要解决的。特别是在移动端盛行的时代,由于硬件的限制,这个问题愈发显得突出。开发者在使用游戏引擎编程或者使用脚本预言编程也会遇到此类问题,在脚本Lua的内存管理方面,开发者尤其要重点关注,因为Lua不仅应用在客户端也应用在服务器端。

记得我一个朋友告诉我,他们的服务器脚本使用的是Lua语言,在登陆人数达到几百个人时,服务器的内存开始吃紧,为解决这个问题找了一段时间发现是Lua造成的,在内存释放方面处理的不是很好。在这里也是提醒开发者使用脚步语言时要留心内存占用,下面主要是以Unity为例给开发者介绍一下关于内存以及优化方面的解决方案。

使用Unity开发移动端游戏时,会遇到各种奇葩问题,首当其冲的问题就是包体大小,由于Unity引擎自身的问题,我们只能自己去减少包体大小,减少包体大小主要是从这几个方面考虑供参考:

第一、图片的使用,图片一般使用的格式是不带有Alpha通道的图片格式是jpg,带有Alpha通道的图片格式是png。接下来我们还可以对图片进行压缩,我们使用的是网上比较流行的压缩方式,网址:www.tinypng.com。当然也可以使用软件压缩,只要保证其像素损失控制在一定范围内即可。

第二、图片控制了,接下来就是使用图集,图集主要是优化内存加载效率问题,一张大的图集内存加载一次即可,如果是多张小图片内存就要不停的加载,释放。说白了利用图集主要是用空间换时间。Unity自身的图集工具不能充分利用空间大小,Unity自身的图集比如如果使用2048*2048大小的图集,即使图集不满,它占的内存还是4M。这个就不理想,推荐使用Texturepackd打包工具,它可以充分利用图集占用空间。

第三、接下来是考虑图片的利用了,做游戏开发我们就要考虑多语言版本问题,这就要求我们的UI尽量保持一致,减少特殊的UI制作,通常多个语言包是放在一个包体中的,在制作时这个问题也是要考虑的。

第四、UI也需要利用Unity自带的图片压缩格式,比如ETC针对Android,PVRTC针对ios的压缩,以及图片大小的压缩,这个主要是针对图标的比如大小可以将其控制在512以下。

第五、考虑到场景的制作了,场景制作我们要控制模型的面数和模型使用材质的数量,这个要分清主次的,有的要体现细节可以多做几张贴图,只是为了装饰使用的物体,用一张材质就能表现,针对场景的制作可以设置好图片库,场景中所有的物件都是使用里面的图片。可以对这些图片认为的把它们打包成图集,也是为了优化内存,自己要分好类的。

第六、场景的制作要采用Prefab的方式,不要在max中把整个场景制作好,而是只制作单个的物件,由美术去自己利用Unity编辑器摆放物件制作场景。最后将场景采用json文件的方式将其保存,用于场景的加载时使用。

第七、如果场景实在是太大了,可以采用多线程的方式在后台加载,这个事情在我写的极客头条《Unity3D实战之多线程下载资源》中有阐述,这里就不详细说了。

第八、角色的制作,角色的材质也是要进行渲染的比如,角色有高光、法线、环境映射等效果,这些效果可以只在选择角色时进行处理,放到场景中后,如果遇到效率问题可以将其材质替换掉。因为在场景中玩家只关注玩法和装备了,对角色的材质关心比较弱化了。

以上是在制作时注意的问题,接下来就是代码这块的优化了,代码的编写注意几个问题:

一、能用单例的尽量少用静态,单例在程序中只保留一份,而静态是多个。

二、对于重复使用的物体,必须要使用对象池对其统一管理。

三、对一些资源加载能够造成卡顿的,使用预加载的方式。

四、不要在Update中定义变量或者使用循环语句,因为它是每帧都在执行的。

五、协成也尽量少用,它不是多线程。

六、后处理渲染尽量少用。

七、程序编码中尽量少用递归的处理方式,遇到实在躲不过了,将其换成堆栈。

八、对代码多一些重构处理,程序的架构设计必须是耦合性低,易于扩展。

经验分享:

以上主要是从大的方面介绍的,遇到特殊问题要特殊对待,比如我在跟北京一家公司的CTO讨论问题时,他说了一个这样的问题,在用手机测试游戏时,有10款手机,在九款手机上是没有问题的,但是在一款手机上特别耗内存,他问我这样的问题该如何解决,遇到此类问题,别无他法,两种选择,一种是放弃这种机型,二是找到问题,我选择了后者,这样的问题就是要特殊对待了,只能采用逐步分析的方法,先找到是什么问题导致的,很多人会说内存问题,大家别忘记一个前提在九款不同类型的机器上是没有问题的,只在一款有问题,解决方式是:我们只能从简单的场景开始测试,这样比较容易定位到问题,大家遇到问题也是一样的,可以做个小的Demo测试,这样更容易定位问题。在这里要注意的是不要等到最后才去测试,要在做的过程中边测试边修改。

另一个案例就是做了一款项目,资源经过优化还是特别大,最后采用了多线程资源下载把问题解决了,上面有提到过,在编写代码时要不停地对其重构。

我在CSDN学院专门为优化做了一个视频讲座,将项目开发中遇到的问题在此做了一个总结:视频名字是:《Unity内存优化经验分享》。解决问题的经验就是不断的从项目中获得的。

Unity内存优化经验分享相关推荐

  1. Unity MMORPG游戏优化经验分享

    今天由Unity技术支持工程师高岩,根据实际的技术支持工作经验积累,分享如何对Unity MMORPG游戏进行优化. 在优化Unity游戏时,我们一般从四个方面:CPU.GPU.内存.工程配置等入手, ...

  2. 欢乐互娱庞池海:《龙之谷》项目性能优化经验分享

    欢乐互娱庞池海:<龙之谷>项目性能优化经验分享 在5月12日,UNITY 2017案例分享专场上,欢乐互娱技术引擎开发工程师娱庞池海分享了<龙之谷>项目性能优化经验.以下为分享 ...

  3. Unity3d-MMO游戏优化经验分享沙龙总结

    原文地址:MMO游戏优化经验分享沙龙总结 昨天去上海参加了UWA公司的张鑫和张强进行了一场关于MMO游戏开发和性能优化的沙龙,活动链接为:UWA优化日上海站|传统MMO手游性能该如何突围?.虽然第二场 ...

  4. 城市快速路拥堵治理及一体化交通组织优化经验分享

    10月27日,在由中国道路交通安全协会主办.北京易华录信息技术股份有限公司承办的"交通缓堵新技术及应用实践论坛"上,济南市公安局交警支队交通科学研究所副所长云廷进就<城市快速 ...

  5. 【东营seo诊断公司】SEO优化经验分享 如何成为一个合格的SEOer?

    [东营seo诊断公司]SEO优化经验分享 如何成为一个合格的SEOer? 在优化网站的关键词排名,也就是进行SEO工作时,很多时候都要求SEO优化人员对很多细节进行把控并且对很多数据进行分析.只有这样 ...

  6. Lucene底层原理和优化经验分享(1)-Lucene简介和索引原理

    基于Lucene检索引擎我们开发了自己的全文检索系统,承担起后台PB级.万亿条数据记录的检索工作,这里向大家分享下Lucene底层原理研究和一些优化经验. 从两个方面介绍: 1. Lucene简介和索 ...

  7. Unity 内存优化之理解托管堆和本机堆

    https://docs.unity3d.com/Manual/BestPracticeUnderstandingPerformanceInUnity4-1.html https://www.dazh ...

  8. Lucene底层原理和优化经验分享(2)-Lucene优化经验总结

    转自:https://blog.csdn.net/njpjsoftdev/article/details/54133548 系统优化遵从木桶原理:一只木桶能盛多少水,并不取决于最高的木板,而取决于最短 ...

  9. [转]Go程序GC优化经验分享

    作者:达达 来源:http://1234n.com/?post/yzsrwa 最近一段时间对<仙侠道>的服务端进行了一系列针对GC的调优,这里跟各位分享一下调优的经验. 游戏第一次上线的时 ...

最新文章

  1. 谈判专家(东方化改题+懒得看标程)
  2. SpringBoot2 整合FreeMarker模板,完成页面静态化处理
  3. 杭电4515小Q系列故事——世界上最遥远的距离
  4. asterisk远程注册
  5. linux怎样压缩卷分区,怎么调整磁盘分区容量大小
  6. Confluence 6 附件存储配置
  7. vue选中点击的元素_vue.js - Vue 点击当前元素触发当前事件怎么做??
  8. OpenCV3.4.1 vs2015 自定义过程的图片拼接
  9. 用dcloud平台的H5+实现消息推送APP端通知栏接收的问题
  10. 用opencv在图片上面添加水印
  11. the sdk seems invalid pycharm
  12. Android探索之旅(第二十九篇)手把手教你如何简单创建快应用
  13. 【机器学习】iris莺尾花项目-机器学习的hello world
  14. Redis缓存——(分布式锁)
  15. ae制h5文字动画_7款超华丽的HTML5 Canvas文字动画特效
  16. WASC Threat Classification 安全威胁分类
  17. 定点数的运算 —— 逻辑移位、算术移位、循环移位
  18. 计算机的0和1是怎么变成我们屏幕上看到的图片、视频和声音的
  19. java项目 基于springboot家具定制网站idea
  20. PIV粒子图像运动场

热门文章

  1. 解决兼容问题:Windows 7下载安装 Visual C++ 6.0(VC6)
  2. 如何彻底删除Sql server 2008数据库
  3. 编程语言JAVA和Python如何选择?
  4. 五邑大学c语言真题及答案新课标,五邑大学C语言习题参考答案(不含思考题与编程题)...
  5. rtx 加密机制_[原创]RTX(腾讯通)本地保存密码TEA变形算法及还原器
  6. socket服务端同时监听多个端口号
  7. 1949-2012年北京市人口出生、死亡变动情况
  8. [Linux] 使用lsof 查看解决too many open file问题
  9. 充满春天气息的公众号文章
  10. 如何在Windows中启用“立体声混音”并从PC录制音频