【学习笔记】虚幻SkeletalMesh学习(一)基础介绍
文章目录
- 零、前言
- 一、资源介绍
- 1.1 骨架资源
- 1.2 骨架网格体资源
- 二、UE4中的定义
- 2.1 骨骼数据
- 2.2 模型网格数据
- 三、渲染
- 3.1 RenderData的初始化
- 3.2 渲染对象的创建
- 3.3 渲染对象的更新
- 3.3.1 游戏线程的更新(*FSkeletalMeshObjectGPUSkin::Update*)
- 3.3.2 渲染线程的更新(*FSkeletalMeshObjectGPUSkin::UpdateDynamicData_RenderThread*)
- 3.4 Shader浅析
- 四、类图
- 参考文章
零、前言
本文大量内容来自网络文章,整理作为笔记。
感谢各位原作者!
一、资源介绍
1.1 骨架资源
骨架资源,是整个动画系统的基础。
其主要作用是记录了骨架以下信息:
- 骨骼层级信息
- 参考姿势信息
- 骨骼名称插槽(Socket)信息
- 曲线(Curve)信息
- 动画通知(Animation Notify)信息
- 插槽数据(插槽名称、所属骨骼、Transform等)
- 虚拟骨骼信息
- 骨骼名称Index映射表
- 其他骨骼设置信息:包括位移重定向(Translation Retarget)设置,LOD设置等信息

1.2 骨架网格体资源
骨骼模型是在骨骼基础之上的模型,通俗来说就是绑定骨骼后的网格体。
其主要包含以下信息:
- 模型的顶、线、面信息
- 顶点的骨骼蒙皮权重
- 模型的材质信息
- 模型LOD信息
- Morph Target信息
- Physics Asset(物理)设置信息
- 布料系统相关设置

二、UE4中的定义
2.1 骨骼数据
骨骼相关的数据都封装在USkeleton类,其中包括了骨架数据、插槽、重定向等逻辑。
USkeleton并不会直接使用自身的数据,而是会生成一个FReferenceSkeleton,存储骨骼姿势数据,来提供给Mesh来使用。

FReferenceSkeleton中,将所有的原始Bone数据分成两份:
- 一份存储Bone的名字和父节点的索引,一份是Bone的Transform。

其中,FMeshBoneInfo的数据结构保存BoneName和父节点的索引。

还包含了其他的数据信息,例如Name和Index的关系。

2.2 模型网格数据
FFbxImporter::ImportSkeletalMesh,负责将导入的模型生成FSkeletalMeshModel对象(USkeletalMesh的一个编辑器成员变量)。
该对象存储着模型网格的几何数据。

SkeletalMesh存在多个LOD,每个LOD等级下的三角形面数,顶点数是不同的。
FSkeletalMeshModel中存储了各个LOD等级的模型信息(FSkeletalMeshLODModel)。

在FSkeletalMeshLODModel中,主要包含了如下的数据:

FSkelMeshSection,表示一组使用相同材质的三角形网格数据。
- 存储了FSoftSkinVertex的数组。
- FSoftSkinVertex,表示一个顶点,包含了Position、UV、Normal等,以及每个顶点受影响的骨骼索引和权重。

经Debug可以得知:
- 骨骼权重用uint8整数表示,最大骨骼权重值为255, 所有骨骼的权重加起来等于255,真正的骨骼权重只需要除以255。

Section中的BoneMap,存储的是这个Section使用到的Bone在骨骼树上的真正索引。

FSoftSkinVertex存储的骨骼索引InfluenceBones是“虚拟骨骼索引”,而非真正的骨骼索引。想要获得真正的骨骼索引,需要进行一次转换。即经历Section的BoneMap的映射才得到真正的骨骼索引。
代码如下:

如图所示,LOD0中有两个Section,Section0使用了60个骨骼,而Section1仅有4个骨骼。

可以通过**骨骼树信息(FReferenceSkeleton)**看出Section1使用的是哪些骨骼:


三、渲染
3.1 RenderData的初始化
FSkeletalMeshModel数据不会在运行时使用,运行时使用的是由该几何数据初始化的FSkeletalMeshRenderData(渲染数据)对象。
在RunTime中,Mesh相关的几何数据实际存储FSkeletalMeshRenderData渲染数据中。

