【Unity3D优化】优化内置shader的内存占用

一、性能分析

        监控项目线上的崩溃情况,绝大多数崩溃都是因为低端设备,运行时内存不足,在运行过程中申请开辟新的内存时Crash了。因此,不定期继续优化内存占用。

        性能分析首先主要靠Unity3d的Memory Profiler监控一些可追踪到的内存占用。留意到Shaders项占用大约有13MB左右。查看详细占用时,发现每一个shader的内存占用并不多,但是数量较多。

        可以看出,基本是是与粒子系统相关的shader,主要集中在

        Particle/Standard Unlit

        Legacy Shaders/Particles/Additive

        Legacy Shaders/Particles/Additive(Soft)

        Legacy Shaders/Particles/Alpha Blended

二、原因分析

        结合项目特点可以分析,由于项目里使用了大量的粒子特效,一些特殊的效果,会给特效师写定制的shader,但是这些常见的效果,特效师直接使用了Unity Built-in的shader。

        在打AB包的过程中,并不会把这些Built-in的shader单独打包,并与材质球和预设体做好依赖,因此打AB包时,Unity会自行在材质球和预制体的AB包内每一个都包含进去用到的Built-in的Shader,而且运行时,由于加载的是不同的AB包,shader也是不同的实例,占用的也是多份内存。

        当项目中这样使用的粒子特效越来越多,这部分也越积攒越多。

三、解决方案

        解决的思路分这样几个步骤:

        1、将Built-in的Shader取出,为项目所用。

        Unity官方是提供了这些shader的,在Unity下载的网站即可找到对应的内容。

        Unity 2021.3.30

        

        2、捋清楚依赖关系,抽出通用的shader和材质球

        由于项目内资源量很大,有几部分的分包。分包之间保证没有相互依赖,因此就在几大分包内各自放入这4个shader修改名称和路径后的文件,并建立公用的材质球。

        3、制作工具自动替换

        写一个Editor的脚本去替换现有的shader和材质球。

        大体替换的函数如下,按照目录去搜索需要替换的资源即可。

private static void ResetMaterialShader(string path, Dictionary<string, string> shaderMap)
{var m = AssetDatabase.LoadAssetAtPath<Material>(path);if (m == null)return;if (shaderMap.TryGetValue(m.shader.name, out var replaceShader)){int renderQueue = m.renderQueue;m.shader = Shader.Find(replaceShader);m.renderQueue = renderQueue;EditorUtility.SetDirty(m);}
}private static void ResetPrefabMaterial(string path, Material customMaterial)
{var prefab = AssetDatabase.LoadAssetAtPath<GameObject>(path);if (prefab == null)return;var particleSystems = prefab.GetComponentsInChildren<ParticleSystem>(true);foreach (var ps in particleSystems){if (ps == null)continue;var renderer = ps.GetComponent<ParticleSystemRenderer>();if (renderer != null && !renderer.enabled && renderer.sharedMaterial != null && DefaultMaterialNameMap.Contains(renderer.sharedMaterial.name)){renderer.sharedMaterial = customMaterial;}}
}

        4、检查依赖并重新打AB包

        确保这些文件会单独打AB包并做好依赖,重新打包。

三、优化效果

        把主要在重复的四个shader处理完之后,Shaders部分的占用从13MB下降到3MB,并且包体大小小了10MB左右。基本达到了预期目标。

四、进一步处理

        由于资源依赖的复杂性,很难确保特效师能一直以正确的shader去使用,因此,这个检查和替换工具将做进一步封装,融入到打包的CI管线,在Jenkins等打包流程中做这一步检查,实现全自动化。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 方法的定义

目录 1.Java的方法类似于其他语言的函数&#xff0c;是一段用来完成特定功能的代码片段。 2.方法包含一个方法头和方法体&#xff0c;下面是一个方法的所有部分&#xff1a; &#xff08;1&#xff09;修饰符&#xff1a;可选。告诉编译器如何调用该方法&#xff0c;定义了该…

