CocosCreator客户端优化系列(三):内存优化

CocosCreator 面试题(十)Cocos Creator 内存管理 Cocos Creator 提供了内置的内存管理机制,以帮助开发者有效地管理游戏中的内存资源。通过以上内存管理机制,开发者可以合理地管理游戏中的内存资源,减少内存泄漏和过度消耗的情况。Cocos Creator 使用 JavaScript 引擎自带的垃圾回收机制来自动释放不再使用的内存。Cocos Creator 提供了方法来主动释放游戏中的资源,以减少内存占用。当某个对象不再被引用时,垃圾回收器会自动检测并释放该对象占用的内存。对象池是一种重复使用对象的技术,可以避免频繁创建和销毁对象的开销。 阅读详情

转载请保留原文链接:https://blog.youkuaiyun.com/zzx023/article/details/88822815
静态资源的内存管理

可以参考官方文档:管理场景

静态资源指的是场景中直接或间接引用到的所有资源(脚本动态加载的资源不算在内)

在场景资源的属性编辑器中可以勾选“自动释放资源”选项,从而在切换场景时,会自动将旧场景使用的静态资源释放掉,从而节省内存的占用


动态资源的内存管理

动态资源的加载
动态资源统一使用cc.loader进行资源的加载以及管理。
参考:动态加载
可以使用的api:

