当前位置: 首页 > news >正文

拥抱新一代 Web 3D 引擎,Three.js 项目快速升级 Galacean 指南

作者: vivo 互联网前端团队- Su Ning

本文从多个维度对比 Galacean 和 Three.js 两款Web3D 引擎的差异,并介绍拟我形象项目从Three.js 切换到 Galacean 以后带来的提升以及项目迁移的心得,为其他 Three.js 项目升级到 Galacean 提供参考。

 

1分钟看图掌握核心观点👇

1

 

一、背景

Web 3D 技术的发展日新月异,为我们带来了前所未有的沉浸式体验。从虚拟展示到游戏开发,从建筑可视化到教育模拟,Web 3D 技术的应用场景愈发广泛。而在这一领域,Three.js 作为一款广受欢迎的 JavaScript 3D 库,凭借其简洁易用的 API 和丰富的功能,帮助众多开发者实现了精彩的 3D 项目。

 

然而,随着项目复杂度的不断提升,以及用户对性能和体验要求的日益苛刻,Three.js 逐渐显露出一些局限性。比如在处理重负载时,很容易遇到性能瓶颈,出现卡顿、掉帧等问题。这就如同一位经验丰富的车手,驾驶着一辆曾经性能卓越的赛车,但在面对愈发复杂的赛道和激烈的竞争时,却发现车辆的动力和操控性渐渐力不从心。

 

二、Galacean:新一代 Web 3D 引擎

2.1 业务简介

拟我形象是 vivo 账号中的一个3D数字人功能,提供一种代表自由、个性、创新和时尚的虚拟形象,为用户提供更加生动、直观、有趣的交流方式。采用 Native+H5混合的开发方式,其中 3D 渲染的部分基于 Three.js 进行开发。

 

2.2 技术挑战与痛点

  • 性能瓶颈:人物模型包含大量形态键以实现多样化面部特征,导致模型加载解析耗时过长。

  • 线程阻塞:受限于JS单线程特性,模型解析过程会造成页面短暂无响应。

  • 多模型渲染:套装切换等场景下,多个模型同时渲染时性能问题尤为突出。

  • 阴影优化:Three.js 的阴影渲染性能消耗大,不得不通过局部阴影和限制捕捉范围等折中方案来平衡画质与性能。

 

2.3 Galacean 引擎核心优势

Galacean 是一款开源的 Web 游戏引擎,致力于打造一个开放、易用、高效的游戏开发工具,可以通过在线编辑器或者纯代码的形式进行使用。

 

针对现存的技术挑战与痛点,Galacean做了深度优化:

  • 多线程处理:采用Worker避免主线程阻塞。

  • 移动端适配:对大量常量进行近似取值优化,完美适配移动端。

  • 性能突破:优化数据传输链路,创新缓存设计,显著降低重负载场景下的卡顿现象。

 

对比视频1

对比视频1:加载速度

 

对比视频2

对比视频2:套装切换

 

此外,Galacean 基于 EC(Entity-Component)架构设计,而非 Three.js 的面向对象,大幅提升了开发的灵活性。

 

近期我们将渲染引擎由 Three.js 切换为 Galacean。这一举措不仅解决了页面卡顿问题,还提升了浏览器兼容性(可支持到 chrome82),帧率表现更出色,画面质感也得到显著改善。整体切换过程较为平滑,但也遇到了一些问题。接下来,将与大家分享此次整体升级的相关经验。

 

三、调优过程

任务拆解:

作为一个数字人项目,涉及到引擎升级的模块大致有

①环境初始化(场景、相机、光线、引擎设置)

 

② 模型加载

  • 骨架获取

  • 材质获取

  • 动画获取

 

③妆容、穿搭还原

  • 形态键修改

  • 贴图、颜色修改

  • 模型替换

  • 头像(静态头像、动态头像)导出

  • 壁纸(静态壁纸、动态壁纸、视差壁纸)导出

 

经过梳理,可以大致分为四类:

  • 初始化

  • 模型加载

  • 素材替换

  • 动画状态

 

接下来我们对这几个部分进行分别的处理

 

3.1 初始化

有别于 Three.js 的渲染器创建,Galacean 的 engine 初始化是异步方法,所以后续用到用到engine的地方需要考虑加载的时序,以及engine存在状态的判断。另外,Three.js 中 renderer 的渲染行为需要手动调用,一般是使用requestAnimationFrame循环调用,而Galacean则不需要,引擎开始渲染只需要调用一次 engine.run 即可。

