Q&A——性能优化(一)

分享Unity的Profiler分析和解决GC.MarkDependencies 1.解決[cammand],避免依賴ILProcess 2.高層保持(hight level),換底層通訊+protobuf 3.各種例子測試 阅读详情

性能优化

Q1:如图,我们在UI打开或者移动到某处的时候经常会观测到CPU上的冲激,经过进一步观察发现是因为Instantiate产生了大量的GC。想请问下Instantiate是否应该产生GC呢?我们能否通过资源制作上的调整来避免这样的GC呢?如下图,因为一次性产生若干MB的GC在直观感受上还是很可观的。
UWA Tech Doc

准确的说这些 GC Alloc 并不是由Instantiate 直接引起的,而是因为被实例化出来的组件会进行 OnEnable 操作,而在 OnEnable 操作中产生了 GC,比如以上图中的函数为例:

上图中的 Text.OnEnable 是在实例化一个 UI 界面时,UI 中的文本(即 Text 组件)进行了 OnEnable 操作,其中主要是初始化文本网格的信息(每个文字所在的网格顶点,UV,顶点色等等属性),而这些信息都是储存在数组中(即堆内存中),所以文本越多,堆内存开销越大。但这是不可避免的,只能尽量减少出现次数。
因此,我们不建议通过 Instantiate/Destroy 来处理切换频繁的 UI 界面,而是通过 SetActive(true/false),甚至是直接移动 UI 的方式,以避免反复地造成堆内存开销。

性能优化

Q2: 关于场景中玩家和NPC名字的DrawCall的问题。我们项目中是使用TextMesh挂到场景单位上,但是这样每个名字就占了一个DrawCall,请问有没有好的办法优化呢?

游戏中的HUD的做法一般有两种,一种是如上的做法,另一种则是通过NGUI/UGUI来制作HUD。第二种的实现方法大致如下:
(1)计算屏幕中角色在屏幕中的位置;
(2)根据屏幕中的位置来计算各自HUD的位置,并根据HUD的数量分别放置在一个或几个Panel/Canvas下。

第二种方法的优势是尽可能用少的Draw Call数来渲染角色的HUD。开发团队可以就该方法来进行尝试。

性能优化

Q3: 我们能通过Batching来进行效能方面的优化吗?透过粒子发射出来的半透明模型片是无法Saved by Batching ,如果粒子可以使用Dynamic Batching的话,想请教具体的使用规则与方法。

根据Unity 官方的信息,目前粒子系统已经不再进行 Draw Call 的拼合,因为在新版本5.3 中已通过多线程进行更新,暂时无法支持拼合,但性能已经得到提升。
开发团队可以参考:http://forum.unity3d.com/threads/particle-batching.382835/

性能优化

Q4:请教,角色分部件换装可行吗?比如衣服裤子分开,都是用Skinned Mesh Render,有没有办法合并降低Draw Call?

可以通过合并网格的方式来达到降低Draw Call的效果,具体可查看Asset Store中的换装例子:Character Customization。但是,在角色换装时需要注意以下几点:
(1)装备与角色必须是共用一套骨骼的;
(2)各装备之间所用的材质必须相同。
开发者需要注意,只有同时满足以上两个条件时,才能达到只使用少量Draw Call来进行动态换装的效果。

性能优化

Q5:通过移动位置来隐藏UI界面,会使得被隐藏的UIPanel继续执行更新(LateUpdate有持续开销),那么如果打开的界面比较多,CPU的持续开销是否就会超过一次SetActive所带来的开销?

这确实是需要注意的,通过移动的方式“隐藏”的UI界面只适用于几个切换频率最高的界面,另外,如果“隐藏”的界面持续开销较高,可以考虑只把一部分Disable,这个可能就需要具体看界面的复杂度了。一般来说在没有UI元素变化的情况下,持续的 Update 开销是不太明显的。


性能优化

Q6:游戏中出现UI界面重叠,该怎么处理较好?比如当前有一个全屏显示的UI界面,点其中一个按钮会再起一个全屏界面,并把第一个UI界面盖住。我现在的做法是把被覆盖的界面 SetActive(False),但发现后续 SetActive(True) 的时候会有 GC.Alloc 产生。这种情况下,希望既降低 Batches 又降低 GC Alloc 的话,有什么推荐的方案吗?