在导入模型的过程中,会调用FSkeletalMeshRenderData::Cache对RenderData进行初始化。
逐级遍历ImportedModel的的LOD,调用FSkeletalMeshLODRenderData::BuildFromLODModel,来实现数据的初始化。
代码分析如下:
1)用ImportedModel中的Sections数据,来初始化LODRenderData的Section信息。

2)获取顶点数据等,来初始化Mesh的各种VertexBuffer。

Buffer的Layout:
-
Position [Section0] [Section1]…
-
Tangent和UV同上
3)初始化蒙皮权重缓冲等

如有颜色,初始化颜色缓冲

如ClothData的初始化

…
4)拷贝ActiveBoneIndices和RequiredBones数据

上述介绍了编辑器下导入模型创建RenderData的过程。
而运行时,RenderData是创建是来自于USkeletalMesh::Serialize序列化。

3.2 渲染对象的创建
USkinnedMeshComponent::CreateRenderState_Concurrent,在该函数中会进行一些渲染相关数据的创建。
其中,会由SkeletalMesh的SkelMeshRenderData(FSkeletalMeshRenderData)创建出MeshObject(FSkeletalMeshObject)。
- 创建之后,MeshObject将常驻内存,轻易不会销毁。
FSkeletalMeshObject:渲染对象的基类,通过该对象从Game线程往渲染线程传递数据。
会根据选项创建其子类。子类如有:
- FSkeletalMeshObjectCPUSkin
- FSkeletalMeshObjectGPUSkin
- FSkeletalMeshObjectStatic

UE4默认是GPU蒙皮,以FSkeletalMeshObjectGPUSkin为例:
在其构造函数里,调用了FSkeletalMeshObjectGPUSkin::InitResources。
在该方法主要是遍历LODs(FSkeletalMeshObjectLOD的数组) ,调用FSkeletalMeshObjectGPUSkin::FSkeletalMeshObjectLOD::InitResources。
- 初始化顶点蒙皮权重缓存:MeshObjectWeightBuffer
- 初始化颜色缓存,MeshObjectColorBuffer
- 获取RenderLODData中的顶点数据,存到中间变量FVertexFactoryBuffers
- 用Buffers初始化MeshObjectLOD成员变量GPUSkinVertexFactories(FVertexFactoryData对象),初始化GPUSkin顶点工厂
- 如果有布料数据,则拿FVertexFactoryBuffers也初始化ClothVertexFactories
3.3 渲染对象的更新
FSkeletalMeshObject::Update,该函数实现了将GameThread更新后的DynamicData发送至渲染线程。
调用堆栈如下:

在UActorComponent::DoDeferredRenderUpdates_Concurrent中会检查组件当前帧bRenderTransformDirty与bRenderDynamicDataDirty是否为真。
bRenderTransformDirty为真表示Transform发生了变化,调用SendRenderTransform_Concurrent用于更新渲染线程的Transform数据。bRenderDynamicDataDirty为真表示DynamicData的数据发生变化,调用SendRenderDynamicData_Concurrent更新DynamicData。
调用MarkRenderDynamicDataDirty会将bRenderDynamicDataDirty标记为真。
其调用堆栈如下:
- 在动画更新完成后,会进行调用,从而触发渲染数据的更新。