const renderer=new THREE.WebGLRenderer({
  alpha: true,
  antialias: true,
})
document.body.appendChild(renderer.domElement)
const scene = new THREE.Scene()
const camera = new THREE.PerspectiveCamera(15, window.innerWidth/window.innerHeight, 0.1, 100)
requestAnimationFrame(function render() {
  renderer.render(scene, camera)
  requestAnimationFrame(render)
})

 

const engine = await WebGLEngine.create({
  canvas,
  physics: new LitePhysics()
})
engine.run()

 

在 Three.js 中,尺寸单位统一以米为基准,无需额外进行特殊处理。不过在角度单位的使用上存在差异:Three.js 里,仅相机的 fov(视场角)采用角度单位,其他涉及角度的参数均以弧度计量;而 Galacean 则采用更为统一的设定,所有角度相关单位均为角度。

/** Three.js */
camera.fov = 15
item.rotation.y = 15 * Math.PI/180/** Galacean */
camera.fieldOfView = 15
item.rotation.y = 15

 

在Three.js中颜色的设置更加灵活,可以使用16进制或者RGB值来进行赋值,但是在Galacean中只能通过RGB来进行赋值,且有别于0-255的取值范围,Galacean中的颜色范围是0-1。从Galacean1.5版本开始,默认的色彩空间改为线性,在代码中需要手动转换一下。

/** Three.js */
directLight.color=0xffffff
directLight.intensity=0.9/** Galacean */
const color = new Color(0.9, 0.9, 0.9, 1)
color.toLinear(color)
directLight.color = color

 

3.2 模型加载

对于包含大量形态键和动画的模型,将模型打成zip包可以有效的压缩模型的体积,不论是Three.js还是Galacean都不支持加载zip包,但是我们可以自行扩展模型加载的链路,将zip下载后解压出的模型获取ObjectUrl再放到各自的加载器中加载,这样加载进度的获取也可以进行自定义,不需要进行额外的改造。

exportclassModelLoader {
  engine: WebGLEngine
  constructor(engine: WebGLEngine){
    this.engine = engine
  }
  async load(src: string) {
    const url = await fileLoader(src)
    returnthis.engine.resourceManager.load<GLTFResource>({
      url,
      type: AssetType.GLTF
    })
  }
}

 

Three.js 解析 glTF 模型输出的数据结构较为简单,主要使用模型的场景和动画片段。由于后续需针对特定材质进行替换,所以要根据节点名获取特定节点,再取出节点中的材质信息,模型的骨架也通过这种方式获取。而 Galacean 输出的数据更为全面,除动画片段和实体信息外,模型中使用的材质、贴图、蒙皮和网格信息也会分门别类展示,需要对应内容时直接获取即可,相比 Three.js 更加方便。

 

3.3 素材替换

素材替换如上文总结分为四种,分别是颜色、贴图、形态键和模型的替换,颜色设置我们在初始化中已经讲解,而模型加载和展示也没有特别的内容,无非是节点/实体的添加和移除,这里我们讲下贴图和形态键修改的一些tips。

 

在Three.js中修改材质贴图map可以直接直接使用canvas或者image,修改后需要将材质needsUpdate属性设置为true。而在Galacean需要先将图片加载为texture,再进行赋值。

/** Three.js */
material.map=canvas
material.needsUpdate = true/** Galacean */
const texture: Texture2D = await engine.resourceManager.load({
  url,
  type: AssetType.Texture2D
})
material.baseTexture = texture

 

在Three.js中修改形态键,可以先通过网格中的morphTargetDictionary属性获取到需要修改的形态键的索引,然后修改morphTargetInfluences中对应索引的值即可。

 

在Galacean中网格渲染器中没有存储形态键的索引信息,而是存储在MeshRenderer下的mesh属性下的blendShapes属性中,通过获取对应名称的形态键在数组中的索引,修改网格渲染器中blendShapeWeights属性对应下标的值。

/** Three.js */
const index = morphTargetDictionary[keyName]if (index !== undefined) {
  mesh.morphTargetInfluences[index] = value
}/** Galacean */
const blendShapes = skinMeshRenderer.mesh.blendShapes
const index = blendShapes.findIndex(i=>i.name===keyName)
if (index > -1){
  skinMeshRenderer.blendShapeWeights[index] = value
}

 

