Q&A——资源管理(七)

Unity shader学习笔记 (二) 内置的ShaderFX FX/Flare 自发光贴图GUI GUI/Text Shader 文字贴图(背景需透明)。Mobile Bumped Diffuse 凹凸贴图 Bumped Specular 凹凸平滑贴图 提供一个反光度选项,使光面变得光滑。 Bumped Specular (1 Directional light)凹凸平滑贴图(较暗)且只有一个平行光。 阅读详情

资源管理

Q1:我想请教一下,下图这个函数中,每次我都申请了一个List temp = list();在这里存放6KB的数据,但是如果不做GC处理,这6KB是否就一直累加,直到做GC处理了才会释放掉,是这样么?如果调用次数很多,每次都调用一点点,也会推高内存占用吗?
0.png

A:是的,这个6KB堆内存会随着Update的执行一直分配内存,所累积的堆内存会在GC触发时进行销毁。一般来说,研发团队需要尽可能避免在高频次调用函数中进行堆内存的分配。


资源管理

Q2:我的UWA报告中看到几乎每次切换场景都会有UIPanel.LateUpdate()这个函数的堆内存开销,请问说明了什么问题,我是否还能优化?
请输入图片描述

UIPanel.LateUpdate持续分配较大量的堆内存,说明UI界面在制作上存在以下问题:

  1. Panel中Widgets数量过多,且存在频繁的变动,导致UIPanel需要进行大量的网格重建;
  2. 动静态UI元素没有分离。

建议研发团队对UI界面的制作进行进一步检测,尽可能将静态UI元素和动态UI元素分开,存放于不同的Panel下。同时,对于不同频率的动态元素也建议存放于不同的Panel中。


资源管理

Q3:我UWA报告中“渲染模块”界面中看到大部分场景中的三角面片数是正常的,但在某一帧时DrawCall、Traingle、蒙皮网格数骤然提升,请问这可能是什么原因导致的?这三个参数的变化曲线是否有规律?为什么我在切换场景的时候也会有400多的DrawCall呢?
请输入图片描述

从图中看,这种情况发生在场景切换处。这种情况的发生原因很可能为一次性动态加载大量GameObejct,然后再手动Deactive当前并不需要使用的GameObject。研发团队可以查看该峰值处的场景名称和相关截图,从而来进一步定位发生该问题的根本原因。

资源管理

Q4:关于贴图类型设置请问有什么好的建议呢?是否所有的贴图都设置为Advanced比较好?这种情况下的贴图内存是不是比较小?
请输入图片描述

Unity默认情况下会将绝大多数纹理设置为Texture模式。一般来说,Texture模式对于绝大多数纹理资源也都是合适的。上面的例子中,Advanced模式下之所以内存占用较小,是因为关闭了Mipmap选项,所以其内存下降了。其本质跟Advanced模式无关。Advanced模式较之Texture模式和其他模式,可以更大自由地对纹理资源进行控制。因此,如果你想对纹理资源进行更加自定义地设置,可以选择Advanced模式进行编辑。

资源管理

Q5:NGUI的图集在内存里存了多份,求问怎么清理?
请输入图片描述

游戏运行中,UI Mesh出现多份不同内存的情况,是正常的,因为随着UI widget使用的增加或减少,创建的UI Mesh是会随着变化的。同时,如果不同UIPanel中存在相同Atlas的Widgets,则也会出现上图中的情况。因此,建议大家遇到这种情况时,查看单帧中NGUI UI Mesh重名的是否有多份重名资源。如果存在,则说明相同Atlas中的资源被多个不同的UIPanel所使用,这种情况是需要尽可能避免的。
请输入图片描述


资源管理

Q6:Profiler中Not Saved是指什么?
请输入图片描述

Profiler中的Not Saved指的是项目中通过代码生成的各种资源记录。如上图所示,其Mesh均为NGUI插件通过脚本生成的UI界面Mesh资源。


资源管理

Q7:我已经下载了Shader,放到Unity里了,理应是不会自己引用,可是为什么还有如下这么多重复引用呢?
1. Mobile/Particles/Additive
2. Particles/Alpha Blended
3. Mobile/Particles/Alpha Blended
4. Default-Material

请输入图片描述

我们在Unity5.3.4版本上进行了测试,发现了以下两种情况:
.

  1. 对于Standard Shader来说,仅下载Shader确实是关联不上的。原因是Prefab上还用了Default-Material,这个也是Built-in资源,所以才会出现了Standard Shader的冗余问题。

请输入图片描述