FSkeletalMeshObject::Update,不同的MeshObject,更新的数据不同。
下面以FSkeletalMeshObjectGPUSkin为例,进行介绍。
3.3.1 游戏线程的更新(FSkeletalMeshObjectGPUSkin::Update)
其更新的数据是:FDynamicSkelMeshObjectDataGPUSkin。
存储用来更新蒙皮顶点的矩阵,在GameThread被创建,当更新时会发送到渲染线程。
其部分数据结构如下:
// 蒙皮矩阵相关
TArray<FMatrix> ReferenceToLocal;
TArray<FMatrix> PreviousReferenceToLocal;
TArray<FTransform> MeshComponentSpaceTransforms;
流程如下:
1、InitMorphResources
更新激活的MorphTarget和对应的权重,并会筛选出影响Mesh的曲线,剔除不需要的。
2、InitDynamicSkelMeshObjectDataGPUSkin
初始化GPU蒙皮数据,使用新的动态数据更新 ReferenceToLocal 矩阵。
该函数的主要逻辑:
(1)调用UpdateRefToLocalMatrices,更新ReferenceToLocal
(2)调用UpdatePreviousRefToLocalMatrices,更新PreviousReferenceToLocal
(3)调用UpdateClothSimulationData,更新布料模拟Mesh的顶点位置和法线
UpdateRefToLocalMatrices和UpdatePreviousRefToLocalMatrices,二者的差别在于ComponentTransform。
前者是GetComponentSpaceTransforms,后者是GetPreviousComponentTransformsArray。
二者核心都是调用UpdateRefToLocalMatricesInner,计算蒙皮矩阵。
蒙皮矩阵的作用:将顶点从模型空间下的绑定姿势,变换到模型空间下的当前动画姿势。
- 蒙皮矩阵计算前后都是Local Space。
所以需要先将顶点变换到骨骼空间,再应用骨骼全局姿势矩阵。
绑定姿势矩阵:每骨骼的全局绑定姿势矩阵,用于将顶点从某骨骼空间变换到模型空间。
绑定姿势逆矩阵:用于将顶点从模型空间变换到骨骼空间。
在该函数中,先遍历所有会对蒙皮产生影响的骨骼,获取其 Component Space Bone Transform 对应的矩阵(即从Bone Space 变到当前的 Local Space),对于不对蒙皮产生影响的骨骼,这里会保持为 Identity 矩阵。
然后,遍历所有骨骼,乘上 Ref-Pose ,Bone Space 到 Local space 的变化矩阵的逆矩阵(即从 Local Space 变回 Bone Space)。

3、将动态数据更新命令发送到渲染线程

3.3.2 渲染线程的更新(FSkeletalMeshObjectGPUSkin::UpdateDynamicData_RenderThread)
1、调用FreeDynamicSkelMeshObjectDataGPUSkin,释放上一帧的DynamicData。
2、调用ProcessUpdatedDynamicData,具体处理传输的数据。
ProcessUpdatedDynamicData的主要逻辑如下:
-
遍历当前LOD的Section,获得每个Section的顶点工厂VertexFactory。
-
更新顶点工厂的ShaderData,
FGPUBaseSkinVertexFactory::FShaderDataType::UpdateBoneData。
在 UpdateBoneData 中,UE 并不会将蒙皮矩阵全部传到 GPU。对于任意一个 section,UE 只会传递这个 section 用到的骨骼。

将蒙皮矩阵写入VertexBuffer(BoneBuffer)中。
3.4 Shader浅析
SKeletalMesh使用的顶点工厂是:FGPUBaseSkinVertexFactory
通过IMPLEMENT_GPUSKINNING_VERTEX_FACTORY_TYPE宏,将GPU蒙皮的VertexFactory与对应的Shader(GpuSkinVertexFactory.ush)进行了绑定。

