(转)角色与动画的性能优化 | UnrealFest演讲干货
八、蓝图
8.1. Tick
优化的重点关注对象——Tick事件。在不需要的情况下,请默认关闭Tick。
在蓝图中Actor上关掉还不行,Component也需要关掉。
在CPP中,我们可以从PrimaryActorTick或PrimaryComponentTick中关闭Tick。
如果需要Tick,考虑一下是否时时刻刻需要Tick。如果不需要就可以调整Tick Rate。
在CPP中,也是在PrimaryActorTick或PrimaryComponentTick中调整Tick Rate。
执行dumpTicks指令可以输出现在在Tick的事件有哪些。
8.2. 解决硬引用
引用如果处理不当也会出现大问题,这会导致资产拖着一堆引用,导致加载不畅或者内存占用高。当我们打开Size Map就能看到资产的硬引用,加载第三人称角色蓝图意味着要加载上Size Map上显示的这些资产。
举一个反面案例,这是硬引用处理不当导致的。加载角色的时候加载多了一些载具相关的东西。
这是因为角色蓝图里有一个载具类引用的变量,或者Cast To了载具类。
如何处理Cast就很重要了,首先如果我们确实需要用到某个类,放心Cast,比如角色与动画蓝图之间的Cast。
并且我们可以用检查类替换Cast。
但如果我们真的需要用到类里面的逻辑怎么办?可以试试用接口。
当我们创建了一个蓝图接口,并且加入了我们需要的函数,就可以在Object中实现我们的接口。
然后在蓝图中实现它即可。
这样我们就用接口代替了Cast调用了函数。
8.3. 软引用
虚幻5.4可以将变量调整成软引用。
旧版本中我们需要这么调整。
软引用能做的东西不多,并且我们在使用它之前得将它加载成硬引用。Blocking节点会阻塞游戏线程,而Async节点会异步完成加载任务。
要注意的是,以上这些节点加载出来的引用会卡在蓝图的生命周期里,不会被垃圾收集处理,在加载完,完成了对应的任务之后,推荐用一个Set Object Reference (by ref)节点清掉这个引用,让垃圾收集处理它。
8.4. 子蓝图
我们一般会将角色蓝图的子蓝图作为角色的变体,修改里面的网格体和里面的一些参数。这个例子是用Quinn的主蓝图生成了一个Mannequin的子蓝图。
当我们打开子蓝图的Size Map就会发现,它加载上了主蓝图中的Quinn骨骼网格体。
这种情况下,需要将主蓝图中的网格体或者其他一些硬引用去掉。
然后再创建两个子蓝图,分别对应Quinn和Mannequin。这样两个子蓝图就会只加载自己对应的引用资产。
结语
这次分享真的干货满满,门槛很低,但能解决不少优化问题。LOD、纹理、骨骼网格体、蓝图等等一应俱全,全方面解析了角色与动画方面的性能问题,并分享了对应的解决方案。
前言
在平时我们进行游戏开发的时候,经常会围绕着角色与动画这两元素进行整体的开发工作,因此角色与动画的性能优化将重中之重,因为他们决定着游戏的游玩体验。今天将与大家分享一些角色与动画方面的性能优化经验,帮助大家在开发过程中提高游戏性能,并且尽可能照顾有着不同知识储备的开发者。
本文出自https://www.youtube.com/watch?v=N_suMyUuork,讲者是Matthew Lake。
一、常用的知识
1.1. 常用命令
Stat FPS显示帧率与帧用时。
Stat UNIT显示各种帧用时,游戏线程与GPU耗时等。
Stat UNITGRAPH将以图表显示Stat UNIT中显示的数据。
Stat ANIM显示动画相关的耗时统计数据
ShowDebug ANIMATION显示动画相关的Debug内容,角色包围盒,当前动画节点的权重等。
1.2. Size Map
Size Map(尺寸图)用来看资产的引用、加载该资产所需要的磁盘大小与内存大小。
1.3. MemReport
游戏运行中打这个命令可以输出一份当前内存加载了的资产。
1.4. Control Rig
如果您正在用Control Rig,可以在Control Rig的类默认中找到Show Node Instruction Index、Show Node Run Counts、Enable Profiling选项,打开之后就会发现我们的Control Rig视图像圣诞树一样亮起了灯。红箭头的数值就是当前Control Rig所需要的耗时。
在节点上也能看到耗时和节点的序号。
1.5. GPU Visualizer
在PIE中按“Ctrl + Shift + 逗号”组合键可以呼出一个GPU Visualizer工具,它可以列出GPU帧耗时的详细信息。
1.6. Insights
强烈推荐用Insights,这是个很棒的内置性能追踪工具。
如果我们要记录一些动画相关的性能追踪,需要在通道里勾选Animation、AssetLoadTime和Stat Named Events选项。
在PIE运行中可以随时打开追踪,玩一段时间然后结束追踪,就能记录下一段时间内的性能表现,在Insights中打开对应的记录文件就能看到详细信息。
二、动画序列
2.1. 资产检查
项目内的动画序列一般会有成百上千个,所以注意一些小细节就能搞定大优化。在动画序列的导入中,尽可能只导入必要的东西。在Animation Track的导入中,假如我们不需要脸部动画数据就不必要将其导入。
然后就是Animation Curves,我们会在DCC中加上一些编辑器内用不到的动画曲线,所以确保导入后删除掉这些不必要的动画曲线。
在检查动画序列资产中经常会用到这个Track Data数组,我们可以在这里看到动画序列采样了哪些骨骼。
2.2. 编辑器工具
我们可以编写资产操作工具去帮助我们快速编辑或者显示资产的信息。
以下是示例函数的基本逻辑,帮助我们输出当前动画序列的轨道条数或者命名。我们可以利用这个快速检查动画序列的轨道数,以便于我们调整和优化这些资产。
2.3. 导入设置
可以在导入的时候就避免从源文件导入曲线。
一个个调整会很痛苦,所以我们可以让引擎记住我们的导入设置。在这里修改配置文件。
2.4. 轨道与曲线处理结果
当我们完成以上的清理轨道与曲线工作时,就能看到这个动画序列磁盘与内存占用都得到了很大的优化。上文也提到过动画序列在项目中可能有成百上千个,以此积跬步至千里,整个项目的动画序列将会有很可观的磁盘与内存占用的优化。
不仅如此,在Anim Graph中也会有相当不错的优化,因为节点之间的信息是一级一级传递下去的。减少了轨道与曲线数量,传递下去的数据就会变少,处理就会变得更快。
2.5. 动画压缩
在虚幻5.3及以上版本中,动画压缩库(Animation Compression Library)是默认开启的,如果低于这个版本,就需要在虚幻商城中下载使用。
传送门:https://www.unrealengine.com/marketplace/en-US/product/animation-compression-library
三、LOD
大家对于LOD应该不陌生,这里便简单说说。Level of Detail是一种处理网格体远近细节程度的技术,如果网格体离得远,就会显示更低细节的模型。而对于骨骼网格体而言,LOD的不同,骨骼数量,变形目标也会有所不同。
在虚幻内可以直接生成静态网格体和骨骼网格体的LOD,由于本文着重介绍角色,所以我们重点放在骨骼网格体上,感兴趣的小伙伴可以自己了解一下静态网格体的LOD生成。
骨骼网格体的LOD生成可以在编辑器内调整,LOD数量代表我们将自动生成几个LOD。
LOD设置可以调整更多关于LOD生成的细节参数。使用数据资产储存这些的好处就是,我们可以给很多个骨骼网格体上同一种参数,这样我们就不用反复设置了。
我们来到数据资产看看这些参数。
3.1. 屏幕大小
屏幕大小顾名思义就是在屏幕上小于这个值就会使用这个LOD,以此类推其他LOD。
使用A.VisualizeLODs 1指令可以绘制出具体的网格体信息。
3.2. LOD滞后阈值
由于骨骼网格体有动画,角色在动的时候,即使相机是静止的,角色的屏幕大小也会不断变化。这时候就需要一个滞后阈值来防止这种LOD来回切换的现象。
有了这个阈值之后,我们处理LOD的曲线就会变成这样。这样LOD来回切的问题就解决了。
3.3. 骨骼列表
骨骼列表可以帮助我们剔除LOD中不需要的骨骼。有两种模式,去除列表中的骨骼和保留列表中的骨骼。
举个例子,我想在LOD1去除脸部骨骼,在LOD2只保留身体骨骼等等。
3.4. 减面设置
减面设置实际上是一个大类,里面有很多参数,这里只会介绍几个重要的参数。
是否重映射变形目标:由于变形目标很耗性能,所以只会在必要的时候启用这个选项。
最大骨骼影响:一个顶点可能被多个骨骼影响,降低这个值可以减少骨骼数。
除了以上两个以外,还有很多设置,大家可以随意调整参数自行查看结果,找找感觉。
在虚幻5.5中,Nanite即将支持骨骼网格体,但LOD技术仍然重要,在一些不支持Nanite的平台或者需要极度优化的项目中还会用到。
四、动画蓝图
4.1. 多线程
为项目中的动画蓝图启用多线程支持。
为动画蓝图启用多线程支持。
需要注意,如果动画蓝图用了根动画,这个动画蓝图将不会启用多线程运行。
启用了多线程的动画蓝图将支持线程安全更新动画节点,可以把我们的更新逻辑放在这里。
4.2. Fast Path
当我们看到这些闪电标志时意味着这些节点用了Fast Path。如果没有,就会用回动画蓝图VM,这个过程相较于Fast Path会慢一些。
在这里启用相关设置。
如果我们想避免回退使用VM,可以打开这个Warning设置,提醒我们哪里回退了。
可以直接读本蓝图的变量,但不要读引用的变量,这样会导致回退。
用Property Access节点可以进入Fast Path。
And和Or节点,计算后结果也会导致回退,尽量将参数直接接入。
那如果我真的需要计算呢?看下面的动画蓝图函数。
4.3. 动画蓝图函数
在节点中使用这些函数,可以拿变量进行计算。这些函数只会在节点运行的时候执行。
或者使用Call Function节点,这个节点可以直接放在动画流程图中,并且有更多的事件触发时机选择。
需要注意的是,这些函数需要线程安全才能运行,在蓝图中可以打开这个选项。
使用例如下,这样就能保证节点进入Fast Path了。
4.4. 动画蓝图LOD
选择节点,调整节点的LOD阈值,就能保证节点只会在对应的LOD及更高细节的LOD上播放。使用这个节点可以进一步优化远距离角色的动画蓝图处理表现。
我们还可以获取当前骨骼网格体LOD来驱动动画蓝图的逻辑。比如动画蓝图会在LOD等于1时播放某个动画等。
虚幻5.3中更新了后期处理动画蓝图的LOD阈值,与上述的LOD阈值类似,在某个LOD层级以后不再启用后期处理动画蓝图。
4.5. 优化小技巧杂项
不要重复使用空间转换节点,将他们绑在一起使用,避免反复转换空间。
状态机可以自定义一些状态转换参数,优化状态机的消耗成本。
缓存了姿势就能在多个地方中继续使用这个姿势,状态机也可以缓存。
五、骨骼网格体姿势更新
5.1. 是否更新
即使我们看不见骨骼网格体,它仍然会更新姿势,所以我们需要设置下图这个参数,调整骨骼网格体的姿势更新行为。
我们可以调整项目配置文件来调整骨骼网格体组件中的这个默写值,但这个不适用于骨骼网格体Actor。我们可以自己手动设置这个值来应对一些需要特殊处理的情况。
或者在源码中设置这个值。
除此之外还有一个参数叫No Skeletal Update,顾名思义用来控制是否更新骨骼网格体。
5.2. 更新频率
我们可以在骨骼网格体组件中打开更新频率相关的参数功能。
虚幻引擎会自动控制跳过的帧,但如果想要手动控制跳过的帧,可以在商城使用这个插件。
传送门:https://www.unrealengine.com/marketplace/en-US/product/update-rate-optimisation-blueprint-nodes
这个插件有两个模式,一个是LOD模式,一个是屏幕大小模式,可以通过对应的参数设置跳过的帧数。当我们启用了插值,就算跳过了一些更新帧,看起来与原来的没多大区别。
5.3. 受预算控制的骨骼网格体组件
虚幻自带一个Animation Budget Allocator插件,可以将骨骼网格体组件替换成这个插件提供的SkeletalMeshComponentBudgeted类,然后在Begin Play中执行这些。
在场景中执行这个指令a.Budget.Debug.Enabled 1可以打开Debug绘制。
用这个节点就能调整我们希望达到的预算,然后插件就会自动帮我们管理骨骼网格体的优化,比如调整跳过的帧等参数。这个结构体里还有更多参数,感兴趣的小伙伴可以自行探索。
六、纹理
我们常见的纹理分辨率基本都是2的幂,这是肯定的,因为要自动生成MipMap。但我们有注意过这些不同大小的纹理之间有什么倍数关系吗?看看这张图,假如我们能优化纹理分辨率大小,将能极大优化我们的磁盘空间与内存占用。
6.1. 限制纹理分辨率大小
在编辑器内,我们可以用高清的纹理,并通过调整这个值,就能在烘焙的时候将纹理限制到对应的分辨率大小。
还是和上面一样,我们可以调整全局设置。可以看到这里会为不同的纹理组设置不同的参数,找到想要修改的地方设置即可。
推荐用矩阵批量修改资产,将角色纹理都设置成对应的角色纹理组。
6.2. Micro Detail
细节纹理容易在压缩纹理之后丢失掉,看起来会很糊。
所以我们可以将这些细节纹理用Shader的方式呈现,比如在材质中Tiling这些细节纹理,而不是将细节纹理烘焙在主纹理上。
6.3. 纹理压缩
虚幻的默认压缩是下图这两个。在导入纹理的时候,虚幻会尽可能自动检测纹理到底该用哪个压缩方式,但有时候可能会出错,因为我们有些纹理可能不需要Alpha通道。
用Compress Without Alpha去掉Alpha通道即可。
Alpha通道剔除对比如下。
压缩算法的编码不同导致储存大小不同,对比如下图。如果我们的磁盘与内存真的不够,就需要重点考虑哪些纹理确实不需要Alpha通道,哪些纹理不需要高精度的颜色表现了。
有时候我们只需要单通道纹理,这时候G8压缩方法就比较好,这个方法会只留下Red通道。所有这些压缩方法可以在纹理的细节面板中调整。
6.4. Oodle编码
我们在打开纹理编辑器的时候可能就已经见过这个藏在角落的Oodle面板了,但这个东西到底有什么用?
这个面板可以让我们调整相关的纹理编码参数,当我们调整出了一个看起来很满意的参数之后就可以在BaseEngine配置文件中修改全局默认值了。
6.5. 通道合成
一个很常见的例子就是将AO遮罩、粗糙度遮罩和金属度遮罩合并成一张RGB纹理。我们甚至还可以加多一张Emissive或者别的什么遮罩放在Alpha通道里,随我们喜欢。这样我们就可以在材质中减少纹理采样,优化纹理复杂度。
在权衡了纹理质量的前提下,想要追求极致优化,可以合成法线纹理。首先我们需要将法线纹理的压缩设置改回默认,然后在材质中这么写。这样我们就可以往法线纹理的B通道中加东西了。
注意!这种方案非常影响纹理的质量,下图是结果,请权衡好质量与优化。
6.6. 蒙版
大部分人会以为只能往RGBA纹理中塞4种蒙版,但其实我们可以往里面塞9种蒙版!
七、骨骼网格体组件
7.1. 包围盒
骨骼网格体组件还有更多参数设置。我们在更新骨骼网格体时会更新它的包围盒,包围盒的更新我们也可以进行一些调整。执行ShowFlag.Bounds 1可以显示组件的包围盒,这个可以帮助我们Debug。
上文提到过,骨骼网格体可以跳过更新帧,然后通过插值对骨骼变形进行平滑。而包围盒的更新也可以跳过更新帧,并且不在平滑后更新。将包围盒更新模式调整成Skip Bounds Update When Interpolating即可。
因为遮蔽剔除和相机剔除都是用包围盒计算的,假如包围盒进入剔除范围,这个组件就不会被渲染。骨骼网格体组件可以固定包围盒,但存在一定的风险,它可能会在应该渲染的时候不渲染。当然,如果确定我们的角色不会超过这个包围盒,我们就可以放心使用固定包围盒。
如果我们采用了模块化角色方案,可以调整成使用父项骨骼网格体的包围盒模式。
以上这些设置能在这里找到。
7.2. 渲染静态
假如我们有一个骨骼网格体,但是它在游戏内不需要动画,这时候这个Render Static选项就很有用。并且这个选项可以在游戏内自由调节。
7.3. Nanite小妙招
现在Nanite骨骼网格体还没出,但我们可以用点小伎俩。比如我们可以导入一个只有单个三角面的骨架(因为虚幻不允许导入没有面与蒙皮的骨骼网格体),然后将这个三角面关掉。
导入一些静态网格体,静态网格体可以用Nanite,然后再将他们绑定在骨架上。
这样我们就得到了一个“Nanite骨骼网格体”,这非常适用于各种刚性的骨骼网格体上。
相关文章:
(转)角色与动画的性能优化 | UnrealFest演讲干货
八、蓝图 8.1. Tick 优化的重点关注对象——Tick事件。在不需要的情况下,请默认关闭Tick。 在蓝图中Actor上关掉还不行,Component也需要关掉。 在CPP中,我们可以从PrimaryActorTick或PrimaryComponentTick中关闭Tick。 如果需要Tick&…...
小程序云开发-环境配置
如果点 云开发 没有反应,需要修改软件安装目录不要有中文,但软件名可以是中文: 首次使用,会送1个月的云开发,配置后要等10分钟以后,才可以使用 如果不能选择环境,关掉重新打开一次。 然后记…...
【c++】【STL】priority_queue详解
目录 priority_queue的作用priority_queue的接口构造函数emptysizetoppushpopswap priority_queue的实现仿函数(函数对象)是什么?向上调整算法(adjustup)向下调整算法(adjustdown)迭代器构造pus…...
C语音中的三元运算符
一、三元运算符的基本语法 三元运算符,也被称为条件运算符,是 C 语言中唯一有三个操作数的运算符。它的语法格式为:condition ? expression1 : expression2。从语法结构可以看出,三元运算符由一个条件表达式和两个普通表达式组…...
C++模板知识
目录 引言 一、非类型模板参数 二、类模板的特化 (一)概念 (二)函数模板特化 (三)类模板特化 1. 全特化 2. 偏特化 (四)类模板特化应用示例 三、模板的分离编译 …...
MCP 探索:微软 Microsoft MarkItDown MCP ,可把 Word、Excel 等转换成 MarkDown 格式
简简单单 Online zuozuo: 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo :本心、输入输出、结果 简简单单 Online zuozuo : 文章目录 MCP 探索:微软 Microsoft MarkItDown MCP ,可把 Word、Excel 等转换成 MarkDown 格式…...
文本中地理位置提取方法—正则和NLP模型
这里写目录标题 一、提取地址列后12个字二、正则表达式删除不需要的文本三、保留关键字并删除之后的字四、相似度计算,查重五、去重 大量的文本中识别数据,要充分考虑效率和准确率。本文的方案是通过正则和NLP门址模型联合识别的方案。 首先利用现有粗略…...
AI大模型-RAG到底能做些什么?
RAG常见的应用场景,有以下几个方面: 1.智能客服系统:比如电商领域,对客户提出的常见问题,进行自动回复。减少人力成本。 2.人力资源管理:一个新的员工,入职一家大型公司,公司中有各…...
【算法基础】冒泡排序算法 - JAVA
一、算法基础 1.1 什么是冒泡排序 冒泡排序是一种简单直观的比较排序算法。它重复地走访待排序的数列,依次比较相邻两个元素,如果顺序错误就交换它们,直到没有元素需要交换为止。 1.2 基本思想 比较相邻元素:从头开始…...
Nginx搭建test服务器
创建test域名 进入阿里云添加解析 创建域名:test.xxxxx.com 服务器复制项目代码 新建目录,Git拉取项目代码,安装上插件包 修改配置文件,启动测试服务 修改配置文件“服务器接口” 开启服务pm2 start app.js --name "t…...
依赖倒置原则
当然可以!这次我们来详细讲解 依赖倒置原则(DIP: Dependency Inversion Principle),它是 SOLID 五大设计原则中的压轴,也是最关键的“架构型原则”。 我将从: 什么是依赖倒置原则(定义&#x…...
PostgreSQL 的 VACUUM 与 VACUUM FULL 详解
PostgreSQL 的 VACUUM 与 VACUUM FULL 详解 一、基本概念对比 特性VACUUMVACUUM FULL定义常规维护操作,清理死元组激进重组操作,完全重写表数据锁级别不阻塞读写(共享锁)排他锁(阻塞所有操作)空间回收只标记空间为可用,不返还OS空间返还操作…...
SQL面试题——留存分析之使用bitmap 计算留存
使用bitmap 计算留存 之前我们说过,留存分析其实在企业数据分析中,是很基础但是也很重要的,留存分析可以反映产品的发展是否健康,是否可持续发展,之前我们介绍过,可以看看之前的文章 SQL面试题——留存分析 因为使用工具的限制,所以我们实现方式也会有所不同,之前我们…...
P2415集合求和 题解
P2415 集合求和 题解 公式推导: 设集合有 n 个元素,记为 a 1 , a 2 , … , a n a_1, a_2, \dots, a_n a1,a2,…,an。 每个子集要么包含某个元素,要么不包含。 我们固定某个元素 a k a_k ak,再从剩下的 n − 1 n -…...
【2025年五一数学建模竞赛】C题 完整论文 模型建立与求解
目录 2025年五一数学建模竞赛 C题完整论文:建模与求解 Matlab代码一、问题重述二、模型假设与符号说明2.1 模型基本假设2.2 符号说明 问题一:预测博主新增关注数问题二:预测用户的新关注行为问题三:预测用户在线状态及互动博主问题…...
wpf 输入框 在输入时去除水印
wpf ScrollViewer 在输入数据时去除水印 在WPF(Windows Presentation Foundation)中,ScrollViewer控件通常用于显示滚动内容。如果你想在ScrollViewer中使用数据输入(例如文本输入),并且希望在输入时去除水…...
数字智慧方案5857丨智慧机场解决方案与应用(53页PPT)(文末有下载方式)
资料解读:智慧机场解决方案与应用 详细资料请看本解读文章的最后内容。 随着科技的飞速发展,智慧机场的建设已成为现代机场发展的重要方向。智慧机场不仅提升了旅客的出行体验,还极大地提高了机场的运营效率。本文将详细解读沃土数字平台在…...
C语言-指针(二)
一级指针 一级指针指的是存储了变量地址的指针 一级指针的变量类型是 类型 * 一级指针的类型与变量的类型有些不同 例:int * p 前面的int * 是该地址的类型 int a 0; int * p a; 这里的指针 p 就是一级指针 二级指针 指针变量也是变量因此也会有地…...
React 组件prop添加类型
给函数的props做注解 import { useState } from reacttype Props { className:string,title?:string } // 自定义一个Button组件 function Button(props:Props){// 解构出classname\const {className} propsreturn <button className{className}>点击我</button&g…...
Spring Boot中集成Guava Cache或者Caffeine
一、在Spring Boot(1.x版本)中集成Guava Cache 注意: Spring Boot 2.x用户:优先使用Caffeine,性能更优且维护活跃。 1. 添加依赖 在pom.xml中添加Guava依赖: <dependency><groupId>com.google.guava</groupId&…...
全感官交互革命:当 AI 大模型学会 “看、听、说、创”
引言:从 “文字对话” 到 “全感官体验”,AI 正在重塑人类认知边界 当 AI 不再局限于文本对话,而是能 “看懂” 图像、“听懂” 语音、“生成” 视频,并将这些模态无缝融合时,一场关于人机交互的革命已然开启。DeepSe…...
Linux 库文件详解
Linux 库文件详解 一、库文件概述 库文件是预先编译好的方法的集合,它为程序员提供了一种方便的方式来复用代码。在 Linux 系统中,主要有两种类型的库文件:静态库和共享库。 静态库(.a 文件) 使用静态库࿰…...
蒙特卡罗方法(Monte Carlo Method):基于随机采样的数值计算与模拟技术
核心思想 蒙特卡罗方法通过随机采样和统计模拟解决数学、物理、工程等领域的复杂问题,其核心是利用大数定律——当样本量足够大时,样本均值会收敛于期望值。 关键特点: 无维度诅咒&#x…...
HTTPS协议:更安全的HTTP
目录 1. 前言 2. HTTP 与 HTTPS:安全的分水岭 2.1 HTTP 的安全隐患 2.2 HTTPS 的安全提升 3. HTTPS 的核心概念 3.1 加密三剑客:对称加密、非对称加密与哈希算法 3.2 SSL/TLS 握手过程:建立安全通道的关键步骤 3.3 数字证书ÿ…...
Flutter BottomNavigationBar 详解
目录 一、引言 二、BottomNavigationBar 的基本用法 三、主要属性 1. 基本配置 2. 导航项配置 3. 导航类型选择 四、高级功能实现 1. 结合 PageView 实现滑动切换 2. 添加徽章提示 3. 自定义凸起按钮(FAB融合) 4. 渐变背景实现 五、自定义 B…...
吴恩达深度学习作业 RNN模型——字母级语言模型
一. 简单复习一下RNN RNN RNN适用于处理序列数据,令是序列的第i个元素,那么就是一个长度为的序列,NLP中最常见的元素是单词,对应的序列是句子。 RNN使用同一个神经网络处理序列中的每一个元素。同时,为了表示序列的…...
数字时代,如何为个人信息与隐私筑牢安全防线?
首席数据官高鹏律师团队编著 在当今数字化时代,个人信息和隐私保护至关重要。我们在享受数字生活带来的便利时,也面临着个人信息泄露、隐私被侵犯的风险。下面将从先进技术和法律途径两个方面,探讨如何严格保护个人信息和隐私。 一、先进技…...
javascript交换值最好三种
代码 1. 位运算(性能高,但只能用于整数) var a15; var b32; console.log(a) //15 console.log(b) //32 a a ^ b; b a ^ b; a a ^ b; console.log(a) //32 console.log(b) //152. 数组结构(性能高,但要ES6) var a15; var b32; console.log(…...
C++-Lambda表达式
目录 1.什么是 Lambda? 2.例子:打印每个元素(和 for_each 一起用) 3.捕获外部变量(Capture) 3.1. 捕获值(拷贝):[] 3.2. 捕获引用:[&] 3.3. 指定捕…...
逻辑回归的多分类实战:以鸢尾花数据集为例
文章目录 引言:从二分类到多分类一、多分类问题无处不在二、One-vs-All策略揭秘1. 核心思想2. 数学表达 三、鸢尾花分类完整实现1. 环境准备2. 数据加载与探索3. 数据预处理4. 模型训练与评估5. 决策边界可视化 四、关键参数解析五、总结 引言:从二分类到…...
[面试]SoC验证工程师面试常见问题(一)
SoC验证工程师面试常见问题(一) 摘要:在面试 SoC 验证工程师职位时,面试官通常会重点考察候选人对 SystemVerilog 和 UVM (Universal Verification Methodology) 的掌握程度,因为这两者是现代 IC 验证的核心技能。以下是可能会被问到的常见问题,涵盖 SystemVerilo…...
传统银行服务和 区块链支付无缝融合的一种解决方案
Dragonfly Capital 的合伙人 Alex Pack 曾表示:“DeFi 的目标是重构全球银行体系,并打造开放且无须许可的经营环境。”在 DeFi 的金融世界中,加密资产架构在区块链上,通过各个协议实现资产之间的高效转移和价值的实时流通,如 Metamask 钱包的自托管,Uniswap 的资产交易,…...
大语言模型能力评定探讨
有标准答案的评估(选择题) 评估语言模型能力的基本思路是准备输入和标准答案,比较不同模型对相同输入的输出 由于AI答题有各种各样答案,因此现在是利用选择题考察。 有一个知名的选择题的基准叫做Massive Multitask Language Und…...
解构区块链身份认证:从ID到零知识证明的实战指南
引言 在数字经济高速发展的今天,数字身份已成为个人与数字世界交互的核心凭证。传统中心化身份系统存在数据孤岛、隐私泄露、单点故障等痛点,而区块链技术凭借去中心化、不可篡改、可追溯的特性,为数字身份验证提供了革命性解决方案…...
IntelliJ IDEA 使用教程
文章目录 一、创建项目二、创建模块三、创建包四、创建类五、编写代码六、运行代码注意 一、创建项目 二、创建模块 【File】->【New】->【Module…】 三、创建包 【helloword】->【右击 src】->【New】->【Package】 四、创建类 【helloword】->【s…...
HBM的哪些事
命令操作 这也许是DDR往HBM演进的一些奇淫技巧。 本篇内容属于杂谈,关于HBM的奇淫技巧,随后出专题介绍。...
C++ std::initializer_list 详解
std::initializer_list 是 C11 引入的一个轻量级模板类,用于支持花括号初始化列表({1, 2, 3})的语义。它允许函数或构造函数接受任意长度的同类型初始化列表,是实现统一初始化({} 语法)的核心组件。 1. 基本…...
网络原理 - 13(HTTP/HTTPS - 4 - HTTPS)
目录 HTTPS 是什么 不得不的策略 - 应对“运营商劫持” “加密” 是什么 分类 对称加密 非对称加密 HTTPS 工作原理 1)引入对称加密 2) 引入非对称加密 中间人攻击 引入证书 证书的验证过程 完! HTTPS 是什么 HTTPS 也是一个应…...
当MCP撞进云宇宙:多芯片封装如何重构云计算的“芯“未来?
当MCP撞进云宇宙:多芯片封装如何重构云计算的"芯"未来? 2024年3月,AMD发布了震撼业界的MI300A/B芯片——这颗为AI计算而生的"超级芯片",首次在单封装内集成了13个计算芯片(包括3D V-Cache缓存、CDNA3 GPU和Zen4 CPU),用多芯片封装(Multi-Chip Pac…...
Kotlin Flow流
一 Kotlin Flow 中的 stateIn 和 shareIn 一、简单比喻理解 想象一个水龙头(数据源)和几个水杯(数据接收者): 普通 Flow(冷流):每个水杯来接水时,都要重新打开水龙头从…...
虚拟局域网(VLAN)实验(Cisco Packet Tracer)-路由器、交换机的基本配置
好的,我们来根据你提供的文档,一步步地在 Cisco Packet Tracer 中完成这个跨交换机划分 VLAN 的实验。 实验目标: 配置两台交换机 SW1 和 SW2,划分 VLAN 10 和 VLAN 20,配置 Trunk 链路,并测试同 VLAN 和跨 VLAN 的连…...
【论文速递】2025年09周 (Robotics/Embodied AI/LLM)
目录 LLM-Microscope:揭示标点符号在Transformers的上下文中的隐藏作用英文摘要中文摘要 SurveyX:通过大型语言模型实现学术调查自动化英文摘要中文摘要 数学推理的自我奖励校正英文摘要中文摘要 VideoGrain:调整时空关注以进行多元透明视频编…...
自主机器人模拟系统
一、系统概述 本代码实现了一个基于Pygame的2D自主机器人模拟系统,具备以下核心功能: 双模式控制:支持手动控制(WASD键)和自动导航模式(鼠标左键设定目标) 智能路径规划:采用改进型…...
DeepSeek构建非农预测模型:量化关税滞后效应与非线性经济冲击传导
AI分析:非农数据前瞻与关税影响的滞后性 根据AI模型对多维度经济指标的交叉验证,4月非农就业报告或呈现“增速放缓但未失速”的特征。当前市场共识预期为新增就业13.3万人(前值22.8万),失业率维持4.2%,时薪…...
前端面经-VUE3篇--vue3基础知识(一)插值表达式、ref、reactive
一、计算属性(computed) 计算属性(Computed Properties)是 Vue 中一种特殊的响应式数据,它能基于已有的响应式数据动态计算出新的数据。 计算属性有以下特性: 自动缓存:只有当它依赖的响应式数据发生变化时ÿ…...
云原生后端架构的优势与最佳实践
📝个人主页🌹:慌ZHANG-CSDN博客 🌹🌹期待您的关注 🌹🌹 在过去的几年里,随着云计算和容器化技术的迅猛发展,云原生架构逐渐成为现代企业和开发团队构建和运维应用系统的首选方式。云原生架构通过高度的自动化、弹性伸缩、微服务化等特点,使得企业能够在不断变化…...
力扣838.推多米诺随笔
“生活就像海洋,只有意志坚强的人,才能到达彼岸。”—— 马克思 题目 n 张多米诺骨牌排成一行,将每张多米诺骨牌垂直竖立。在开始时,同时把一些多米诺骨牌向左或向右推。 每过一秒,倒向左边的多米诺骨牌会推动其左侧…...
aab转apk
一、 android34升级: 1、升级到安卓34(蓝牙、图片) 再蓝牙广播的地方加入Context.RECEIVER_EXPORTED 2、废弃了 BluetoothAdapter#enable() 和 BluetoothAdapter#disable(),需要修改 // 以前的蓝牙操作BluetoothManager bluetoo…...
LeetCode 560. 和为 K 的子数组 | 前缀和与哈希表的巧妙应用
文章目录 方法思路:前缀和 哈希表核心思想关键步骤 代码实现复杂度分析示例解析总结 题目描述 给定一个整数数组 nums 和一个整数 k,请统计并返回该数组中和为 k 的子数组的数量。 子数组是数组中连续的非空元素序列。 示例 输入:nums …...
【Hive入门】Hive性能调优:小文件问题与动态分区合并策略详解
目录 引言 1 Hive小文件问题概述 1.1 什么是小文件问题 1.2 小文件产生的原因 2 Hive小文件合并机制 2.1 hive.merge.smallfiles参数详解 2.2 小文件合并流程 2.3 合并策略选择 3 动态分区与小文件问题 3.1 动态分区原理 3.2 动态分区合并策略 3.3 动态分区合并流程…...