. 上图可以直接看到这两个资源是同时出现,且均为冗余资源。对此,建议开发团队直接生成一个新的Material来代替Default-Material。
.

  1. 其他Shader关联不上的原因可能是:新下载Shader的GUID与项目中原始资源关联的GUID不一致,如下图所示。对此,大家需要自行对Meta文件中的相关GUID进行修改,将原始GUID替换为新下载Shader的GUID。最下方为一个批量处理该类问题的脚本代码,感谢QQ讨论群中网友wupei的提供!
    .
    请输入图片描述
using UnityEngine;
using System.Collections;
using UnityEditor;
using System.IO;

public class BuildScript {

    [MenuItem("Build/RefreshMat", false, 501)]
    static void RefreshMat() {
        var guids = AssetDatabase.FindAssets("t:Material");
        foreach (var guid in guids) {
            var path = AssetDatabase.GUIDToAssetPath(guid);
            if (path.ToLower().EndsWith("mat")) {
                var mat = AssetDatabase.LoadAssetAtPath<Material>(path);
                if (mat && mat.shader) {
                    Debugger.Log("{0}\n{1}\n{2}\n{3}\n", path, mat.shader.name,
                        mat.shader.GetInstanceID(),
                        Shader.Find(mat.shader.name).GetInstanceID());
                    mat.shader = Shader.Find(mat.shader.name);
                }
            }
        }
    }

}

资源管理

Q8: 我们测试了下发现,在名为A的MonoBehaviour中,有个数组来存放名为B的 MonoBehaviour对象的引用。当我们其他的逻辑去Destroy了B对象所在的GameObject后,在A对象中的数组里,遍历打印,它们(B的引用)都为Null,在Inspector面板上看是missing。而这时候进行GC,堆内存其实并未释放这些B对象。只有当A对象中的数组被清空后,再调用GC,才可释放这些对象所占内存。这种现象是否正常?为什么值为Null但却还是被引用着,无法通过GC释放呢?

首先这种现象是正常的。这是Unity中对Null的检测做了特殊的处理所致,在Unity中MonoBehaviour对象除了存在于Managed Heap中(作为“壳”),在Native内存中还会有一个相对应的“实体”,在调用Destroy时,真正被释放的正是这个“实体”。而在判断一个MonoBehaviour对象是否为Null时,Unity会首先检测“实体”是否已经被销毁,如果是则返回为true,但此时Managed Heap中的“壳”实际上依然是被引用的,从而就会出现对象的Null判断为true,但实际上还是被引用着,无法被GC释放的问题。
.
相关的细节可见官方blog对Unity中Null判断的解释:
http://blogs.unity3d.com/2014/05/16/custom-operator-should-we-keep-it/


资源管理

Q9:Optimize Game Objects对于老版本的Animation系统有没有作用呢?

没有作用。Optimize Game Objects功能是Unity4.3版本推出的功能,且仅对Mecanim动画系统起作用。如果可以的话,建议研发团队尽可能使用Mecanim来作为项目动画系统的解决方案。

资源管理

Q10:切换场景时,卸载上一个场景总感觉耗时,请问大家是否有什么推荐的方案?
请输入图片描述

A:这是Unity在切换场景时调用Resources.UnloadUnusedAssets这个函数造成的,通常情况下其开销都是会比较大。建议开发团队通过UWA性能检测,在加载模块中进一步定位卸载场景的元凶。

请输入图片描述



避坑指南:Unity粒子系统Renderer模块的10个常见错误及解决方法 本文深入解析Unity粒子系统Renderer模块的10个常见错误及解决方案,涵盖粒子消失、材质失效、阴影异常等典型问题。通过实战案例和性能优化技巧,帮助开发者避免视觉瑕疵和性能陷阱,提升粒子特效质量。特别针对Render Mode配置、Shader兼容性等关键点提供专业指导。 阅读详情

相关推荐

七牛图片云存储:一站式多媒体资源管理

云存储指的是通过网络连接,将数据存储在远程的服务器集群中。它提供一种简便的数据存取方式,用户无需关心数据的实际物理位置,同时享受按需扩展存储空间的灵活性。云存储具有可靠性高、数据冗余、易扩展、低成本、安全稳定等特点。七牛云成立于2012年,是中国领先的云服务商之一。公司从图片存储开始,逐步发展到包括对象存储、CDN、视频云、大数据处理等在内的综合性云服务解决方案。七牛云注重技术创新和用户体验,致力于为全球用户提供稳定、安全、高效的云存储服务。

weixin_28840811的博客 1110

unity Shader.Find()找不到内置shader问题