可以尝试通过添加一个 Layer 如 OutUI, 且在 Camera 的 Culling Mask 中将其取消勾选(即不渲染该 Layer)。从而在 UI 界面切换时,直接通过修改 Canvas 的 Layer 来实现“隐藏”。但需要注意事件的屏蔽,禁用动态的 UI 元素等等。

这种做法的优点在于切换时基本没有开销,也不会产生多余的 Draw Call,但缺点在于“隐藏时”依然还会有一定的持续开销(通常不太大),而其对应的 Mesh 也会始终存在于内存中(通常也不太大)。

以上的方式可供参考,而性能影响依旧是需要视具体情况而定。

性能优化

Q7:我在Profiler中看到 GC.MarkDependencies 的CPU消耗有900ms+, 虽然在退出战斗的时候调用了Resources.UnloadUnusedAssets(); 可是卡顿还是很明显,请问有什么推荐的方案吗?

GC.MarkDependencies的消耗是由Resources.UnloadUnusedAssets引起的。该函数的主要作用是查找并卸载不再使用的资源。游戏场景越复杂、资源越多,该函数的开销越大,一般在300~2000 ms范围内。所以,我们在UWA报告中加入了对该函数的调用监测,以便让大家更好地掌控它的调用情况。
UWA Tech Doc

对于该函数的优化,我们建议一方面控制场景中不必要的资源量,同时通过UnloadAsset来及时卸载不再使用的资源,以减少Resources.UnloadUnusedAssets的耗时压力。
后续,我们会在加载模块的相关文章中为大家详细讲解Resources.UnloadUnusedAssets的性能问题,敬请期待。

性能优化

Q8: 我在用Profiler真机查看iPhone App时,发现第一次打开某些UI时,Font.CacheFontForText占用时间超过2s,这块主要是由什么影响的?若iPhone5在这个接口消耗2s多,是不是问题很大?这个消耗和已经生成的RenderTexture的大小有关吗?

Font.CacheFontForText主要是指生成动态字体Font Texture的开销, 一次性打开UI界面中的文字越多,其开销越大。如果该项占用时间超过2s,那么确实是挺大的,这个消耗也与已经生成的Font Texture有关系。简单来说,它主要是看目前Font Texture中是否有地方可以容下接下来的文字,如果容不下才会进行一步扩大Font Texture,从而造成了性能开销。


性能优化

Q9:我用Profiler.BeginSample统计到的数据与直接看Memory下的不一样,前者比后者的数据更大,这是为何? 用Profiler的API获取到的这一帧的内存消耗是85.6MB,而堆内存中显示的是62.9MB,这怎么理解?

Profiler.BeginSample
请输入图片描述

Profiler中数据
请输入图片描述

这种情况确实也是经常会遇到的。一帧中分配如此高的内存是会触发GC.Collect的,而Mono中显示的数值则是GC之后的Mono内存数值。

性能优化

Q10:Unity 的 TimeManager Time默认是0.02。我们有个NetConnectionManager脚本使用了FixedUpdate,这个脚本是用来解析网络协议的,我尝试修改Time的值为0.01 ,感觉游戏似乎提高了运行的效率,具体表现在减少了一些卡顿问题的延迟,提高了调用的频率,但是发热和耗电问题似乎会变得严重。关于TimeManager设置,你们有什么建议吗?

将TimeManager中的Time从0.02降低到0.01,其本质是将FixedUpdate的调用频率从默认的50次/秒提升为100次/秒。这一操作确实很可能带来画面表现的流畅感,但同样增加了一倍的网络IO,其本身会占用更大的性能开销,从而造成设备发热。一般来说,除对于网络同步非常高的游戏外,TimeManager中Time按照默认的0.02设置即可。