打开GpuSkinVertexFactory.ush,可以看到包含一大堆宏定义代码。
最好的方式是用RenderDoc截帧一下,获取一份不带宏的示例代码。
XXVertexFactory.ush 使用了模板函数,需要定义接口的函数和结构。后续会整理一个文档。
输入布局FVertexFactoryInput的定义:
- Position,模型顶点位置
- BlendIndices,影响顶点的骨骼Index列表
- BlendWeights,影响顶点的骨骼权重列表
struct FVertexFactoryInput
{float4 Position : ATTRIBUTE0;float3 TangentX : ATTRIBUTE1;float4 TangentZ : ATTRIBUTE2;uint4 BlendIndices : ATTRIBUTE3;uint4 BlendIndicesExtra : ATTRIBUTE14;float4 BlendWeights : ATTRIBUTE4;float4 BlendWeightsExtra : ATTRIBUTE15;float2 TexCoords[ 1 ] : ATTRIBUTE5;float3 PreSkinOffset : ATTRIBUTE11;float3 PostSkinOffset : ATTRIBUTE12;float4 Color : ATTRIBUTE13;
};
FVertexFactoryIntermediates的定义
struct FVertexFactoryIntermediates
{float3x4 BlendMatrix;float3 UnpackedPosition;float3x3 TangentToLocal;float4 Color;
};
这是一个Caching机制(只计算一次)的结构。
- 主要是获取了位置、BlendMatrix、TangentToLocal矩阵、颜色。
FVertexFactoryIntermediates GetVertexFactoryIntermediates(FVertexFactoryInput Input)
{FVertexFactoryIntermediates Intermediates;Intermediates.UnpackedPosition = UnpackedPosition(Input);Intermediates.BlendMatrix = CalcBoneMatrix( Input );Intermediates.TangentToLocal = SkinTangents(Input, Intermediates);Intermediates.Color = Input.Color.rgba ;return Intermediates;
}
其中,CalcBoneMatrix为计算加权后的蒙皮矩阵,具体的逻辑如下:
- 线性蒙皮,将所有对该顶点有影响的骨骼变换矩阵,乘上权重再累加起来,得到一个完整的蒙皮矩阵。
- 支持4骨骼或8骨骼蒙皮
float3x4 GetBoneMatrix(int Index)
{float4 A = BoneMatrices[Index * 3];float4 B = BoneMatrices[Index * 3 + 1];float4 C = BoneMatrices[Index * 3 + 2];return float3x4 (A,B,C);
}float3x4 CalcBoneMatrix( FVertexFactoryInput Input )
{float3x4 BoneMatrix = Input.BlendWeights.x * GetBoneMatrix(Input.BlendIndices.x);BoneMatrix += Input.BlendWeights.y * GetBoneMatrix(Input.BlendIndices.y);BoneMatrix += Input.BlendWeights.z * GetBoneMatrix(Input.BlendIndices.z);BoneMatrix += Input.BlendWeights.w * GetBoneMatrix(Input.BlendIndices.w);if (NumBoneInfluencesParam > 4 ){BoneMatrix += Input.BlendWeightsExtra.x * GetBoneMatrix(Input.BlendIndicesExtra.x);BoneMatrix += Input.BlendWeightsExtra.y * GetBoneMatrix(Input.BlendIndicesExtra.y);BoneMatrix += Input.BlendWeightsExtra.z * GetBoneMatrix(Input.BlendIndicesExtra.z);BoneMatrix += Input.BlendWeightsExtra.w * GetBoneMatrix(Input.BlendIndicesExtra.w);}return BoneMatrix;
}
对于VS而言,是计算顶点的世界位置,具体的计算如下:
- 顶点乘上混合后的蒙皮矩阵,再乘以Local到世界的变换矩阵。
float3 SkinPosition( FVertexFactoryInput Input, FVertexFactoryIntermediates Intermediates )
{float3 Position = Intermediates.UnpackedPosition;Position += Input.PreSkinOffset;Position = mul(Intermediates.BlendMatrix, float4(Position, 1));Position += Input.PostSkinOffset;return Position;
}float4 CalcWorldPosition(FVertexFactoryInput Input, FVertexFactoryIntermediates Intermediates)
{return TransformLocalToTranslatedWorld(SkinPosition(Input, Intermediates));
}
float4 VertexFactoryGetWorldPosition(FVertexFactoryInput Input, FVertexFactoryIntermediates Intermediates)
{return CalcWorldPosition(Input, Intermediates);
}
四、类图