Shader.Find(“Mobile/Particles/Additive”) 会遇到找不到shader的情况。虽然Find的shader是unity内置的shader 因为在导出工程文件时,Unity默认情况下不会把工程里没有使用过的shader导出(unity不会分析你代码里使用了哪个内置shader)。 所以Shader.Find会找不到,怎么办? 方法一 Edit->ProjectSettings->GraphicsSettings Always Included Shaders 加入

weixin_45488182的博客 3654

【G4基础08】GPS-2-Macro Commands宏命令

GPS-2

adelall的博客 3741

Unity 如何编辑气泡特效u3d冒泡特效

3、设置Duration, Start Lifetime 以及 Start Speed 都为5 , 设置 Start Rotation 为 -10到 10 .1、新建一个空物体命名为BubbleParent, 添加ParticleSystem ,用于控制播放, 将ParticleSystem中的Render关掉。9、运行后可以看到一个冒泡的效果了。-1、新建一个材质球, 将材质球的shader 设置为Mobile/Particles/Additive, 材质球命名为Bubble1.

coldshower的博客 912

硬件工程师必备核心知识点

硬件设计是一项系统化工程活动,涉及元器件选型、电源设计、信号完整性、EMC和PCB工艺等多个环节

硬核科技 340

知识抽取框架OneKE

OneKE 中指令的格式采用了类 JSON 字符串的结构,本质上是一种字典类型的字符串。优化知识抽取的性能不仅能够强化模型对世界知识的理解和应用,还能够构建知识要素之间的跨领域的深度关联和依赖,这些都是大规模知识图谱构建的关键依赖。一直是知识图谱大规模落地的关键难题之一,因为真实世界的信息高度碎片化、非结构化,大语言模型在处理信息抽取任务时仍因抽取内容与自然语言表述之间的巨大差异导致效果不佳,自然语言文本信息表达中因隐式、长距离上下文关联存在较多的歧义、多义、隐喻等,给知识抽取任务带来较大的挑战。

qq_32907491的博客 3212

Unity 内置渲染管线各个Shader的用途和性能分析,以及如何修改Shader(build in shader 源码下载)

Legacy就是遗留的意思,老木乃伊了,非必要不用,Particles路径下的shader的优化版都在Mobile/Particles,适用于桌面设备或较旧的 Unity 项目,支持较为复杂的光照和粒子效果,但性能可能不适合移动设备。这些着色器通常计算简单,旨在提供快速的渲染性能,适应移动设备的性能和内存限制。简化的工作流程:Unity 已经为常见的自然环境材质(如树木、草地、水面等)提供了预制的着色器,开发者可以直接使用这些着色器,而不需要编写复杂的自定义着色器,快速开发自然环境。

主攻工具化、AI 辅助开发、团队效率提升与产品落地。 8177

SIwave学习记录:电热耦合仿真

SIwave电热耦合仿真

m0_68174736的博客 2337

Q&A——资源管理(十)

资源管理 Q1:关于定位游戏中冗余资源引用的问题。UWA的报告中能定位到具体的引用代码么? 在Profiler只能看到ManagedStaticReferences但是具体不到引用的位置。比如Static ClassA引用一个ClassB,ClassB上引用了一个资源,就定位不出这个引用的过程。请问这种情况下有没有比较好的方法找到引用关系呢? 该问题在Unity 5.3 之前的版本

起个名字好难啊 1352

通信工程学习:什么是OLT光线路终端

OLT(光线路终端)是无源光网络(PON)的核心局端设备,负责光/电信号转换、数据处理、带宽分配及用户管理。具有高带宽、低损耗、高安全性和易维护等技术特点,广泛应用于家庭、企业及公共机构宽带接入。未来将向更高性能、智能化方向发展,结合SDN/NFV等新技术,提升网络服务质量。

limengshi138392的博客 4366

专栏目录:Linux 内存管理子系统的进化——从 MM 到 HMM

专栏梳理了Linux内存管理子系统从经典MM到异构内存管理(HMM)的演进历程。内容分为六大部分:首先介绍经典MM基础,包括虚拟地址空间、页表、VMA等核心机制;其次分析MM通用框架如页表遍历、NUMA迁移等;然后探讨设备内存引入的关键技术,如ZONE_DEVICE和dev_pagemap;接着深入解析HMM核心机制及其与DMA的集成;随后通过多个实际驱动案例展示HMM应用;最后讨论大页支持等进阶主题。专栏采用"经典机制→问题→扩展方案"的三段式结构,帮助开发者理解Linux如何通过HMM实现设备内存管理。

图形/计算GPU的驱动与虚拟化技术分享园地 884

Q&A——资源管理(十一)