基于微信小程序的挂号管理系统-小程序端

微信小程序端系统功能实现 登录功能 系统登录功能中&#xff0c;用户只需在登录界面输入正确的用户名和密码&#xff0c;即可快速进入系统。登录功能还采用了先进的加密技术&#xff0c;保障用户信息的安全性&#xff0c;让用户能够放心使用。 注册功能 系统注册功中&#xf…

Vue项目“npm run serve”总卡住的问题 已解决

Vue项目“npm run serve”总卡住的问题 已解决 概述 如果卡住进度在51% 直接看这篇 https://blog.csdn.net/qq_34419312/article/details/141681307?spm1001.2014.3001.5501 在使用Vue.js进行项目开发时&#xff0c;npm run serve命令是我们常用的启动本地开发服务器的方式…

使用docker compose一键部署 Openldap

使用docker compose一键部署 Openldap LDAP&#xff08;轻量级目录访问协议&#xff0c;Lightweight Directory Access Protocol&#xff09;是一种用于访问分布式目录服务的网络协议&#xff0c;OpenLDAP 是 LDAP 协议的一个开源实现&#xff0c;由 OpenLDAP 项目提供&#x…

虚幻5|技能栏UI优化(3)——优化技能UI并实现显示背景UI,实现技能界面设计,实现技能栏的删除和添加

实现技能栏添加&#xff1a;将技能界面里的技能拖到技能栏格子 一.调整&#xff0c;在拖出技能的时候&#xff0c;还会有边框 1.打开拖拽的技能格子UI 除了技能按钮&#xff0c;下面的子级都放到垂直框的子级&#xff0c;然后删除技能按钮 2.将垂直框替换成包裹框 你会发现有…

设计一个栈返回栈元素中的最小值python(简单)

请设计一个栈&#xff0c;除了常规栈支持的pop与push函数以外&#xff0c;还支持min函数&#xff0c;该函数返回栈元素中的最小值。执行push、pop和min操作的时间复杂度必须为O(1)。简单但经典 示例&#xff1a; MinStack minStack new MinStack(); minStack.push(-2); minSta…

数学建模强化宝典(2)linprog

一、介绍 linprog 是 MATLAB 中用于解决线性规划问题的函数。线性规划是一种优化方法&#xff0c;它尝试在满足一组线性等式或不等式约束的条件下&#xff0c;找到一个线性目标函数的最大值或最小值。linprog 函数适用于求解形如以下问题的线性规划问题&#xff1a; minimizecT…

OpenCV 旋转矩形边界

边界矩形是用最小面积绘制的&#xff0c;所以它也考虑了旋转。使用的函数是**cv.minAreaRect**()。 import cv2 import numpy as npimgcv2.imread(rD:\PythonProject\thunder.jpg) img1cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) print(img.dtype) ret,threshcv2.threshold(img1,1…

BUUCTF—[网鼎杯 2020 朱雀组]phpweb

题解 打开题目是这样子的。 啥也不管抓个包看看&#xff0c;从它返回的信息判断出func后面的是要调用的函数&#xff0c;p后面的是要执行的内容。 那我们直接执行个系统命令看看&#xff0c;可以看到返回了hack&#xff0c;估计是做了过滤。 funcsystem&pls 直接读取源码…

python多进程

文章目录 1、前言2、示例3、参考 1、前言 python中使用多进程&#xff0c;可以加快代码的运行速度&#xff0c;更高效地进行相关工作。 2、示例 使用蒙特卡洛方法计算 π \pi π来进行使用多进程前后代码运行速率的对比&#xff1b; import random import multiprocessing as…

白盒测试和黑盒测试详解

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 对于很多刚开始学习软件测试的小伙伴来说&#xff0c;如果能尽早将黑盒、白盒测试弄明白&#xff0c;掌握两种测试的结论和基本原理&#xff0c;将对自己后期的学习…