LangChain构建本地Q&A应用:RAG实战入门指南 RAG(检索增强生成)是当前大模型落地知识库问答的核心范式,其本质是将外部结构化/非结构化数据通过加载、切分、嵌入、检索四步注入LLM上下文,从而突破模型固有知识边界并提升回答准确性与可解释性。该技术路径兼顾效果与工程可控性,避免微调与向量数据库运维等高门槛环节,特别适合企业内部文档智能助手、技术手册问答、私有知识库等轻量级AI应用场景。本文基于LangChain框架,聚焦PDF文档处理、语义切分、本地嵌入模型(all-MiniLM-L6-v2)与小语言模型(Phi-3-mini)协同推理等关键实践,提供零 阅读详情

相关推荐

UNITY性能优化☀️一、GC介绍与Unity内存管理方法

GC介绍与Unity内存管理方法

星河造梦坊 4975

【酷熊科技】工作积累 ----------- 内存优化之GC.MarkDependencies

内存优化之GC.MarkDependencies 如何避免 GC.MarkDependencies 这个将会造成一定的时间,并且占用的时间还不小, 翻译一个遇到同样问题的 1 大家好, 2 3 我有一个巨大的性能问题,我试图以某种方式解决... 4 有没有人遇到过这个问题GC.MarkDependencies需要大量的CPU时间?(见所附截图) ...

weixin_33788244的博客 1944

15、构建Q&A应用后端:从Redux到Dapper的实践指南

本文详细介绍了如何构建一个Q&A应用的后端系统,涵盖了从Redux状态管理到使用Dapper进行数据库操作的全过程。内容包括Redux的核心概念、数据库设计与实现、Dapper的安装与配置、数据读写操作、数据库迁移工具DbUp的使用、性能优化策略、后端API的安全保护措施以及与前端的RESTful API交互。通过这些实践指南,开发者可以快速掌握构建高性能、可扩展和安全的后端应用所需的关键技术。

mqtt6iot的博客 48

关于Unity加载优化,你可能会遇到这些问题

如果只是通过Resources.Load加载,就不会有纹理的多份,但是如果通过AssetBundle加载,每个Prefab都是一个AssetBundle,并且纹理没有打包依赖,那么纹理资源确实会在记忆。如果反转,则可以释放。对于Unity 5.3版本之前的项目,建议通过LoadFromCacheOrDownload或LoadFromFile加载AssetBundle,既可以减少Assetbundle对象的内存占用,又可以保持AssetBundle之间的链接关系和资源,方便后续加载有依赖的Prefabs。

真像大白阿的博客 4932

15、构建Q&A应用后端:从数据库到Dapper数据访问

本文详细介绍了如何构建一个Q&A应用的后端系统,涵盖了从数据库设计、使用Dapper实现数据读写、数据库迁移管理,到性能优化及后端安全保障等多个方面。通过具体的代码示例和操作步骤,帮助开发者快速搭建高效、安全且可扩展的应用后端。

q5r6s7的博客 66

精通iOS开发:The Complete Friday Q&A_ Volume I

在移动应用开发领域,特别是针对苹果生态的iOS平台,掌握Cocoa和CocoaTouch是每一位开发者不可或缺的基础技能。本章旨在为读者提供一个深入的技术概览,以便更好地理解后续章节中涉及的技术点。URL Loading System 是iOS中一个使用网络资源的重要机制,它允许应用加载远程URL的内容或者在应用之间共享数据。这一系统的底层是由CFNetwork框架实现的,但Cocoa提供了更高层次的抽象。在进行网络编程时,开发者通常会与URLSession和它的代理打交道。

weixin_36444661的博客 1149

Unity内存/GC优化方法

在某些脚本中,使用Invoke Repeating或者Coroutine来替代Update方法 Debug.log()会消耗很多性能,游戏完成后尽量去掉无用的Debug 减少Find,Component的使用 合理使用数据结构与算法 对于子弹等不断重复出现消失的物体使用对象池Object Pooling管理 减少拆箱代码 未完待续。。。 ...

enternalstar的博客 8506

sun_GC回收机制及内存等优化

sun_GC回收机制及内存等优化

不愧是疑问解决神器!你强任你强~

