【cocos creator】游戏优化,内存,性能,包体积大小,加载,drawcall优化

news2025/3/14 21:56:01

参考:

https://blog.csdn.net/qq_47012987/article/details/140169024

内存泄露排查

  • 使用chrome测试cocos creator内存泄漏问题
  • 手游内存优化
  • cocos creator优化
  • Creator资源自动释放逻辑:所有 cc.Asset 实例都拥有成员函数 addRef 和 decRef,分别用于增加和减少引用计数。一旦引用计数为零,Creator 会对资源进行自动释放(需要先通过释放检查)自动释放资源
    • 事件注册了在deatroy没取消注册
    • 闭包引用外部数据,未清理
    • 【loadAny】【loadRemote】【load】等方法加载的资源需要自己手动卸载
    • removeFromParent时候节点未销毁,只是从父节点移除
    • 节点池不用时候未清空
    • bundle加载后未卸载
  • js
    – js内存回收机制,标记清除逻辑,在代码执行过程结束之后,把还在被上下文变量引用的变量标记去掉标记。在清除阶段再把具有标记的内存对象进行整体清除,从而释放内存空间。有引用时候不会自动清理
    -闭包里面如果有log引用了闭包外的变量,也会导致变量不会自动回收
    js垃圾回收机制,内存泄露处理

##包体积优化:
打包构建时候配置,没有使用的到模块可以去掉

性能优化

  • 使用对象池,特别适用于需要频繁生成和回收对象的场景,不用了记得及时回收,控制对象池数量上限,防止内存占用过大
  • 滑动列表复用
  • log过多影响性能,不必要的log去掉

优化资源加载

  • resources文件夹里的东西会提前加载,所以不要在resources里面放不必须的东西
  • 非主要玩法的资源可以放在ab包里,使用时候再加载使用
  • 分帧加载,多个物体加载,逐渐显示
  • 延迟加载。使用资源时才进行加载,而不是在游戏启动时一次性加载所有资源。这样可以减少初始加载时间,提高游戏的启动速度。可以使用场景切换或事件触发时进行加载。
  • scene场景里放的东西如果很多,可以拆分成多个预制体,分帧加载
  • 在游戏加载阶段预先加载一些必要资源,以减少游戏运行时的卡顿。

美术资源方面:

非半透明背景使用jpg
图片资源压缩
单张图片大小不超过2048x2048,大小过大的可分成多张图切
切图能切成九宫格就切成九宫格

spine动画优化

减少骨骼数量和复杂度,去除不用的骨骼
少用预乘效果(drawcall会+1)

drawcall优化

  • DrawCall 是什么:
    简单来讲 CPU 准备好渲染数据,提交给 GPU 进行绘制的这个过程就是一次 DrawCall。

  • 为什么减少 DrawCall 能提升游戏性能:
    首先,GPU 渲染图像的速度非常非常快;而 CPU 的内存/显存读写、数据处理和渲染状态切换,相比 GPU 非常非常慢。大量的 DrawCall 会让 CPU 忙到焦头烂额,而 GPU 大部分时间都在摸鱼。
    因此,若一次性将更多渲染数据提交给 GPU,减少 CPU 的工作时间,就能提升游戏性能。

  • 什么是合批:
    简单来说,组织更多渲染数据提交给 GPU 的过程,称之为「批量渲染」,简称「合批」。

动态合批被打断原因

cocos creator 动态合批逻辑:
能在项目运行时动态地将贴图合并到一张大贴图中。

  • 深度优先,遍历每个节点字节点,相邻的渲染数据一致可以合批处理
  • 影响合批因素:节点颜色,透明度,材质,不同图集,label,group分组不同
  • mask不支持合批,且占用两个drawcall
  • 支持动态合图的渲染组件:Sprite、Label ( BITMAP 模式)。
  • 微信小游戏会默认关闭,需要手动开启
    cc.macro.CLEANUP_IMAGE_CACHE = false; cc.dynamicAtlasManager.enabled = true;
  • 场景加载切换,动态合图系统会进行重置,SpriteFrame 贴图的引用和 uv 都会恢复到初始值。如果一直不切换场景,那么随着动态合图的数量增长,渲染效率可能会降低,适得其反。
  • 动态合图最大张数为5张,使用完后会强制重建。
  • 单张合图的大小为 2048*2048。(参与合图的图片单张任何一边不超过 512)
  • 贴图的多个属性设置为非默认值会影响合批 (FilterMode,genMipmaps,premultiplyAlpha,flipY,wrapS,wrapT,pixelFormat等)

优化方法:

cocos处理:

  • 使用自动图集:
    将同一界面的小图放在一个图集内
  • 单个材质球最多支持6张贴图(手机普遍支持张数),如果单个场景东西较多,可分多个材质球,打包一同渲染
  • 改变物体zIndex会触发重新绘制,可用setSiblingIndex代替
  • https://blog.csdn.net/weixin_44053279/article/details/128946081
  • spine之间可以合批,如果spine改变了图片属性(颜色透明度等),也会增加drawcall
  • 无视层级多图渲染合批
  • 江南百景图技术点一:MultiTexture实现
  • 纹理合批
  • 修改源码优化

