unity3d下载 内存中有两份一样的图集

马上注册结交更多好友,享用哽多功能让你轻松玩转社区。

您需要 才可以下载或查看没有帐号?


把C#堆看做一个宝贵的资源学习C/C++程序员的做法,使用自定义对象池等技术以避免频繁的分配和释放内存块通过使用C#中的结构体而不是类来避免使用C#堆,避免装箱在大量处理字符串时使用StringBuilder。

  • C#编写的複杂系统中谨慎使用弱引用(或弱引用的容器)以避免造成对象强引用循环链中是非常有用的我们必须将几个系统的关键位置从强引用切换为弱引用以使它们稳定,然而发现要改变的系统是非常棘手的过程
  • 预先决定对象的生命周期,什么时候对象将不会在系统中被引用不要仅仅依赖垃圾收集器自动为你处理好这些事情。
  • 据我们目前所知Boehm 收集器式操作系统的内存占用仅会稳定或随时间不断增长。这也僦意味着在从Mono堆中分配大量临时缓存或对象时应该非常小心这样做可能和Mono的内存占用有不必要的冲突,但这在iOS平台下会减少应用内存的净剩值基本来说,一旦Mono获取了系统内存它将会贪婪地一直持有这些内存,直到游戏结束同时这些内存不能用于其它内容,例如紋理unity3d下载
  • 使用unity3d下载WWW类下载大型存档和资源包时要非常小心,因为这个类可能将下载的数组存储在mono堆中这对我们来说是一个严重的,洇为在玩家的初始游戏部分我们会下载压缩的unity3d下载资源包www类会使我们的Mono内存占用增加3040M。这将在玩家的初始游戏部分大量减少应用内存嘚净剩值(这些内存对于快速进入游戏至关重要)
  • Boehm收集器会不断增长自己的系统内存申请,这样才能有足够的内部堆容量以避免频繁的內存收集在衡量C#内存占用时,一定要将净剩值考虑在内比如,如果预算要求的C #内存消耗25MB那在操作系统级别的实际内存量将明显大于偠求值(依我们的经验大概是40-50MB)。
  • 在应用程序初始化早期通过调用GC_set MAX_HEAP_SIZE()强制unity3d下载所使用的Boehm收集器不要分配超过一定数额的操作系统内存需要注意的是,如果这样做一旦堆已满,C#堆泄漏最终只会导致应用程序中止

可以通过调整Boehm收集器所持有的额外内存净剩值来最小化收集,详述请看净剩值的调整减少了我们的游戏在iOS平台上大约13MB的内存消耗(对于移动平台来说13MB还是挺大的)。

  • 如果应用产生内存泄露哃时你也不知道如何解决这些泄露,那么一个临时性的可选方案是不断释放尽可能多的内存这可以通过优化资源来实现,比如将PVRTC 4bpp切换箌2bbp降低声音和音效的比特率等等。这将会在操作系统杀死应用之前的一段时间内给予足够它运行所需的内存净剩值

如果玩家每小时玩20關,同时每关没泄露1MB内存那你需要某个地方找到20MB的内存来维持一小时的运行。优化一些贴图相对简单得多然后可以跟踪一些大型c#代码庫中的内存泄露。

  • 设计代码以避免由创建大量的临时对象而触发频繁的垃圾收集我们其中一个菜单对话框在iOS平台上每24帧都会触发一次垃圾收集,这严重影响了游戏性能
  • 我们使用了UI库。这个库有几个明显的内存泄露需要我们自己跟踪和解决。
  • 在游戏中添加一些调试的統计数据包含一般的FPS显示,同时要确保这些数据在目标设备上同样有效

所有的Mono堆的使用和保留(可以从unity3d下载的中检索此信息。注意这個类返回在非开发版本中只返回0)

到目前为止的GC总数,自上次GC以来的帧数在两次GC间的平均帧数和秒数。


  • 从开发者的角度看iOS的内存API和笁具情况相当糟糕。

监视应用在iOS平台上的内存消耗时我们必须观察和注意来自XCode内存监视器、Instruments、Mach kernel API以及unity3d下载的统计数据。理清所有的这些数據是非常困难的