前言系列首发于公众号『前端进阶圈』,若不想错过更多精彩内容,请“星标”一下,敬请关注公众号最新消息。•在过去,我习惯用这种方式来阅读书籍或文章:先快速浏览一遍,然后再进行复读,并最终总结所学的知识点。然而,长期以来,我发现这种方式并不能满足我最初阅读的目的。我相信许多人也有相似的经历,我们阅读某些文章或书籍,要么是为了扩展知识面,要么是为了解决某个问题,或者是对某个话题产生兴趣。然而,事实上,我...

Immerse的 Blog 63

电商数据分析18——电商广告投放的数据分析与优化

在当今的电商行业中,广告投放是提高品牌知名度、吸引潜在客户和增加销售额的关键策略之一。随着市场竞争的加剧,仅仅依靠直观判断和传统方法已经无法满足广告投放的需求。数据分析在这里扮演了至关重要的角色,它可以帮助企业更准确地定位目标受众,评估广告效果,优化广告内容,从而提高广告效率和投资回报率(ROI)。

theskylife的博客 5703

用CentOS 7安装cadence搭建适合IC Design的科研环境(四)——IC617、MMSIM151、calibre2015安装过程step by step

以下操作都在root权限下执行。建立安装目录建议把这种大型软件装在/opt目录下。mkdir -p /opt/cadence/installscape mkdir -p /opt/mentor/Calibre2015其中-p参数是直接建立父目录。因为IC617和MMISM151会自己建立安装目录,所以在这里没有建相关目录。而calibre则是默认安装在安装包所在的目录下,所以需要提前建立。解压安

maxwell2ic的博客 7万+

开源项目推荐:Laravel Q&A

开源项目推荐:Laravel Q&A 1. 项目基础介绍及主要编程语言 Laravel Q&A 是一个使用 PHP 编程语言开发的问答社区应用,基于流行的 Laravel 框架构建而成。该应用旨在为用户提供一个类似于 Stack Overflow 的平台,可以提问和回答问题,促进开发者之间的交流与合作。 主要编程语言: PHP:项目主体语言,用于后端开发。 Vue.js:用于前端...

gitblog_00159的博客 369

详解STM32F407双重ADC同步采集与DMA传输的配置技巧及实战应用

本文详细解析了STM32F407双重ADC同步采集与DMA传输的配置技巧及实战应用。通过CubeMX配置、代码实现和常见问题解决方案,帮助开发者高效实现多通道数据同步采集,提升工业自动化和嵌入式系统的数据采集效率与精度。

ii567的博客 364

Q&A——性能优化(二)