3.4 动画

相较于Three.js的AnimationMixer和AnimationClip,Galacean拥有更加完善的面向组件的动画系统,支持 状态机、混合动画、时长压缩等,不同动画之间的切换与播放更加简单易维护。

/** Three.js 播放动画片段 */
const mixer = new THREE.AnimationMixer(scene)
const action=mixer.clipAction(avatarClip)
action.play()
ticker.addEvent(delta => {
  mixer.update(delta)
})/** Galacean 添加状态机,播放完成回到待机状态 */
const animationState = animator.findAnimatorState('action')
const idleStatle = animator.findAnimatorState('idle')
const transition = new AnimatorStateTransition()
transition.duration = 1
transition.offset = 0
transition.exitTime = 1
transition.destinationState = idleStatle
animationState.addTransition(transition)
animator.play('action')

 

四、结语

Galacean 的出现,无疑为 Web 3D 开发领域带来了新的活力。它不仅解决了 Three.js 等传统技术在性能和功能上的诸多痛点,还以其卓越的性能、丰富的功能和易用性,为开发者打开了一扇通往更广阔创意空间的大门。

 

需要注意的是,Galacean不同版本之间的API差异较大,需要进行甄别,同时开发文档及相关的案例也需要进一步完善。

 

对于全新的项目,Galacean提供编码或在线编辑器两种方式保障创意的高效落地,详细的文档和案例也便于接触 Web3D 开发的新人快速上手。

 

对于存量的项目,Galacean的迁移成本不高,且整个过程平滑可控,能够有效提升现有项目的画面表现和性能。为未来复杂度更高的需求提供性能保障。

相关文章:

拥抱新一代 Web 3D 引擎,Three.js 项目快速升级 Galacean 指南

本文从多个维度对比 Galacean 和 Three.js 两款Web3D 引擎的差异,并介绍拟我形象项目从Three.js 切换到 Galacean 以后带来的提升以及项目迁移的心得,为其他 Three.js 项目升级到 Galacean 提供参考。作者: vivo 互联网前端团队- Su Ning 本文从多个维度对比 Galacean 和 Th…...

Fast IO 模板