label处理:
label 的Cache Mode有三种模式。

  • NONE:每一个 Label 都会生成为一张单独的位图,且不会参与动态合图,所以每一个 Label 都会打断渲染合批。
  • BITMAP:当 Label 组件开启 BITMAP 模式后,文本同样会生成为一张位图,只要符合动态合图要求就可以参与动态合图,和周围的精灵合并 DrawCall(注意 BITMAP 模式只适用于不频繁更改的文本)。
  • CHAR:当 Label 组件开启 CHAR 模式后,引擎会将该 Label 中出现的所有字符缓存到一张全局共享的位图中,相当于是生成了一个 BMFont(适用于文本频繁更改的情况,对性能和内存最友好)。(整体不超过2048x2048)
    优化方法:
  • label渲染模式为bitmap时,不会打断合批,需要为不常改变内容的文字
  • 可用bmfont代替文字不多的字体(只需要数字,字母等特定文字的情况),bmfont也会参与动态合批
  • char模式label之间相邻只产生1drawcall(所有的char模式label会被打包进一个单独的图集,场景切换时候销毁)

1、剔除
将不满足条件的对象整体移除,以下是实现算法:
I、视锥剔除:摄像机的位置和视角形成一个视锥体,只有位于视锥体内的对象才会被渲染。可以通过检查对象的包围盒(Bounding Box)是否与视锥体相交来判断对象是否需要渲染。
II、遮挡剔除:如果一个对象被其他对象完全遮挡,则该对象不需要被渲染。
III、背面剔除:对于封闭的几何体来说,朝向摄像机背面的面不需要被渲染。
IV、距离剔除:距离相机太远的物体不需要渲染。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2315093.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL 企业版 TDE加密后 测试和问题汇总