cc.loader.load
cc.loader.loadRes
cc.loader.loadResArray
cc.loader.loadResDir
1
2
3
4
详细的api使用参考[官方文档],这里就不细说了(https://docs.cocos.com/creator/api/zh/classes/loader.html#load)

要注意的一点是,CocosCreator中通过cc.loader去加载资源的所有方法,都是异步的
所以需要在回调中,确认加载完成后才能使用资源。

也可以通过

cc.loader.getRes
1
这个api去同步的获取资源,但需要对get到的资源进行检查,如果没有加载或者没有加载完成,则需要等待或者通过cc.loader进行加载。
这样的话整个代码会清晰一些,避免掉入js的回调地狱中
例如:

通过简单的封装两个方法,在使用时可以保持代码的整洁易读

另外一点需要注意的是,当批量进行加载时,cc.loader也提供了onProgress回调,这个回调中的三个参数中

totalCount并不是指的是加载的资源总个数,而是加载这个资源所需要加载的依赖项个数。
比如加载一个SpriteFrame,它的totalCount就是3,这3个item分别为:json,texture2D和SpriteFrame
所以当totalCount为0时,并不是代表加载资源总个数为0,而是意味着这些资源已经加载过在内存中了,可以直接使用。

动态资源的释放
动态资源的释放同样时通过cc.loader去管理的。
有两种释放资源的管理方式:
(1)自动释放资源
我们可以通过

cc.loader.setAutoRelease
cc.loader.setAutoReleaseRecursively
1
2
来管理资源的自动释放设置


当场景切换时,由于资源已经释放,脚本中如果保留了引用,此时该引用将会变为非法引用。可以使用setAutoRelease和setAutoReleaseRecursively来保留这些资源。

setAutoReleaseRecursively指定资源及资源递归引用到的所有资源

默认情况下,当加载新场景时,旧场景的资源根据旧场景是否勾选“Auto Release Assets”,将会被释放或者保留。 而使用 cc.loader.loadRes 或 cc.loader.loadResDir 动态加载的资源,则不受场景设置的影响,默认不自动释放。
使用这个 API 可以在单个资源上改变这个默认行为,强制在切换场景时保留或者释放指定资源。

(2)手动释放资源
cc.loader提供了以下的api,都可以去释放通过cc.loader加载进来的资源内存。

cc.loader.release
cc.loader.releaseRes
cc.loader.releaseAsset
cc.loader.releaseAll
1
2
3
4
这里常用的时cc.loader.release

不推荐使用cc.loader.releaseAll
因为cc.loader.releaseAll会将所有通过cc.loader加载进来的动态资源全部释放掉,而在我们正常的项目开发过程中,基本上很少有场景没有使用到动态资源的情况,所以这种释放通常会带来程序的崩溃,因此使用上不推荐,最好不要使用。

cc.loader.release在释放资源时注意配合

cc.loader.getDependsRecursively
1
使用。

例如在release一个prefab资源时,如果只是通过

cc.loader.release(this.prefab);
1
的话,这样只会release掉这个prefab所使用的json文件,而prefab所引用的spriteFrame以及其他的一些资源并不会释放掉,这样就有可能会造成内存的垃圾,长时间占用内存

配合getDependsRecursively就可以正确的销毁掉prefab


在销毁prefab时也可以配合自动释放资源功能,将一些特殊资源保留在内存中,避免重复加载


如何找到“垃圾”

随着游戏的运行,总会有一些内存是长时间不使用,同时又因为我们疏忽从而造成内存上的占用以及浪费。
通过google提供的snapshot以及Allocation Profile工具可以帮助我们找到这些垃圾

查找内存“垃圾”过程中需要注意的是:

注意简单的对象创建,例如数组,{}
注意不要忽略匿名函数
注意匿名函数使用的外部变量将被匿名函数持有
利用Timeline 观察 GC 调用频率
寻找长期不释放的蓝色内存
复用一切可复用的对象

最后是内存使用的一个理念:复用一切可复用的对象

复用,并不仅仅是为了节省对象在alloc造成的开销,更重要的是避免GC时带来的额外开销。

像一些战斗中的掉血数字,敌人的血槽,怪物,子弹,英雄头像等等,都是我们常常回去做复用的地方。

但还有一些地方我们不能忽略,比如:
基础对象:cc.v2,cc.color 等
数组和对象 {}

对于常见一些复杂对象,我们可以使用对象池NodePool进行复用
对于基础的对象我们可以直接进行赋值从而达到复用的目的
参考引擎源码:

只有在不穿入out的时候new新的对象出来,正常情况下的使用均是在原有的out上进行复用

var v1;
v.add(cc.v2(5, 5), v1);
//to do....
v.add(cc.v2(10, 10), v1);
//to do....
1
2
3
4
5
需要注意的是:注意闭包,注意复用时避免泄漏为全局变量


--------------------- 
作者:BigBear023 
来源:优快云 
原文:https://blog.youkuaiyun.com/zzx023/article/details/88822815 
版权声明:本文为博主原创文章,转载请附上博文链接!

cocos内存泄漏以及优化问题 这几天疯狂的赶进度 到了今天晚上突然服务端和美工告诉我 进度都卡住了。 实在无奈就上来更篇博客。 最近遇到几个好玩的事情,关于内存泄漏 要知道当时开发unity的时候很少去管内存这个东西,可能是unity的内存池做的比较好,也可能是c#没有c++如此繁琐的管理内存,又或许是在unity里面很少new等等原因。 很多原因导致我去管底层的东西,而出现问题之后也只能硬着头皮上了。 阅读详情

相关推荐

CocosCreator客户端优化系列(一):加载优化(上)

转载请保留原文链接:https://blog.csdn.net/zzx023/article/details/85053758   最近打算花点时间,把客户端这边常用的一些优化方法总结一下,分享出来。计划大概分为四个部分:加载优化、渲染优化、内存优化、CPU占用以及性能优化。这些措施每一个都会带来多方面的优化效果,但也有部分措施拥有一定的局限性,因此需要各位理解后根据项目实际情况选择使用。 ...

BigBear的博客 1万+

Cocos Creator 的常用优化技巧

我们很多人喜欢用散图,这样,会影响绘制效率,所以一般我们会把散图达成图集,一次装载到显卡, 同时多个物体可以共用一个drawcall来批量完成绘制, 使用图集的时候,注意同时使用的图片放到一起,每个场景都要用的图片放一起。(2) 进入到游戏场景之前,将接下来常用的资源,预先加载进来,避免运行中加载出现"长时间卡住”的现象, 场景资源多的,加资源加载过度;运行时后,可能节点越来越多,内存越来越大,也越来越慢,把不用的节点都要删除掉, 检查节点数目,资源等;(5)复杂的算法,可以考虑预先计算好,用空间换时间;

hj3601947的专栏 1439

CocosCreator客户端优化系列(四):CPU占用以及性能优化

CocosCreator客户端优化系列(四):CPU占用及性能优化 转载请保留原文链接:https://blog.csdn.net/zzx023/article/details/88822815 这篇文章是优化系列的最后一篇了,内容会长一些,更多的是提供一些方向以及思路,具体的一些细节由于篇幅有限,就不一一说明了,只要找对方向,就可以慢慢研究。希望大家可以耐着性子看完。 使用Performan...

BigBear的博客 1万+

一个操作让游戏内存立减 50%!

在游戏中,纹理不仅占据大量的包体,也占据了大量的内存。传统的图片压缩格式(如 JPEG、PNG 等)虽能减少资源大小,但是不能被 GPU 直接识别,还是需要先加载到内存通过 CPU 解码,转换成 RGB/RGBA 等能被 GPU 识别的格式,才能传送到 GPU 进行渲染。为避免这些问题,社区 Cocos Star Writer 楚游香带来针对 GPU 的纹理压缩方案,使纹理能够直接被 GPU 识别...

Cocos的博客 316

CocosCreator客户端优化系列(一):加载优化(下)

转载请保留原文链接:https://blog.csdn.net/zzx023/article/details/85318028   Prefab加载优化 Prefab这块的加载优化主要集中在两个地方:一个是load加载耗时优化,另一个是实例化耗时优化。 首先先说一下prefab在使用时的步骤: 了解了Prefab使用时做了哪些事情,我们也才好针对性的做优化。   来说一下常...

BigBear的博客 1万+

CocosCreator 3.8引擎源码调试实战:从环境搭建到内存诊断

在游戏开发与软件工程领域,深入理解底层框架的运行机制是解决复杂问题和进行深度优化的关键。调试(Debugging)作为核心的工程实践,其价值不仅在于定位错误,更在于通过洞察数据流动、函数调用与内存分配的原理,从根本上掌握系统行为。对于使用CocosCreator等成熟引擎的开发者而言,当面对平台特异性渲染问题、物理交互异常或内存泄漏等“疑难杂症”时,黑盒调试往往效率低下。通过搭建本地可编译、带调试符号的引擎环境,并利用Visual Studio或VSCode等工具进行源码级调试,开发者可以直击问题根源。这项

weixin_33519829的博客 305

CocosCreator客户端优化系列(四):CPU占用及性能优化

来自:https://blog.csdn.net/zzx023/article/details/88991314 CocosCreator客户端优化系列(四):CPU占用及性能优化 这篇文章是优化系列的最后一篇了,内容会长一些,更多的是提供一些方向以及思路,具体的一些细节由于篇幅有限,就不一一说明了,只要找对方向,就可以慢慢研究。希望大家可以耐着性子看完。 使用Performance定位问题 ...

LANGZI7758521的专栏 1526

CocosCreator截图转Base64全流程:从RenderTexture到跨平台实战

在游戏与应用开发中,图像处理是常见的核心技术需求,涉及画面捕获、数据转换与编码传输。其核心原理在于将GPU渲染的像素数据,通过特定管线读取并编码为通用格式。这项技术的价值在于实现游戏内分享、存档、数据上报等功能,是连接客户端与服务器、本地与云端的关键桥梁。应用场景广泛,从简单的UI截图到复杂的游戏录像均离不开它。本文聚焦于CocosCreator引擎,深入剖析如何利用RenderTexture精准捕获节点画面,并解决跨平台下将图像数据转换为Base64字符串的完整技术链路,涵盖内存管理、性能优化等工程实践,

weixin_34347651的博客 402

CocosCreator客户端优化系列(二):渲染优化

本文链接:https://blog.csdn.net/zzx023/article/details/85318028 转载请保留原文链接:https://blog.csdn.net/zzx023/article/details/85318028 Prefab加载优化 Prefab这块的加载优化主要集中在两个地方:一个是load加载耗时优化,另一个是实例化耗时优化。 首先先说一...

LANGZI7758521的专栏 696

CocosCreator Spine精细化换皮系统:从原理到高性能实现

在2D游戏开发中,骨骼动画是实现角色动作和表现的核心技术,其原理是通过骨骼层级驱动网格顶点变换,从而实现流畅且资源友好的动画效果。这项技术对于提升游戏美术表现力和开发效率具有重要价值,广泛应用于角色动画、UI动效和场景交互等场景。Spine作为行业标准的2D骨骼动画工具,其强大的动画复用能力是处理游戏内频繁换装需求的基石。本文聚焦于Spine的运行时机制,深入剖析了通过动态替换附件实现精细化换皮的工程实践方案,该方案能有效管理美术资源复用,并规避因整体替换纹理图集导致的内存与Draw Call性能陷阱,为构

weixin_30386713的博客 424

从CentOS迁移到openEuler 24.03 LTS:手把手教你部署Java+MySQL+Redis+Nginx全栈环境

本文详细指导如何从CentOS迁移到openEuler 24.03 LTS,并部署Java+MySQL+Redis+Nginx全栈环境。涵盖系统配置、软件安装、性能优化及环境验证,助力企业级用户高效完成服务器迁移与部署。

weixin_26938645的博客 389

CocosCreator集成Socket.IO实战:实时游戏网络通信优化与避坑指南

实时网络通信是现代游戏开发的核心技术,它基于事件驱动模型,通过双向、低延迟的数据交换实现多玩家互动。其原理在于客户端与服务器间建立持久连接,通过自定义事件进行高效通信,技术价值在于支撑了多人对战、实时同步等复杂交互场景。在游戏开发中,Socket.IO作为构建在WebSocket之上的库,提供了自动重连、房间管理等开箱即用的功能,显著降低了开发复杂度。针对CocosCreator引擎,集成Socket.IO时需重点关注数据传输优化和生命周期管理。通过精简数据格式、使用二进制传输等热词技术,可以有效降低网络负

weixin_34013044的博客 411

DICOM医学影像开发者必备工具清单

PyDicom 是一个纯 Python 实现的 DICOM 文件解析库,允许开发者读取、修改和写入 DICOM 文件。它无需依赖外部库,易于集成到现有的 Python 项目中,非常适合快速开发和原型设计。DCMTK(DICOM Toolkit)是一个由OFFIS开发的开源C++库,提供了一整套DICOM标准的实现,包括文件操作、网络通信和图像处理等功能。它是开发高性能DICOM应用的理想选择。MicroDICOM 是一款免费的DICOM查看器,适用于Windows平台。

编程技术探索者,分享C/C++、C#、Java、数据库等开发经验,聚焦实战技巧与AI兴趣,助力编程爱好者成长。 577

CocosCreator WebSocket 实战:高并发游戏通信的效率优化方案

面对这些问题,首先得选对技术栈。原生 WebSocket:优点是标准、轻量、无依赖。缺点是功能基础,断线重连、心跳、二进制协议等都需要自己实现。Socket.IO:功能强大,自动重连、心跳、房间管理一应俱全。但它体积相对较大,协议也相对复杂,对于追求极致性能和包体大小的游戏来说,可能有点“重”。通信协议:JSON 方便调试但体积大;Protobuf体积小、序列化快,是性能首选,但需要维护.proto文件,增加了一些复杂度。结合我们项目的需求(实时对战、高并发、包体敏感),我最终选择了。

2600_94960124的博客 345

Python库CloudScraper详细使用(绕过 Cloudflare 的反机器人页面的 Python 模块)

CloudScraper是一个专门用于绕过Cloudflare反机器人保护的Python库,它基于requests库构建,能够处理Cloudflare的5秒盾、WAF和人机验证等防护机制。

数据知道的博客 1万+

AI应用架构师视角:AI技术引发的全球经济格局重构,你看懂了吗?

本文将从AI应用架构师的独特视角,拆解AI技术栈(算力/算法/数据)如何通过"架构渗透"重塑产业价值链,分析中美欧等主要经济体的AI战略差异如何改写全球分工格局,并为企业与个人提供一套可落地的"AI经济适应性框架"。当OpenAI的GPT-4在代码生成、多模态理解上展现出超越人类的能力,当英伟达的H100芯片成为全球科技巨头争抢的"数字石油",当中国的AI大模型在电商、金融等场景实现规模化落地——我们正站在一场由AI技术引发的全球经济重构的临界点上。AI重构全球经济格局的过程,既是挑战,更是机遇。

小白菜的博客 1258

CocosCreator之图集资源(Atlas)

图集资源(Atlas) 图集(Atlas)也称作 Sprite Sheet,是游戏开发中常见的一种美术资源。图集是通过专门的工具将多张图片合并成一张大图,并通过plist等格式的文件索引的资源。可供 Cocos Creator 使用的图集资源由plist和png文件组成。下面就是一张图集使用的图片文件: 为什么要使用图集资源 在游戏中使用多张图片合成的图集作为美术资源,有以下优势: 合成图集时会去除每张图片周围的空白区域,加上可以在整体上实施各种优化算法,合成图集后可以大大减少游戏包...

码之有道 4570

接口电路设计的关键要点

接口电路设计是嵌入式硬件开发的核心环节,本文系统阐述了五大关键设计要点:1)电平匹配技术,详细分析了3.3V/5V系统互连方案及转换电路计算;2)阻抗匹配原理,包括高速信号反射机制及差分信号处理;3)滤波与去耦设计,提出多级电容配置和"先电容后过孔"布局原则;4)接地设计规范,重点说明模拟/数字地分离及高速信号回流路径;5)防护电路设计,涵盖防反接、过流保护及ESD防护方案。文章通过具体计算公式、器件选型指南和布局技巧,为接口电路设计提供了系统化的解决方案,并附有设计检查清单和典型问题分

weiyvyy的博客 454
上一篇: cocos creator动态加载资源
下一篇: 小游戏环境的资源管理
wang2021wang
博客等级 码龄15年 6粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值