资源管理 Q1:怎么去掉Mesh中的Colors属性?我把FBX里的LayerElementColor字段都删了,这个Colors还是存在。 默认情况下,在3d建模软件中并不会导出Color属性。以3ds max为例,Color通常是通过modifier添加的,因此只需要在导出前将其删除即可。另外也可以通过fbx sdk来直接对文件进行处理,但这种做法就需要查看官方的文档了。

起个名字好难啊 935

数字电视中的 Closed Caption (CC) 字幕标准协议

本文将详细介绍 DVB中的 CC 字幕标准协议,包括数据结构格式、字段定义、字段占用比特数以及字段用途。此外,本文还将举例说明如何从 TS 传输流中解析 CC 字幕信息,并组织打包到电视节目中进行显示。

以实战经验介绍行业知识 670

Q&A——资源管理(三)

资源管理 Q1:StreamingAssetPath 和 PersistantDataPath下可以不Load AssetBundle ,直接放资源Load吗? 这是可以的,但非常有限。因为不通过 AssetBundle 加载,只能通过 Unity 提供的有限的接口来直接加载外部资源,如通过 WWW.audioClip 直接加载 mp3文件,通过 WWW.texture 直接加载

起个名字好难啊 472

完整的 Python 数据分析案例:新能源汽车续航里程预测

随着新能源汽车的普及,续航里程成为消费者关注的重要指标。准确预测新能源汽车的续航里程,有助于车企优化电池管理系统、提升车辆性能,也能帮助消费者合理规划出行。本案例将基于新能源汽车的各项参数,如电池容量、行驶速度、环境温度等,构建续航里程预测模型。通过以上改进,可以提高数据处理的准确性、模型的性能和可视化的效果。

daqsdfas的博客 1588

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Q&A——资源管理(六)

资源管理 Q1:请教个问题,我用Unity 5 里提供的Sprite Packer把A.png,B.png打进一张图集,在运行时我怎么方便地加载这两张图呢?使用场景:某个Image控件根据不同的条件显示A,或者显示B。 目前通常是在脚本序列化信息中保留这两个Sprite的引用,在切换时直接通过对Image.sprite进行赋值来切换。

起个名字好难啊 1200

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

PMP知识点(七、资源管理)

此系列文章分享给想学习PMP的项目经理和想要学习PMP的程序猿们!期望观看者快速掌握PMP知识点并实际运用(还有顺利考过PMP了)。 本章内容: 资源管理过程介绍

cuixuefeng1112的专栏 1339

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Q&A——资源管理(十二)

资源管理 Q1:我们在做依赖打包改进,比如UIAtlas这种脚本,AssetBundle包里脚本没有做依赖,每个包里都有这个脚本,会导致Mono堆内存增大么?对于“脚本也是资产”这一点理解的不是很透彻。脚本在AssetBundle里是不会启动,但是会出现脚本丢失。本身没有做依赖打包的话脚本是冗余在AssetBundle中吧? 首先,需要说明的是,脚本本身的内容是不会被打包到Asse

起个名字好难啊 1100

【Cocos Creator UI资源管理】

ui资源管理框架

Javaigood的博客 1611

Q&A——资源管理(五)

资源管理 Q1:Unity中的SerializedFile是怎么产生的?请问用Unload(false)可以清除吗?因为读取了Bundle里面的内容后已经赋值给其他物体了。而且我把图片都打成了Bundle,然后读取出来,图片的大小应该是超过了这个SerializedFile的大小的? SerializedFile是AssetBundle加载时产生的序列化信息,一般为LoadFr

起个名字好难啊 817

Q&A——资源管理(八)

资源管理 Q1: 我使用Shader.WarmupAllShaders操作,在后续加载资源还是有CreateGPUProgram出现。(Shader都在一个AssetBundle文件中,都是常驻内存的,不会删掉)是必须使用ShaderVariantCollection来加载Shader吗? A:以上这种问题的较大可能是:Shader被打包到不同AssetBundle中了,WarmupA

编程小生的专栏 786

Q&A——资源管理(十四)

资源管理 Q1:我的游戏运行一段时间之后,已经切换到一个空场景了,然后手动调用了System.GC.Collect(); Resources.UnloadUnusedAssets();为什么还是会有这么多贴图资源被引用呢。我猜可能是由于一些脚本中的静态变量引用导致,请问有办法查出来是哪些静态变量吗? 很大可能是这些资源直接或间接被其他Container缓存了,这种情况在我们进行内存

起个名字好难啊 585
上一篇: Q&A——内存管理(三)
下一篇: Q&A——开发技巧(一)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值