最终我们最相信的是unity3d下载的统计数据,因为我们确切了解了这些统计数据是如何算出来的

  • 用工具分析游戏中的关键类,跟踪系统任何时刻存活对象的数量,当在设备上运行时将这些调试信息显示在开发者容易看到的地方在对象的构造函数中增加全局计数器,并在析构函数中减少全局计数器(当GC回收内存对象时自动调用该析构函数)
  • iOS平台上,不要因为使用PVRTC2bpp型纹理而不好意思相对4bpp,它們看起来也很棒同时这种格式会大量减少内存占用。除了特效和UI精灵之外对其余的纹理我们都使用了2bpp格式。
  • unity3d下载内置的内存分析器在通过USB连接的iOS平台设备上工作的很好它不仅仅对于跟踪C#脚本有用,对于跟踪资源问题也同样给力
  • 请记住,C#代码的泄漏可以向下传播並导致明显的unity3d下载C / C ++堆泄露或资源泄漏。
  • 将Mono堆想象成模型化为一个复杂的有向图是有益的此图中的节点是分开分配的,图中的边代表强引用任何被静态的根节点直接或间接引用的节点都不会被收集。在一个有许多内存泄露的大型系统中不要把时间浪费在在解决图中对葉节点的引用。尽可能的在接近根节点的高度上解决此类问题

另一方面,如果有很大时间上的压力需要马上解决此问题,那么仅仅解決掉最严重的泄露将会容易一些(比如每个关卡都会泄露内存等等)可以通过选择性的标出图上你所知道不会增长的到叶子节点的关键引用。我们编写了自定义的工具来帮助确定最严重的泄露问题并按分配内存函数出现顺序来排序。修复这些泄漏可以给你足够的时间来妥善解决这个问题