一、测试keyring file 1.1 当keyring file文件丢失或者被篡改 结论:不影响当前正在运行的数据库,但是在重启服务后会启动失败出现报错。 tail -n 100 /var/log/mysql/error.log 报错信息如下: 2025-03-12T08:04:54.668847Z 1 [ERROR] [M…

Unity 封装一个依赖于MonoBehaviour的计时器(下) 链式调用

[Unity] 封装一个依赖于MonoBehaviour的计时器(上)-CSDN博客 目录 1.加入等待间隔时间"永远执行方法 2.修改为支持链式调用 实现链式调用 管理"链式"调度顺序 3.测试 即时方法​编辑 "永久"方法 链式调用 ​4.总结 1.加入等待间隔时间&qu…

套接字缓冲区以及Net_device

基础网络模型图 一般网络设计分为三层架构和五层设计: 一、三层架构 用户空间的应用层 位于最上层,是用户直接使用的网络应用程序,如浏览器、邮件客户端、即时通讯软件等。这些程序通过系统调用(如 socket 接口)向内核…

2024下半年真题 系统架构设计师 案例分析

案例一 软件架构 关于人工智能系统的需求分析,给出十几个需求。 a.系统发生业务故障时,3秒内启动 XXX,属于可靠性 b.系统中的数据进行导出,要求在3秒内完成,属于可用性 c.质量属性描述,XXX,属…

c++介绍智能指针 十二(2)

智能指针share_ptr,与unique_ptr不同&#xff0c;多个shar_ptr对象可以共同管理一个指针&#xff0c;它们通过一个共同的引用计数器来管理指针。当一个智能指针对象销毁时&#xff0c;计数器减一。当计数器为0时&#xff0c;会将所指向的内存对象释放。 #include<memory>…

西门子S7-1200 PLC远程调试技术方案(巨控GRM532模块)

三步快速实现远程调试 硬件部署 准备西门子S7-1200 PLC、巨控GRM552YW-C模块及编程电脑。GRM552YW-C通过网口与PLC连接&#xff0c;支持4G/5G/Wi-Fi/有线网络接入&#xff0c;无需复杂布线。 软件配置 安装GVCOM3配置软件&#xff0c;注册模块&#xff08;输入唯一序列号与密…

Mac上更改默认应用程序

Mac上为某些文件设置默认打开应用的时候&#xff0c;刚开始是通过打开方式&#xff0c;其他里面&#xff0c;勾选始终以此方式打开&#xff0c;但实际上这个功能并不太好用&#xff0c;经常会让人误以为已经设置好了。但是实际上只是在当前目录起作用。真正解决这个问题可以按照…

【开源+代码解读】Search-R1:基于强化学习的检索增强大语言模型框架3小时即可打造个人AI-search

大语言模型(LLMs)在处理复杂推理和实时信息检索时面临两大挑战:知识局限性(无法获取最新外部知识)和检索灵活性不足(传统方法依赖固定检索流程)。现有方法如检索增强生成(RAG)和工具调用(Tool-Use)存在以下问题: RAG:单轮检索导致上下文不足,无法适应多轮交互场景…

贪心算法和遗传算法优劣对比——c#

项目背景&#xff1a;某钢管厂的钢筋原材料为 55米&#xff0c;工作需要需切割 40 米&#xff08;1段&#xff09;、11 米&#xff08;15 段&#xff09;等 4 种规格 &#xff0c;现用贪心算法和遗传算法两种算法进行计算&#xff1a; 第一局&#xff1a;{ 40, 1 }, { 11, 15…

网络安全防护总体架构 网络安全防护工作机制

1 实践内容 1.1 安全防范 为了保障"信息安全金三角"的CIA属性、即机密性、完整性、可用性&#xff0c;信息安全领域提出了一系列安全模型。其中动态可适应网络安全模型基于闭环控制理论&#xff0c;典型的有PDR和P^2DR模型。 1.1.1 PDR模型 信息系统的防御机制能…

SpringCloud带你走进微服务的世界

认识微服务 随着互联网行业的发展&#xff0c;对服务的要求也越来越高&#xff0c;服务架构也从单体架构逐渐演变为现在流行的微服务架构。这些架构之间有怎样的差别呢&#xff1f; 单体架构 单体架构&#xff1a;将业务的所有功能集中在一个项目中开发&#xff0c;打成一个包部…

Python设计模式 - 建造者模式

定义 建造者模式是一种创建型设计模式&#xff0c;主要用于构建包含多个组成部分的复杂对象。它将对象的构建过程与表示分离&#xff0c;使得同样的构建过程可以创建不同的对象表示。 结构 抽象建造者&#xff08;Builder&#xff09;&#xff1a;声明创建产品的各个部件的方…

在 Ubuntu 上安装和配置 Docker 的完整指南

Docker 是一个开源的平台&#xff0c;旨在简化应用程序的开发、部署和运行。通过将应用程序及其依赖项打包到容器中&#xff0c;Docker 确保应用程序可以在任何环境中一致地运行。 目录 前言安装前的准备安装 Docker 步骤 1&#xff1a;更新包索引步骤 2&#xff1a;安装必要…

网络安全之数据加密(DES、AES、RSA、MD5)

刚到公司时&#xff0c;我的工作就是为app端提供相应的接口。之前app使用的是PHP接口&#xff0c;对数据加密方面做得比较少。到使用java接口时&#xff0c;老大开始让我们使用DES加密&#xff0c;进行数据传输&#xff0c;但是后来觉得DES是对称加密&#xff0c;密钥存在客户端…

基于SpringBoot的“校园周边美食探索及分享平台”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“校园周边美食探索及分享平台”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 校园周边美食探索及分享平台结构图…

vscode关闭仓库后如何打开

vscode源代码管理->更改->代码 关闭仓库后如何打开。 关闭仓库操作 打开仓库操作 1.按下 Ctrl Shift P&#xff08;Windows/Linux&#xff09;或 Cmd Shift P&#xff08;Mac&#xff09;打开命令面板。 2.在命令面板中输入 Git: Open Repository&#xff0c;然后选…

DeepSeek-R1 论文阅读总结

1. QA问答&#xff08;我的笔记&#xff09; Q1: DeepSeek如何处理可读性问题&#xff1f; 通过构建冷启动数据&#xff08;数千条长CoT数据&#xff09;微调基础模型&#xff0c;结合多阶段训练流程&#xff08;RL训练、拒绝采样生成SFT数据&#xff09;&#xff0c;并优化输…

Linux 》》Ubuntu 18 LTS 之后的版本 修改IP地址 主机名

进入目录 /etc/netplan 修改 50-cloud-init.yaml 》保存文件后&#xff0c;执行以下命令应用更改&#xff1a; sudo netplan apply 》》 DHCP模式 修改主机名 hostnamectl set-hostname xxxx 修改cloud.cfg 防止重启主机名还原 但测试下来 不修改&#xff0c; 重启 也不会还…

泰山派开发之—Ubuntu24.04下Linux开发环境搭建

简介 最近翻到了吃灰已久的泰山派&#xff0c;是刚出来的时候用优惠券买的&#xff0c;当时价格挺便宜的&#xff0c;最近给它翻出来了&#xff0c;打算试试做个项目。买的泰山派容量是2G16G&#xff0c;SOC芯片使用的是RK3566&#xff0c;搭载1TOP算力的NPU&#xff0c;并且具…

哈尔滨算力服务器托管推荐-青蛙云

哈尔滨年平均气温3.5摄氏度&#xff0c;有发展云计算和算力数据中心的天然优势 &#xff0c;今天为哈尔滨算力服务器托管服务商&#xff1a;青蛙云&#xff0c;黑龙江经营17年的老牌IDC服务商。 先来了解下算力服务器&#xff1a; 算力服务器&#xff0c;尤其是那些用于运行人…