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

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

性能优化

Q1:Draw Call和Setpass Call,这两个指标主要是看哪一个?关于这点众说纷纭,很多地方都是说看SetPass Call,但是在UWA的性能测试中,还是把Draw Call当成唯一指标。

请输入图片描述

在 Unity 5.x 中,SetPass Call与 Draw Call相比,SetPass Call的指标与性能相关性更大(比如Static Batching的开启不影响Draw Call数,而SetPass Call通常会明显下降)。但 SetPass Call在某些情况下也同样存在问题,比如往一个场景中添加任意个相邻且材质相同的大网格物体(使Dynamic Batching失效)时,SetPass Call并不会变化。因此在UWA中,我们所使用的是类似Profiler 中 Total Batches 这一项指标,通常该数值与 Frame Debugger 中的数值基本一致,因此可以通过该工具来查看每个Batch的内容,从而更有针对性地进行优化。


性能优化

Q2:我看到UICamera.Update()的GC调用特别高,只要我一移动就会产生2.8K的GC,看起来是NGUITools.FindInParents这个方法导致的,有没有什么可以优化的方法呢?
请输入图片描述
请输入图片描述

在 Editor 下,当调用GetComponent() 且 T组件并不在当前的GameObject 上时,确实会出现GC Alloc,但这在发布后是不会出现的,因此建议在真机上做一个验证。这是因为在Editor下,Unity的MissingComponentException实现所致,在出现以上情况时,Unity 并不是直接返回一个 NULL,而是返回一个代理 Object用来储存一些相关信息,在后续被访问时可以给出更详细的报错信息。

性能优化

Q3:这个批渲染是什么?好像开销很高 。
请输入图片描述

从图中看出,这是场景中不透明物体的渲染开销。建议研发团队对当时场景中的不透明物体(地形、建筑等)进行进一步检测,主要查看其三角面片数是否过高、Shader是否过于复杂等。

性能优化

Q4:GameObject.Instantiate()每实例化一个GameObject到场景中,会造成卡顿,有什么办法可以优化吗?就算我采用了异步加载,仍然会有稍许的卡顿感。除了缓存池,是否还有别的方法?

建议研发团队先通过Unity Profiler来确定该性能卡顿的位置。如果只是一个空的GameObject,Instantiate实例化是很快的。一般来说,Instantiate实例化时间较长,主要由以下三个原因:

(1)与资源的加载有关:对于这种情况,研发团度需要精简资源,或者预加载资源来降低实例化的开销;
(2)序列化信息比较多:当GameObject上的Component比较多时,其Instantiate实例化性能会受到影响,比如说粒子系统,这种情况就只能通过分帧实例化,或者通过缓存池来避免;
(3)自定义组件的Awake:在Instantiate实例化时,其GameObject上挂载脚本的Awake函数也会被触发,其中产生的CPU占用,也会被计算在Instantiate实例化内。

性能优化

Q5:关于GC优化,Unity官方文档中有如下两个推荐的方法,请问在手游上是否适用?(1)频繁GC,隔几秒主动调用一次,保证不需要的堆内存能够及时释放。适用于对内存总量较小的情况。(2)尽量避免GC,可以考虑先撑大内存。

上述两种方法在目前的移动游戏中并不适用。
(1)中频繁地调用GC是否会降低GC的CPU开销吗?理论上会,但实际上,即便是降低后的GC开销也会导致频繁的卡顿。下图为UWA上一款实际测评项目在红米Note2上频繁调用GC的开销。可以看到在红框处,其GC调用非常频繁,但是其CPU占用并没有因频繁调用而降低。
请输入图片描述
(2)中尽可能避免GC是非常推荐的,但撑大堆内存的方式是欠妥当的。最好的方式是通过降低不必要的堆内存分配来尽可能避免的GC的到来。UWA建议GC的调用频率应该在1000帧/次以上。具体的做法建议查看我们之前的技术推送:Unity内存的深度剖析。
请输入图片描述


性能优化

Q6:如下图所示,什么情况下会触发MaskableGraphic.Enable() ?现在我得到的结论是只要用到了Image组件,然后禁用启用带有这个组件的物体,都会触发进而产生GC。大家都怎么显示隐藏图片这种需求的,SetActive这种方式容易产生GC。
请输入图片描述
请输入图片描述

在UGUI中,Image组件并没有重写其父类的OnEnable函数,所以在激活时会出现MaskableGraphic.OnEnable。其中出现堆内存开销的话,通常是因为其父类函数Graphic.OnEnable中,UGUI在进行全局容器的Add等类似的操作时,遇到了扩容等产生堆内存的操作。

总之,在UGUI中,UI元素的激活和禁用所导致的堆内存分配,通常是不会持续出现的,其实不需要特别地处理。但对于其CPU开销,在UI元素数量较大时,依然是可观的,所以我们依然建议,对于激活禁用操作较为频繁的UI元素,可以尝试通过移出屏幕,缩放为0等方式来避免SetActive的调用。

性能优化