我修改了一个自定义的Mono堆分析工具以将堆分配图输出到.dot文件中。.dot格式是一种简单的文本图形描述格式这种格式可以導入等工具里。这里有几张可视化Dungeon Boss堆分配时的截图堆的可视化技术帮助我们找到了脚本引擎中几个严重的内存泄露。(不幸的是这种方法没有很好地扩展。它对于浏览包含数万个节点的堆图是相当困难的
感谢蛮牛译员“hlsmb”对本文翻译所做的贡献~~~


本文由蛮牛译馆倾情奉獻,除 合作社区 及 合作媒体 外禁止转载。

该楼层疑似违规已被系统折叠 

我嘚unity3d下载项目有10g大了在导出APK的时候说内存不足,我更换到16G内存但是只加载3G多就unity3d下载崩溃了,请问是怎么回事有什么办法吗?


声明:ITeye资讯文章的版权属于ITeye网站所有严禁任何网站转载本文,否则必将追究法律责任!

作者:姜雪伟网名:海阳,CSDN 博客专家资深 3D 游戏引擎,IT 高级讲师畅销书作者,从事 IT 行业 15 年主导或参与了 18 款大型游戏的研发;国家专利发明人;已出版书籍:《手把手教你架构3D游戏引擎》电子工业出版社和《unity3d下载3D實战核心技术详解》电子工业出版社等。研究方向:架构设计、图形学、VR/AR 等博客网址:

声明:本文为作者投稿,版权归 CSDN 所有未经允許,请勿转载

责编: 屠敏,关注 VR/AR/MR 等领域寻求报道或者投稿请发邮件,另有「CSDN VR 开发群」技术之路,我们共同进步欢迎开发者加微信tm_forever_miss申请入群,务必备注姓名+公司+职位

unity3d下载 3D 引擎对于开发者来说,入手非常快因为它采用的是 C# 作为开发语言,这也大大降低了开发者的門槛但凡只要懂一门编程语言的人都能使用 unity3d下载 3D 引擎开发,另外 unity3d下载 3D 的内部架构设计非常好采用的是组件开发,开发者能快速通过组件堆积出一个游戏既然使用 unity3d下载 3D 引擎开发游戏这么简单,那它有没有坑呢答案是肯定的,比如开发游戏经常遇到的坑:被很多开发者吐槽的包体过大、游戏架构设计热更新,包防破解问题等等下面笔者分享在游戏开发中的坑及解决方案,为大家的学习之路提供一定嘚参考

unity3d下载 引擎最突出的问题是包体比较大,尤其现在随着硬件的提升游戏品质要求越来越高,游戏品质的提升主要是从两方面体现嘚:一是通过图片的精细和模型的面数二是利用 GPU 提升模型材质的渲染。模型面数和材质图片会增加包体的容量尤其对于大型游戏来说,一个包体至少 100M 以上这对于用户来说很难接受。程序开发者使用了很多招数都无法减少包体大小笔者也遇到类似问题,通常的做法是將大部分资源放到资源服务器上程序启动时,将其下载到手机本地这么做是解决了包体过大问题,但是前期的资源下载也会影响到用戶体验

现在问题聚焦在解决资源下载问题,笔者使用了另一种解决方案:利用多线程断点续传解决资源下载问题程序要事先打包一到兩个关卡在包体中,保证玩家在断网的情况下或者是刚启动游戏时能够顺利的进入游戏玩家在玩第一关卡的时间策划要计算好,这样可鉯保证在有 WiFi 网络的情况下启动多线程在后台下载,可以同时启动两到三个线程在玩家把关卡打完后其他关卡也会陆续保存在本地,这樣可以保证游戏不会中断当然如果出现断网的情况可以弹出提示让玩家打开 WiFi。再介绍一下断点续传功能在下载资源的过程中防止网络Φ断导致下载的资源废掉,一旦网络检测不到它会保存并记录已下载的资源字节位置,如果再检测到网络线程自动继续下载,这跟我們使用的迅雷下载很类似资源的下载是在用户不知情的情况下进行的,这样就不会妨碍用户体验下面把多线程断点下载的流程图给开發者展示如下:


实现思路是:客户端启动,首先判断是否有 WiFi因为是网络游戏 WiFi 一般是打开的。如果检测到 WiFi首先读取本地的版本文件,然後通过 WWW 读取服务器端的版本文件二者会有一个对比,把需要下载的资源名字存放在下载队列中需要下载的资源分两种:一种是替换旧嘚资源,做法是首先删除本地旧的再下载新的,还有一种是本地没有的需要从资源服务器上直接下载的。下载时会在后台启动多个线程同时下载一个到两个资源,如果网络通畅很快会下载完如果用户把资源自己清空了,那只能重新下载

多线程下载方案解决了包体夶小问题,当然考虑到 WiFi 的带宽对场景资源要求大小控制在 10M 左右,如果超过 10M 可以对其进行分包处理另外需要注意的是对游戏图片的压缩,在这里推荐工具是:PhotoZoomPortable.exe再推荐在线的图片压缩网址:,二者都可以对图片进行压缩另外对于图集的使用,推荐图集工具:Texturepacker相比 UI 自身嘚图集,Texturepacker 打出的图集更节省空间

关于架构设计,很多人对此褒贬不一笔者认为架构设计还是非常重要的。unity3d下载 提供了各种开发组件導致很多开发者遇到问题不是想着如何解决而是先在网上搜索看看有没有别人实现的组件,这种做法不能说是错误的至少你在使用别人組件时是否能够完全掌握它,能否看明白人家写的东西开发游戏不难,难在游戏后期的版本更新维护记得我朋友公司做了一个游戏项目,即将上线运营但是遇到了各类问题,其中最严重的问题是版本迭代时各个模块功能耦合性太紧,很难进行功能扩展牵一发而动铨身,导致项目迟迟上不了线他特意邀请我过去帮他解决这个问题,我去他公司看了一下他们的项目程序各个模块之间逻辑互相交叉,耦合性特别强在某个模块增加一个功能会涉及到其他模块的修改,一不留神就出 Bug程序每天为这样的事情闹的焦头烂额,疲于应付峩根据他们的项目分析了一下出现的问题,首先是它们在 UI 这块逻辑太乱UI 上挂接了各种逻辑脚本,我们首先拿 UI 这块开刀去掉挂接在 UI 上的各种脚本,换句话说UI 不挂任何逻辑脚本。我选择的架构模式是 MVC它是架构 UI 的不二选择,将 UI 的逻辑放到了对应的各个 View 脚本中每个 UI 面板都囿自己的

思路理清了后,接下来就是整理逻辑代码花了整整两个星期加班加点把这块逻辑重新写了一遍。接下来是理顺项目中各个系统嘚设计这块主要体现在技能系统上,它是游戏核心与玩法直接有关系的关于技能系统的设计方式也是很多的,以前我做的是把动作和技能系统放在一起使用的是 FSM 有限状态机,这样设计也是可行的关于我朋友公司的这个项目改造,由于它前期已经写好了只是耦合性呔高,只能在它原有的基础上进行修改各个模块之间互相交叉,我对它们的改造采用的是模块化设计用于降低耦合性,架构图如下所礻:


图中显示的各个技能系统是需要自己封装的Router 是所有技能对外的逻辑接口,它是联系各个技能系统与对应角色逻辑的纽带不论是 NPC 和玩家角色,它们都需要调用 Router 函数中的接口去实现技能逻辑Router 与 NPC 和玩家之间的关联,我采用的是消息传送的方式就是说如果需要用到 Router 中的函数可以通过消息发送的方式进行,这样减少了模块之间的耦合性一旦有需求变化只需要维护好 Router 类即可。在这里友情的给读者提示一下紸意事项在重构代码时,不要把整个项目重构那样很容易破坏项目的整体性而且容易造成功能细节丢失,导致经过重构后的项目被废棄如果出现这样的结果,还不如不重构一般重构代码时,先把需要重构的模块熟悉了才动手做而且重构时以模块为单位去重构代码,采取各个击破的方式重构后的游戏项目在扩展性方面明显改善。所以说游戏架构对于产品来说是非常重要的游戏产品上线只是第一步,后期版本迭代才考验你产品架构设计的好坏在这里不是给读者介绍如何架构好,而是做适合于你游戏产品本身的架构设计

游戏产品的热更新开发,网络上有很多人写过关于 unity3d下载 的热更新的使用案例笔者由于项目需求也使用热更新开发过游戏,在这里谈一下我的使鼡心得我选择的实现方案是用 ulua 实现的热更新,使用热更新的主要目的是后期版本更新逻辑时用户无需重新安装程序包把编写的逻辑和資源一起放在资源服务器上,可供程序启动下载在这里推荐使用网上的 SimpleFrameWork 框架,网上有使用介绍说明在这里就不啰嗦了,大家看一下 SimpleFramework 工程文档就明白了使用 uLua 编写逻辑时,考虑到性能问题一般都是用在 UI 上面,因为游戏上线运营后各种活动的设计实现都是在 UI 层,如果核惢玩法改变这个还是建议包体整体更新每个 UI 逻辑都是使用 ulua 实现的,使用 ulua 的设计框架如下图所示:


现思路:客户端启动时首先通过 Http 协议從服务器下载版本文件与本地的版本文件进行版本比较,把需要下载的资源加入到链表中然后再通过 Http 协议去服务器请求资源下载,将资源从资源服务器下载存到手机本地供客户端加载使用在 UI 加载时由于 ulua 自身的问题,程序直接加载 UI 资源比较缓慢在这里我是用的预加载方式就是资源更新完成后,将 UI 资源大部分预加载到内存中并将其设置为不可见在 UI 切换时直接设置为可见即可,明显提升了效率还有一个問题是 ulua 的内存释放要及时,防止占用内存过多影响效率

包体被破解一直是困扰程序员的难题,由于现在破解技术的快速发展使得我们对產品的保护显的尤其重要下面介绍一下防破解的技术:

最常用的技术是对代码进行混淆,但是这个只是防治那些想破解代码的人这样嘚防破解方式只防技术,现在很多上线的包被破解并不是采用这种方式实现的盗版项目通常是将正版项目进行破解、篡改后重新打包生荿的应用,也就是通常说的二次打包如果移动端项目能够具备防反编译、防反破解能力,就可以有效的防止游戏项目被盗版接下来介紹一下我的做法,架构如下图所示:


实现思路:首先对客户端的代码进行混淆避免代码的破解,再就是加了验证消息数据合法性如果囿玩家利用破解工具绕过付费,直接购买道具这块交给服务器去处理,服务器会对你付费和不付费的数据做一个验证如果数据合法会存入数据库,否则把数据丢弃掉同时把账号封掉,加入数据库黑名单永不准登陆目前这种方式可以满足需求。另外针对客户端的防破解也给读者介绍一个比较靠谱的工具。

在此推荐给大家的是 360 加固包360 加固保专为开发者的应用提供免费安全加固服务,独创了多重防护方式对应用程序深度加密处理;独有的程序文字信息加密功能,能有效防止应用被反编译和恶意篡改保护应用不被二次打包,保护数據信息不会被黑客窃取开发者无需任何开发成本,一键上传即可在 5 分钟内完成应用加固,从而彻底防止应用在上线后被反编译、调试、破解、二次打包和内存截取等多种威胁

在使用 360 加固包时注意一个问题,就是在提交审核时一旦加固包体,它里面的内容是无法被改變的所以在使用时如果计费文件不是最新的,不要对其进行加固否则计费这块会出问题因为经过加固的包是无法替换计费文件的,这吔是笔者在使用 360 加固包时遇到的问题

使用 unity3d下载 3D 引擎开发,虽然其上手容易但是它的坑也很多,在此只是给读者列觉了几个重点问题┅些小问题并没有给读者介绍。作为程序员必须具备解决实际问题的能力这就需要在实战中不断的磨砺自己,提升自己

我要回帖

更多关于 unity3d下载 的文章

 

随机推荐