Java并发编程实战 02 | 为什么创建线程只有一种方法?

在 Java 中&#xff0c;我们如何创建和使用线程&#xff1f;为什么说线程的创建方式本质上只有一种呢&#xff1f;本文将从并发编程的基础——如何创建线程开始&#xff0c;希望大家能够打好基础。虽然线程的创建看起来很简单&#xff0c;但其中还是有很多细节值得深入探讨。最…

基于SpringBoot的高校BBS在线互动论坛系统

&#x1f4a5;&#x1f4a5;源码和论文下载&#x1f4a5;&#x1f4a5;&#xff1a;基于SpringBoot的高校BBS在线互动论坛系统-源码论文报告数据库.rar 1. 系统介绍 本论文设计并实现了一个基于Spring Boot和Vue的校园论坛系统&#xff0c;该系统分为用户和管理员两个角色。用户…

【网络安全】服务基础第一阶段——第七节:Windows系统管理基础---- Web与FTP服务器

将某台计算机中的⽂件通过⽹络传送到可能相距很远的另⼀台计算机中&#xff0c;是⼀项基本的⽹络应⽤&#xff0c;即⽂件传送。 ⽂件传送协议FTP &#xff08;File Transfer Protocol&#xff09;是因特⽹上使⽤得最⼴泛的⽂件传送协议。 涉及到文件的上传和下载&#xff0c;很…

代码随想录 刷题记录-28 图论 (5)最短路径

一、dijkstra&#xff08;朴素版&#xff09;精讲 47. 参加科学大会 思路 本题就是求最短路&#xff0c;最短路是图论中的经典问题即&#xff1a;给出一个有向图&#xff0c;一个起点&#xff0c;一个终点&#xff0c;问起点到终点的最短路径。 接下来讲解最短路算法中的 d…

【论文分享】GPU Memory Exploitation for Fun and Profit 24‘USENIX

目录 AbstractIntroductionResponsible disclosure BackgroundGPU BasicsGPU architectureGPU virtual memory management GPU Programming and ExecutionGPU programming modelGPU kernelDevice function NVIDIA PTX and SASSSASS instruction encoding GPU Memory SpacesGlob…

【数据库】MySQL表的基本查询

关于表的增删查改主要分为CRUD&#xff1a;Create(创建), Retrieve(读取)&#xff0c;Update(更新)&#xff0c;Delete&#xff08;删除&#xff09; 目录 1.Creat&#xff08;增加内容&#xff09; 1.1指定列插入 1.2全列插入 1.3多行插入 1.4插入冲突更新 1.5替换 2.R…

【算法每日一练及解题思路】判断字符串是否包含数字

【算法每日一练及解题思路】判断字符串是否含数字 一、题目&#xff1a;给定一个字符串&#xff0c;找出其中不含重复字符的最长子串的长度 二、举例&#xff1a; 比如"abcdefgh",不含数字&#xff1b;比如"1",含数字&#xff1b;比如"a1s",含…

fl studio24.1.1.4285中文版怎么破解?FL Studio 2024安装破解使用图文教程

fl studio24.1.1.4285中文破解版是一款功能强大的编曲软件&#xff0c;也就是众所熟知的水果软件。它可以编曲、剪辑、录音、混音&#xff0c;让您的计算机成为全功能录音室。除此之外&#xff0c;这款软件功能非常强大&#xff0c;为用户提供了许多音频处理工具&#xff0c;包…

单点登录问题【拼多多0905一面】

说一些今晚情况&#xff0c;7点腾讯音乐笔试&#xff0c;因为8点拼多多一面&#xff0c;哪个都拒不了。硬着头皮50分钟写了1.2题然后去面试。刚开始状态真的很差&#xff0c;大脑思考不动&#xff0c;面试中2个手撕&#xff0c;做出来一个&#xff0c;两个项目问题&#xff0c;…