Q7:在一个场景中有很多小物件,例如花花草草之类的静止物体,造成Draw Call数量较高。在不想让美术重新出资源的前提下,我是想把相同模型的东西合并,然后把小贴图打成一个大的贴图,重新算UV。还有比这种方法更好的优化手段吗?

对于场景中的静态物体,可直接尝试通过Unity的Static Batching方式来进行网格的合批,可以有效地降低由于Draw Call(5.x下的Batches)带来的性能开销。当然,Static Batching的前提是网格模型的材质相同,所以不仅需要保证Shader一致,还需要将各自的小纹理合成大纹理,从而保证Static Batching的顺利进行。

同时,如果渲染的网格面数较高,可以通过SimpleLOD、SimplyGon等常用网格简化工具对其进行快速减面。

性能优化

Q8:我游戏场景里有些草,勾选了Batching Static 如下图:
0.png
查看FrameDebug可以看到已经生成了Static Batch:
请输入图片描述
按道理来说这是的DrawCall应该是2,但是查看Profiler的时候却显示Draw Call为7,这是怎么回事呢?
请输入图片描述

从Unity 5.0开始,Static Batching的合批机制就已经出现了变化,不再进行索引数组的合批,因此并不会使得Draw Call降低,而是会降低Batches和SetPassCall,因此从图中来看,Static Batching 开启后的统计数据是没有问题的。也因此,UWA在统计时,使用的就是Batches的数值。具体的原因可见Unity官方在论坛中的回复:
https://forum.unity3d.com/threads/regression-feature-not-bug-static-dynamic-batching-combining-v-buffers-but-not-draw-calls.360143/

性能优化

Q9:求教一个屏幕后处理的问题。我们期望角色不受屏幕后处理影响,所以目前采用双相机的方案,根据Layer划分,但是这种情况下角色的影子也就没有办法投影到地表上,请问这种需求有什么好的实现方式?

可以尝试根据地表模型的局部细节来动态生成接受阴影的网格(比如Fast Shadow Receiver插件),这样既可以保证地表模型进行屏幕后处理操作,同时也可以生成相关角色的动态阴影。


性能优化

Q10:我的项目在一帧中进行实例化操作时,会产生大量的GC Alloc,请问这是为什么?我又该如何避免呢?
请输入图片描述

Unity引擎的Instantiate操作本身是会触发少量的堆内存分配,从图中数值可以看出,该堆内存分配过大的主要原因可能有以下两点:

  1. Instantiate在该帧中调用次数过多,从图中可以看到,在一帧中Instantiate实例化操作被调用128次;

  2. Instantiate实例化后,其GameObject身上的代码组件在执行Awake函数和构造函数(.ctor)时也很有可能产生堆内存,从目前的1.3MB堆内存来看,很有可能是这种原因。

对此,建议研发团队在Unity Profiler中直接查看Instantiate的自堆栈信息,即可定位其具体的堆内存出处。