参考文章
-
UE4动画系统的那些事(一):UE4动画系统基础
-
UE4源码阅读_骨骼模型与动画系统_Mesh
-
UE4之StaticMesh和SkeletalMesh类图
-
UE4获取SkeletalMesh顶点的骨骼权重
相关文章:
【学习笔记】虚幻SkeletalMesh学习(一)基础介绍
文章目录 零、前言一、资源介绍1.1 骨架资源1.2 骨架网格体资源 二、UE4中的定义2.1 骨骼数据2.2 模型网格数据 三、渲染3.1 RenderData的初始化3.2 渲染对象的创建3.3 渲染对象的更新3.3.1 游戏线程的更新(*FSkeletalMeshObjectGPUSkin::Update*)3.3.2 …...
Apache防盗链、网页压缩、网页缓存
目录 网页压缩 类型 示例 动态添加模块操作步骤 重装Apache操作步骤 网页缓存 示例 操作步骤 隐藏版本信息 操作步骤 Apache防盗链 定义 原理 配置防盗链实验环境 实验环境 本地图片盗链示例 操作步骤 防盗链示例 操作步骤 网页压缩 网站的访问速度是由多个…...
LocalAI - 笔记
1.localAI https://localai.io/ 2 使用笔记本电脑搭建本地LLMs大模型环境 使用笔记本电脑搭建本地LLMs大模型环境 - 大模型知识库|大模型训练|开箱即用的企业大模型应用平台|智能体开发|53AI 3LocalAI视频 【LocalAI】(3):超级简单&…...
Windows图形界面(GUI)-SDK-C/C++ - 编辑框(edit)
公开视频 -> 链接点击跳转公开课程博客首页 -> 链接点击跳转博客主页 目录 编辑框(edit) 控件样式 创建控件 初始控件 消息处理 示例代码 编辑框(edit) 控件样式 编辑框(Edit Control)是Windows中最常用的控件之一,用于接收用户…...
区块链学习05-web3中solidity和move语言
Solidity 和 Move 语言的比较:Web3 开发中的两种选择 Solidity 和 Move 都是用于开发区块链平台智能合约的编程语言。它们具有一些相似之处,但也存在一些关键差异。 相似之处: Solidity 和 Move 都是图灵完备语言,这意味着它们可以表达计算…...
web滚动页面到指定位置
方法:scrollTo(x-coord,y-coord) 方法是Web API中Element接口的一部分,但它主要用于Window对象或可滚动的元素(如具有overflow属性为auto或scroll的<div>)。此方法用于将窗口滚动到文档中的特定位置,或者将某个元…...
操作系统真象还原:实现文件写入
14.7 实现文件写入 这是一个网站有所有小节的代码实现,同时也包含了Bochs等文件 本节要实现的 sys_write 是系统调用 write 的内核实现,咱们之前的 write 是个简易版,它是为了临时完成输出打印的功能,不支持文件描述符。如今要让…...
FastAPI 学习之路(四十九)WebSockets(五)修复接口测试中的问题
其实代码没有问题,但是我们忽略了一个问题,就是在正常的开发中,肯定是遇到过这样的情况,我们频繁的有客户端链接,断开连接,需要统一的管理这些链接,那么应该如何管理呢。其实可以声明一个类去管…...
STM32智能楼宇照明系统教程
目录 引言环境准备智能楼宇照明系统基础代码实现:实现智能楼宇照明系统 4.1 数据采集模块 4.2 数据处理与控制模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景:楼宇照明管理与优化问题解决方案与优化收尾与总结 1. 引言 智能楼宇照明系…...
【C语言】原码、反码、补码详解 -《码上有道 ! 》
目录 原码、反码、补码详解及其在C语言中的应用一、原码(Sign-Magnitude)1.1 定义与表示1.2 历史来源与作用1.3 示例1.4 C语言示例1.5 代码运行结果 二、反码(Ones Complement)2.1 定义与表示2.2 历史来源与作用2.3 示例2.4 C语言…...
C++找到错误的具体信息
fprintf(stderr, "Errno: %d, Error message: %s\n", errno, strerror(errno));为什么不用printf来打印输出? 使用 fprintf(stderr, …),将错误消息输出到标准错误流 stderr。这种做法是为了将错误信息输出到一个专门用于记录错误的流中&…...
Windows 安装Zookeeper
安装 下载地址:Apache ZooKeeper 我下载的版本:zookeeper-3.4.12 下载后,解压 配置 1、 在D:\zookeeper-3.4.12文件夹中创建一个“data”文件夹和“log”文件夹 2、 复制zoo_sample.cfg,改名:zoo.cfg 修改zoo.c…...
从人工巡检到智能预警:视频AI智能监控技术在水库/河湖/水利防汛抗洪中的应用
一、背景需求分析 近日,我国多省市遭遇连日暴雨,导致水库、湖泊、河道等水域水位暴涨,城市内涝频发。随着夏季汛期的到来,降雨天气频繁,水利安全管理面临严峻挑战。为保障水库安全、预防和减少洪涝灾害,采…...
【轻松拿捏 】Java-static关键字(面试)
Java-static关键字 1. 定义和基本概念 回答要点: 示例回答: 2. static 变量 回答要点: 示例回答: 代码示例: 3. static方法 回答要点: 示例回答: 代码示例: 4. static 代…...
【阶乘】个人练习-Leetcode-LCP 22. 黑白方格画
题目链接:https://leetcode.cn/problems/ccw6C7/description/ 题目大意:给出一块白方格面积为n*n,给出一个数字k,每一次操作可以把方格的某一整行或者某一整列涂黑,求使得黑色格子数字为k的【最终图案】的个数。 思路…...
十七、【文本编辑器(三)】图像坐标变换
目录 一、缩放功能 二、旋转功能 三、镜像功能 四、QMatrix简单介绍 一、缩放功能 (1)在头文件中添加 “protected slots:" 变量: void ShowZoomln( ); (2)在 createActionso函数的最后添力口事件关联&…...
生活中生智慧
【 圣人多过 小人无过 】 觉得自己做得不够才能做得更好,互相成全;反求诸己是致良知的第一步;有苦难才能超越自己,开胸怀和智慧;不浪费任何一次困苦,危机中寻找智慧,成长自己。 把困苦当作当下…...
2024第18届中国西部(成都)教育装备展12月14日举办
2025中国国际工业气体设备技术及应用展览会 2025 China International Industrial Gas Equipment Technology and Application Exhibition 时间:2025年3月18-20日 地点:北京全国农业展览馆(新馆) 展览前言 随着需求市场的持续…...
Webpack看这篇就够了
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…...
基于京东电商蓝牙耳机产品评论数据的情感分析与文本分析
摘要 随着电子商务的迅速发展,了解用户对产品的意见和情感倾向对企业至关重要。本研究旨在利用Python大数据技术对电商产品评论进行情感分析和主题建模,为企业提供有价值的市场洞察。 通过爬虫获取电商评论数据,使用pandas清洗和预处理数据&a…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...
相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...
【Veristand】Veristand环境安装教程-Linux RT / Windows
首先声明,此教程是针对Simulink编译模型并导入Veristand中编写的,同时需要注意的是老用户编译可能用的是Veristand Model Framework,那个是历史版本,且NI不会再维护,新版本编译支持为VeriStand Model Generation Suppo…...
Mac flutter环境搭建
一、下载flutter sdk 制作 Android 应用 | Flutter 中文文档 - Flutter 中文开发者网站 - Flutter 1、查看mac电脑处理器选择sdk 2、解压 unzip ~/Downloads/flutter_macos_arm64_3.32.2-stable.zip \ -d ~/development/ 3、添加环境变量 命令行打开配置环境变量文件 ope…...
OpenHarmony标准系统-HDF框架之I2C驱动开发
文章目录 引言I2C基础知识概念和特性协议,四种信号组合 I2C调试手段硬件软件 HDF框架下的I2C设备驱动案例描述驱动Dispatch驱动读写 总结 引言 I2C基础知识 概念和特性 集成电路总线,由串网12C(1C、12C、Inter-Integrated Circuit BUS)行数据线SDA和串…...
2025-06-01-Hive 技术及应用介绍
Hive 技术及应用介绍 参考资料 Hive 技术原理Hive 架构及应用介绍Hive - 小海哥哥 de - 博客园https://cwiki.apache.org/confluence/display/Hive/Home(官方文档) Apache Hive 是基于 Hadoop 构建的数据仓库工具,它为海量结构化数据提供类 SQL 的查询能力…...
RK3568项目(七)--uboot系统之外设与PMIC详解
目录 一、引言 二、按键 ------>2.1、按键种类 ------------>2.1.1、RESET ------------>2.1.2、UPDATE ------------>2.1.3、PWRON 部分 ------------>2.1.4、RK809 PMIC ------------>2.1.5、ADC按键 ------------>2.1.6、ADC按键驱动 ------…...