性能优化 Q1:Draw Call和Setpass Call,这两个指标主要是看哪一个?关于这点众说纷纭,很多地方都是说看SetPass Call,但是在UWA的性能测试中,还是把Draw Call当成唯一指标。 在 Unity 5.x 中,SetPass Call与 Draw Call相比,SetPass Call的指标与性能相关性更大(比如Static Batchi

编程小生的专栏 1317

半导体物理-Si晶体生长方向<2>

Si(硅)晶体的生长方向是一个重要的概念,尤其在半导体工业中。这个概念涉及到晶体在生长过程中原子排列的方向,对晶体的性质和应用有重大影响。让我为您详细解释:理解Si晶体的生长方向对于半导体材料的研究和应用非常重要,它直接影响了最终器件的性能和制造工艺。在实际应用中,选择适当的生长方向可以优化器件性能,提高产品质量。

m0_37606066的博客 3001

基于STM32L4XX、HAL库的MAX13487EESA RS485总线收发器驱动程序设计

MAX13487EESA是一款3.3V供电的RS-485/RS-422收发器,由Maxim Integrated生产。PA4 (控制引脚) ---> /RE, DE (连接在一起)具有±15kV ESD保护的驱动器输出和接收器输入。半双工RS-485/RS-422通信。工业温度范围:-40°C至+85°C。工作电压范围:3.0V至3.6V。数据速率高达250kbps。

zhusl6688的博客 690

如何实现高效运维?来谈谈性能优化那些事(含直播回顾 Q&A)

数据库性能问题,常常是困扰DBA高效运维的难题之一。如何多角度地帮助DBA,找到“数据库慢”的原因,保证系统高效、稳定、安全地运行?

ToyaAkira00的博客 797

98DX3236内核编译过程小结

0.条件(1)Marvell技术支持提供的压缩文件:GNU EABI:arm-mv5sft-linux-gnueabi_SW3.2.tar.bz2.tar.bz2armebv7-marvell-linux-gnueabi-softfp_i686_201201.tar.bz2CPSS代码:Cpss-PP-DxCh-4.2_012.zipLinux内核文件:lsp-4.2_012.zipLSP-Uni...

snaking616 1807

前端性能优化(一)性能优化的指标和工具

前端性能优化(一)性能优化的指标和工具一.性能指标1. F12 network进行调试,我们以淘宝为例2. 此外还有一个瀑布流的概念 waterfall3.蓝线和红线4.保存当前网页指标,方便以后对比5.查看动画帧数6.异步请求的指标二. RAIL测量模型1.R\A\I\L含义2.RAIL评估标准指标三.性能测量工具1.我们常用的 Chrome DevTools2.webpagetest是什么怎么用怎么看3.lighthouse的使用 一.性能指标 1. F12 network进行调试,我们以淘宝为例 可

qq_25503949的博客 3万+

【优化模型】求解混合整数线性规划 MILP 问题

混合整数线性规划(Mixed Integer Linear Programming,MILP)是一类优化问题,其中目标函数和约束条件均为线性,并且包含整数变量。MILP 在实际应用中具有广泛的应用,可以解决很多实际问题,如生产调度、网络设计、资源分配等。f — 系数向量。系数向量,指定为实数向量或实数数组。intcon — 整数约束组成的向量。整数约束组成的向量,指定为正整数向量。intcon 中的值指示决策变量 x 中应取整数值的分量。A — 线性不等式约束。线性不等式约束,指定为实矩阵。

Fanjufei的博客 2501

2026年1至9月武汉市房地产价格深度分析报告

本报告基于2026年1月至9月武汉市实际成交案例,从成交价格、区域分布、户型结构、价格走势等维度进行深度分析。数据来源包括武汉市住房保障和房屋管理局备案数据、主要中介机构成交记录及典型楼盘网签案例,覆盖全市15个行政区及主要功能板块。

王国平的博客 336

IoTDB 常见问题 Q&A 第三期

关于 IoTDB 的 Q & A IoTDB Q&A 第三期持续更新!我们将定期汇总我们将定期汇总社区讨论频繁的问题,并展开进行详细回答,通过积累常见问题“小百科”,方便大家使用 IoTDB。Q1:查询最新值 & null 数据相加方法问题现象 1如果我想查 1000 个点的最新值,这些点的设备地址可能都不相同,那么我怎么查?解决方案1. from 后面可以写多个设备2. ...

qin_DB的博客 1330

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

性能优化随笔(一)

在软件开发过程中,一般要先实现功能方面的需求,功能方面的需求开发完毕之后,往往会考虑性能方面的优化。在业务发展的初期,性能往往能满足使用的需求,这时性能优化不是必不可少的。随着业务的发展,软件复杂度的提高,性能有时会成为瓶颈,这时性能优化是必须要做的工作。

weixin_38184628的博客 1883

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

【性能优化方法论系列】一、性能优化的本质

可能很多人没有认真思考过:“为什么我们需要进行性能优化?”这个问题。在我看来,性能优化是为了“解决良好的用户体验和资源的有限性之间的矛盾”。首先,我们性能优化一般都是追求更快的响应速度,通常最终目的是为了获得更好的用户体验。 这里所说的资源是广义上的资源,“资源的有限性”包括:资金成本的有限性,人力资源的有限性,服务器等硬件资源的有限性,时间的有限性(如为了抢占市场,希望尽早上线造成的压力)等。如果资源是无限的,如开发周期很长,投入的人力很多,服务器资源充足,甚至服务器内存是无限大的,那么设计出来的产品可能

悟鸣的技术博客 1687
上一篇: Q&A——骨骼优化
下一篇: Q&A——图形渲染(二)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值