Unity中解决Instantiate实例化物体卡顿问题 一:前言 二:解决方法 三:协程中几种yield reutrn的执行顺序 using UnityEngine; using System.Collections; public class Test : MonoBehaviour { private void Start() { StartCoroutine(WaitForNull()); StartCoroutine(WaitForEndFrame()); StartC.. 阅读详情

相关推荐

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

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

mqtt6iot的博客 48

Draw Call(Unity 5中显示为SetPass calls

Draw Call(Unity 5中显示为SetPass calls 转载于:https://www.cnblogs.com/jiahuafu/p/6705130.html

weixin_30734435的博客 118

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

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

q5r6s7的博客 66

Unity3D研究院之利用缓存池解决Instantiate慢的问题(七十三)

Unity3D研究院之利用缓存池解决Instantiate慢的问题(七十三)  雨松MOMO 【Unity3D研究院之游戏开发】 围观8072次 20条评论 编辑日期:2014-07-18 字体:大 中 小 Unity3D做项目有三个地方处理不好游戏整体就会出现卡顿的问题。 1.NGUI直接打开界面卡,建议看看我之前写的这一篇文章 http://www.x

laipixiaoxi的专栏 2146

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

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

weixin_36444661的博客 1149

Unity中Instantiate实例化物体卡顿问题的解决

本文实例为大家分享了Unity中Instantiate实例化物体卡顿问题的解决方法,供大家参考,具体内容如下 一、前言 当在执行多次Instantiate实例化物体时,会卡顿严重甚至在移动端会导致程序崩溃 因为Instantiate会产生大量的GC,使CPU过高,导致崩溃 下面是一段测试代码:当我们按下按键时实例化100000个预制体 using UnityEngine; public class Test : MonoBehaviour { public GameObject prefab; private void Update() { if (Input.GetKeyDown

Unity 性能优化之SetPass calls和betches

SetPass calls是什么,简单讲就是切换材质球,(小伙伴大惊,这么解释简单的有点过分!) 首先得理解setpass call于drawcall batch 的区别以及定义,一次cpu把数据交给gpu处理叫一个drawcall。draw位于setpasscall 和batch中。使用相同材质信息draw call 才能放到一个batch中。一个材质球引用的shader可以有多个pass,因...

liuyongjie1992的博客 8493

CMap数据库实战:从基因表达谱到药物重定位的可视化分析

本文详细介绍了如何利用CMap数据库进行药物重定位的可视化分析。通过实战演示,从差异基因列表准备、CMap查询参数设置,到结果筛选与高级可视化(如热图与OncoPrint风格图),系统讲解了从数据到洞察的全流程,并提供了关键的解读与验证指南,帮助研究者高效挖掘老药新用的潜力。

mango的博客 589

开源项目推荐:Laravel Q&A

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

gitblog_00159的博客 369

SPWM波调制度原理

SPWM波调制度原理

qq_43557686的博客 1万+

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

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

ToyaAkira00的博客 797

WorldPop数据集

WorldPop数据集介绍

qq_43874102的博客 1万+

IoTDB 常见问题 Q&A 第三期

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

qin_DB的博客 1330

CoppeliaSim远程API实战:用Python控制仿真机器人,5步搞定外部通信

本文详细介绍了如何使用Python通过CoppeliaSim远程API控制仿真机器人,实现外部通信的5个关键步骤。从环境配置到双向通信模式,再到实战案例和性能优化技巧,帮助开发者高效连接算法开发与物理验证。特别对比了B0与传统API的性能差异,提升工业自动化项目的开发效率。

weixin_28733637的博客 369

AutoSAR系列讲解(深入篇)13.6-闪烁一颗LED灯 6

闪烁一颗LED灯:配置SWC和生成代码

雪云飞星的博客 1万+

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

性能优化 Q1:请问怎么优化下图这两者的GC Alloc?每次AddComponent 都会有这么多的开销。 图中的两项GC Alloc是在进行AddComponent时不可避免的,因此只能通过尽量减少AddComponent的调用次数来进行优化。

起个名字好难啊 733

MATLAB计算干旱指标:SPI、SRI、SWAP、DWAAI、EDI等

简介各种干旱指数以及其MATLAB代码实现

WW、forever的博客 2万+

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

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

起个名字好难啊 884

选型不再靠感觉:一文看懂 SAP Event Mesh 与 SAP Integration Suite, advanced event mesh 的能力边界

本文对比分析了SAP Event Mesh与SAP Integration Suite, advanced event mesh的差异。SAP Event Mesh适合轻量级场景,主要用于SAP系统间异步通信,支持AMQP、MQTT等协议,消息大小限制为1MB。而advanced event mesh面向企业级事件网络,提供跨云/本地部署、事件治理、监控等高级功能,支持30MB消息和更大存储容量。选择时需考虑业务规模、实时性要求、治理需求等因素:单一SAP生态内扩展可选Event Mesh;跨区域、多云环境

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 135

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

【Q&A】QT信号槽底层是怎么实现的?

Qt信号的底层实现通过元对象系统提供动态元数据支持,MOC编译器生成类型安全的映射代码,结合事件队列和线程调度机制实现高效通信。其核心优势在于松耦合、跨线程支持及编译期类型检查,但也需注意性能敏感场景下的优化。

Antonio915的博客 1098

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Mysql Q&A

1.MySQL在远程访问时非常慢的解决skip-name-resolve 并且出现Reading from net  方法:my.cnf里面添加  [mysqld]  skip-name-resolve 2.查询下设置最大值  SHOW VARIABLES LIKE '%max_allowed_packet%';  my.cnf的外层配置文件mysqld_safe_syslog

独妖ヅ博客 353

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Q&A:笔记本如何选?

Q&A:笔记本如何选? 选购笔记本的几大重要参数 笔记本选购几大重要硬件参数:CPU、显卡、内存、硬盘、主板 选购笔记本除了硬件参数还要关注品牌售后,质量,对性能的发挥。 品牌 1线:华硕(包括ROG)、惠普、戴尔、联想、华为 2线:微软,雷蛇 ,微星,技嘉,宏碁、神舟,机械革命 推荐购买华硕、惠普等一线品牌的电脑,近年DELL品控不是很稳定,一线品牌电脑品质比较稳定,使用比较有保障,也要了解笔记本的性能优化及发挥。 CPU CPU最低要求在intel i5-8400H以上,推荐选择当前性价比最高A

hguvtg的博客 434

landashu/easyai-plus智能对话Q&A系统详解

EasyAI-Plus智能对话Q&A系统是一个基于EasyAI框架构建的企业级问答解决方案,集成了自然语言处理、机器学习训练和智能对话功能。该系统采用Spring Boot + Vue.js技术栈,提供了完整的问答数据管理、模型训练和API服务能力。 ## 系统架构 ### 技术架构图 ```mermaid graph TB A[前端Vue.js] --> B[Spring Boot...

gitblog_00638的博客 1018
上一篇: Q&A——资源管理(八)
下一篇: Q&A——资源管理(九)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值