放在 using namespace std; 后面即可。 namespace fast_IO { #define FASTIO #define IOSIZE 100000char ibuf[IOSIZE], obuf[IOSIZE];char *p1 = ibuf, *p2 = ibuf, *p3 = obuf; #ifdef ONLINE_JUDGE #define getchar() ((p1==p2)and(p2=(p1=ibuf)+fread(ibuf,1,IOSIZE,stdin)…...

kylin V11安装mysql8.4.5(glibc.2.28版本)

环境:OS:kylin V11mysql:8.4.5 glibc2.28(建议不要安装glibc.2.17版本) 查看系统glibc版本[root@localhost soft]# ldd --versionldd (GNU libc) 2.38Copyright (C) 2023 Free Software Foundation, Inc.This is free software; see the source for copying conditions. There…...

iOS 上架 App 流程全解析 苹果应用发布步骤、App Store 审核流程、ipa 文件上传与 uni-app 打包实战经验

本文系统解析 iOS 上架 app 流程,涵盖苹果应用从开发者账号注册、证书准备、uni-app 打包、ipa 上传、TestFlight 测试,到 App Store 审核与发布的完整步骤,结合多工具协作,总结高效实用的上架经验。对开发者来说,应用上线的最后一道门槛就是 iOS 上架 app 流程。 相比 An…...

P6801 花式围栏

题目传送门数学、计数类。题意 在 \(n\) 个同一底线上宽 \(w\),高 \(h\),给定的相邻矩形中,数出在方格上的任意形状的小矩形的个数。 \(1\leq n\leq 10^5,1\leq w,h \leq 10^9\) 题解 我们规定竖直方向上为高,水平方向上为的宽。 要研究 \(n\) 个,就要先研究一个。 我们考…...

ms sql dml 操作

ms sql dml 操作 --建表 select * into tablenew from tableold...

黑白染色方法

主要有 \(3\) 种方法:DFS / BFS / DSUDFS直接遍历整张图染色,判断是否产生冲突 init(){for(int i=1;i<=n;i++) col[i]=-1; } bool dfs(int u,int c){col[u]=c;for(auto v:e[u]){if(col[v]==-1) return dfs(v,c^1);else if(col[v]==c) return false;}return true; } ... bo…...

Windows 数字签名获取与验证详解

在 Windows 的安全体系中,数字签名扮演着“软件身份证”的角色。它可以证明一个程序确实来自某个发布者,并且在分发的过程中没有被篡改。 当下载一个系统更新、驱动程序,或者安装第三方应用时,操作系统往往会验证数字签名,确保软件来源合法、安全。那么,作为开发者或安全…...

转化率提升300%,火山引擎Data Agent以“一客一策”突破企业营销增长瓶颈

火山引擎近日分享了其企业级数据智能体Data Agent如何通过AI技术,解决企业营销增长中的核心问题。根据过去半年的客户实践,Data Agent在智能营销领域展现出显著成效,通过自然语言交互大幅降低工具使用门槛,并能深度整合企业内外部数据,实现从洞察到行动的闭环决策。面对企…...

矩阵模板

struct mat{int m[N][N];//将A.m[i][j] 改成 A[i][j] 这种格式int* operator [] (size_t i) {return m[i];}const int* operator [] (size_t i) const {return m[i];}mat() {memset(m,0,sizeof m);}//初始化矩阵mat operator * (const mat& b) const {//矩阵乘法mat res;fo…...

快读模板

int read(){int x=0,f=1;char c=getchar();while(c<48||c>57){if(c==-) f=-1;c=getchar();}while(c>47&&c<58) x=x*10+(c^48),c=getchar();return x*f; }本文来自博客园,作者:_AzureSky,转载请注明原文链接:https://www.cnblogs.com/-AzureSky-/p/1909…...

ipadװwindowsϵͳshell

如何在iPad上安装Windows系统Shell:详解与实践指南 随着科技的不断进步,用户对于设备功能的需求也在不断增加。iPad作为一款便携式的智能平板电脑,其强大的硬件性能和优秀的生态系统赢得了广大用户的喜爱。然而,对于一些专业用户或技术爱好者来说,仅使用iOS系统可能无法满…...

cpu的各种寄存器及其功能

cpu的功能 指令控制 完成取指令,分析指令,执行指令的操作 操作控制 产生完成一条指令所需要的操作信号,从而控制这些部件按指令的要求正确执行 时间控制 严格控制各种操作信号出现的时间,持续时间以及出现的时间顺序 数据加工 对数据进行逻辑和算数运算 中断处理 对计算机运…...

如何关闭电视的ACR功能及其对隐私保护的重大意义

本文详细解析智能电视自动内容识别(ACR)技术的工作原理与隐私风险,提供三星、LG、索尼、海信、TCL五大品牌电视的ACR关闭步骤,帮助用户有效保护个人观看数据免受商业监控。如何关闭电视的ACR功能(及其重大影响) 智能电视操作系统带来便利的同时,也引发了新的隐私担忧——尤…...

huggingface 模型权重文件

文件类型文件名示例用途模型权重 pytorch_model.bin 或 model.safetensors 包含模型训练后的参数权重配置文件 config.json 包含模型架构和超参数配置词汇表文件 vocab.json, vocab.txt, tokenizer.json 分词器所需的词汇映射分词器配置 tokenizer_config.json 分词器的配置参数…...

vscode设置单击选中带连字符的单词

1、打开 VSCode 设置打开设置搜索 wordSeparators,找到 Editor: Word Separators 选项。2、移除 - 字符默认值类似:`~!@#$%^&*()-=+[{]}\\|;:",.<>/?删除 -(连字符),使其变成:`~!@#$%^&*()=+[{]}\\|;:",.<>/?这样 - 就不会被视为单词分隔…...

P4147 玉蟾宫(悬线法)

P4147 玉蟾宫#include <bits/stdc++.h> using namespace std;const int maxn = 1e3 + 10;int n,m; int a[maxn][maxn] = {{0,0}}; int l[maxn][maxn],r[maxn][maxn],h[maxn][maxn]; int ans;int main(){ios::sync_with_stdio(0);cin.tie(0);cin >> n >> m;fo…...

全局平衡二叉树

发现自己在大力 DS 这个领域有一些欠缺,所以来补一下。 所谓全局平衡二叉树(GBST)就是 LCT 的静态版本。 我们对树先重剖,然后把每条重链上的点拎出来建一个 BST,满足这个 BST 的中序遍历就是这个重链从上到下遍历得到的序列。然后让这个 BST 的根指向这个点原树上的父亲。…...

Transactional注解的方法里 spring怎么知道我用的是哪个jdbctemplate实例

> 这是一个非常好的问题,它触及了 Spring 框架中声明式事务管理(`@Transactional`)和底层资源管理(`JdbcTemplate`)如何协同工作的核心。 简单直接的回答是:**Spring 并不知道,也不关心你的方法内部使用的是哪个 `JdbcTemplate` 实例。它只关心当前线程是否已经绑定…...

根据参数查询

根据参数查询<!-- 根据参数查询--><select id="listByMap" resultMap="ResultMapManage" parameterType="map">select <include refid="Manage_field"/>from manage where 1=1<include refid="Manage_wh…...

关于非侵入式脑机接口面向C端一个应用想法

目前,脑机接口行业发展如火如荼,但应用仍高度集中在医疗领域,比如运动功能康复等。这类方向不仅技术相对成熟,也更易获得商业回报——毕竟无论是医院还是患者,都更愿意为“恢复健康”买单。然而,若希望脑机接口能像汽车、手机那样,真正融入普通人的日常生活,成为不可或…...

Blelloch并行扫描算法

本文介绍了一个可以用于并行化串行累计操作的Blelloch算法,可以通过用空间换时间+并行计算的方法,来降低特定计算的时间复杂度。这里我们给出了算法原理的大致介绍,以及基于Numpy的算法代码实现。技术背景 由于现代计算机技术的发展,算法的并行能力越来越强大。所以当我们考…...

国产化DevOps生态崛起:Gitee如何赋能企业数字化转型

国产化DevOps生态崛起:Gitee如何赋能企业数字化转型 在数字化转型浪潮中,中国企业的软件研发模式正经历深刻变革。随着信创战略的深入推进,构建自主可控的DevOps工具链已成为各行业技术负责人的核心任务。作为国内领先的代码托管平台,Gitee正通过其本土化优势与开放性生态,…...

【IEEE出版】2025年电气、控制与人工智能国际学术会议(ICOECAI 2025)

2025年电气、控制与人工智能国际学术会议(ICOECAI 2025) 2025 International Conference on Electrical, Control and Artificial Intelligence 在这里看会议官网详情 2025年10月24-26日 中国广州 截稿时间:见官网 接受/拒稿通知:投稿后5天内 收录检索:IEEE Xplore、EI …...

采购计划 vs 物料需求计划(MRP),采购新手最容易搞混的两份“清单”!

很多采购新手一上手就懵了:手里同时有两份计划一个叫“采购计划” 一个叫“MRP(物料需求计划)”你一看,都是要买东西啊,干嘛分两份?https://s.fanruan.com/m15ta 很多企业常常把这两份清单混为一谈,结果掉进坑里——采购超预算、缺料、库存积压……问题全来了。 今天,我…...

P10299 [CCC 2024 S5] Chocolate Bar Partition

题目传送门DP、状态设计优化。题意 将一个 \(2 \times N(N \le 2\times 10^5)\) 的矩阵分为尽可能多的联通块,使得每个联通块中的数的平均值都相等,求最多可以将矩阵分为多少个联通块。 题解 显然是 DP,并且复杂度要在 \(O(N \log N)\) 或者 \(O(N)\)。 平均值相等很难维护,…...

实用指南:企业实施数字化转型时常见的挑战

实用指南:企业实施数字化转型时常见的挑战pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !impo…...

当ARMxy+AI边缘计算落地水泵行业就碰撞出怎样的火花?

水泵,这个看似再普通不过的设备,正在城市供水、楼宇二次供水、农业灌溉、工业循环水等场景里默默运行。它们是“水的搬运工”,也是能耗大户、运维难点。然而,在 数字化浪潮下,水泵行业也开始面临三个迫切问题:能耗高:传统 PID 调节方式,难以精准匹配用水曲线;运维难:…...

QN8035 FM芯片驱动开发

一、驱动开发基础配置 1.1 硬件接口配置通信协议:标准I2C接口(设备地址:写0x20/读0x21) 关键引脚: SDA/SCL:I2C数据线(需接4.7kΩ上拉电阻) XTAL_IN/XTAL_OUT:外部晶振输入(支持16MHz/24MHz) RDS_IN:RDS数据输入(需连接解码芯片)1.2 寄存器配置要点 #define QN80…...

再见 Claude Code,我选择了 Codex!真香!!

大家好,我是R哥。 最近,我放弃 Claude Code 了,选择了 CodeX,真香! 为什么放弃 Claude Code? 第一,是因为 Claude 全面封禁了中国控股公司使用,让我很不爽。推荐阅读:真行!Claude 全面封禁中国。。 第二,我用不惯 Claude,我一直用的 ChatGPT,为了使用 Claude Code…...

2025中国DevOps工具生态全景:本土化突围与智能化跃迁

2025中国DevOps工具生态全景:本土化突围与智能化跃迁 在全球数字化转型浪潮席卷之下,DevOps工具市场正以年复合增长率24%的速度扩张。中国信通院最新数据显示,2023年国内DevOps平台市场规模达58亿元,其中本土解决方案占比首次突破40%。这场由自动化向智能化的产业升级中,工…...

字符串转 python 对象 eval

s = [ { label: "苹果", value: "origin_event_data", icon: "icon-a", color: "#409EFF", bgColor: "#ECF5FF", borderColor: "#D9ECFF", }, { label: "橘子…...

蛋白多序列比对美化

1、用snapgene进行多序列比对,导出alin文件 2、用python进行多序列比对美化点击查看代码 from Bio import AlignIO import os# ====== 用户参数 ====== alignment_file = "比对.fa" # 输入比对文件(fasta/clustal) alignment_format = "fasta" html_…...

Gitee推出Remote mcp-gitee:云端MCP服务开启智能协作新时代

Gitee推出Remote mcp-gitee:云端MCP服务开启智能协作新时代 中国领先的代码托管平台Gitee近日正式发布Remote mcp-gitee服务,这项基于云端的MCP Server解决方案将彻底改变开发团队的协作方式。作为三月发布的本地版MCP Server的云端升级版本,Remote mcp-gitee无需复杂部署即…...

Gitee DevOps平台:驱动中国企业数字化转型的核心引擎

​# Gitee DevOps平台:驱动中国企业数字化转型的核心引擎 在全球数字化浪潮席卷的今天,软件开发与运维的效率直接决定了企业的市场竞争力。作为国内领先的一站式DevOps平台,Gitee通过其本土化优势和技术创新能力,正在帮助数千家企业实现研发效能的显著提升,成为中国企业数…...

10 类多布局扫描图像数据集:支撑 OCR 精度提升与 VLM 微调,覆盖广告 / 简历 / 论文等场景的计算机视觉训练数据

一、引言与背景 在人工智能与计算机视觉技术深度融合的当下,光学字符识别(OCR)与视觉语言模型(VLM)已成为文档智能处理领域的核心支撑技术,广泛应用于金融票据识别、企业文档管理、学术数据挖掘等诸多场景。然而,现有模型在面对真实世界中多样的文档类型、复杂的排版布局…...

国产化Excel开发组件Spire.XLS教程:C# 轻松将 DataSet 导出到 Excel

在 C# 开发中,DataSet 常用于管理内存中的数据,通常来源于数据库查询或系统集成过程。本文将介绍如何使用 Spire.XLS for .NET 在 C# 中导出 DataSet 到 Excel,包括创建 Excel 文件、将多个 DataTable 分别写入不同工作表、应用格式化,以及处理大数据量导出等场景。在 C# 开…...

Mysql:Docker的Mysql容器加载Levenshtein 距离算法脚本,实现“相似度匹配”

前言MySQL自带的Like函数是“包含匹配”,即查询目标需要包含指定条件字符才会匹配到;而“相似度匹配”是匹配目标与条件字符是否相似,例如:“这是北京大学”与 “北大”就会有相似度,这样就会查出这类数据信息,只不过它的相似度分数值比较低而已。为了实现这个“相似度匹…...

树链剖分

树链剖分介绍 树链剖分是什么?主要用来处理什么问题 树链剖分(Heavy-Light Decomposition, HLD)。1. 树链剖分的定义 树链剖分是一种 把树分解成若干条链 的算法技巧。 在一棵树上,我们把每个节点的“重儿子”挑出来(通常是子树规模最大的儿子),把它和父亲连成 重边,其…...

【2025-09-17】慢慢得到

20:00人的一切都应该是美的,无论面孔,还是衣裳、心灵或思想。——契诃夫连续两天都没能送孩子上学,因为约了客户都是早上9点半开会,所以必须得提前出门。提前的时间刚好碰上何太的上班时间,然后就一起出门了。考虑到在客户现场停车不方使,于是就赠何太的车去到市区再打车…...

Excel处理控件Aspose.Cells教程:如何使用Python在Excel中创建下拉列表

Excel 中的下拉列表是数据验证最实用的功能之一。在本教程中,我们将向您展示如何借助Aspose.Cells使用 Python 在 Excel 中创建下拉列表。Excel 中的下拉列表是数据验证最实用的功能之一。它允许您将用户输入限制为预定义的选项,减少错误并保持数据输入的一致性。无论您将其称…...

STM32的电子钟功能实现

一、系统架构设计 1.1 硬件组成框图 graph TD A[STM32F103C8T6] --> B[OLED0.96] A --> C[按键矩阵] A --> D[蜂鸣器] B --> I2C总线 C --> EXTI中断 1.2 核心模块划分时间管理:SysTick定时器中断(1ms精度) 显示驱动:SSD1306 OLED中文显示 用户交互:4x4矩阵…...

kylin V11安装mysql8.0.41(glibc2.28)

环境:OS:kylin V11mysql:8.0.41 glibc2.28查看系统glibc版本[root@localhost soft]# ldd --versionldd (GNU libc) 2.38Copyright (C) 2023 Free Software Foundation, Inc.This is free software; see the source for copying conditions. There is NOwarranty; not even for…...

__cpuid

__cpuid 是一个内联汇编函数,用于在 C 和 C++ 代码中获取有关 CPU 信息的指令集扩展。 这条指令利用了 x86 和 x86_64 处理器的 CPUID 指令,通过查询处理器支持的功能、型号、 制造商等硬件信息,为开发者提供了对 CPU 的低层访问。 /* x86-64 uses %rbx as the base registe…...

Gitee崛起:国产代码托管平台如何重塑企业研发效能新格局

Gitee崛起:国产代码托管平台如何重塑企业研发效能新格局 在全球数字化转型浪潮下,代码托管平台已从单纯的版本控制工具进化为企业研发效能的核心枢纽。随着国内企业对数据主权、研发自主可控需求的提升,国产代码托管平台正迎来前所未有的发展机遇。在这一背景下,Gitee凭借其…...

字节SQL数据库开发手册

1.前言:SQL在字节跳动数据驱动中的核心地位。2.SQL基础与字节跳动最佳实践。2.1.字节跳动常用SQL语法与规范。2.2.性能优化:高效SQL编写技巧..2.3.窗口函数在复杂分析中的应用。3.SQL在字节跳动核心业务场景的应用..3.1.用户增长分析..3.1.1.案例:用户留存率与活跃度分析..3…...

完整教程:视频上传以及在线播放

完整教程:视频上传以及在线播放pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; fon…...

C++ STL 常用算法

C++ 标准模板库(STL)提供了丰富的算法库(定义在 <algorithm> 头文件中),这些算法多为通用函数模板,可配合容器和迭代器高效操作数据。 1、非修改序列算法 这些算法不会改变它们所操作的容器中的元素。 1.1 find 和 find_iffind(begin, end, value):查找第一个等于…...

Gitee:中国开发者生态的成长引擎与数字化转型的加速器

Gitee:中国开发者生态的成长引擎与数字化转型的加速器 在中国软件产业快速发展的今天,Gitee作为本土领先的代码托管与协作开发平台,正以独特的本土化优势和技术创新,成为推动中国开发者生态繁荣的关键力量。从初创团队到大型企业,Gitee提供的全流程开发解决方案正在重新定…...

【IEEE出版|五邑大学主办|连续四年EI检索】第五届电子信息工程与计算机技术国际学术会议(EIECT 2025)

随着科学技术的高速发展,计算机技术革新日新月异,其智能化、网络化使人们的生活更加便捷。而电子信息工程依托计算机技术,将数据等逻辑数字转化为可解读信息,渗入到社会的方方面面,使电子及信息产品不断创新,让电子信息工程具备更广阔的前景,两者的相互结合也必将成为未…...