大模型对齐算法(四): DAPO,VAPO,GMPO,GSPO, CISPO,GFPO

DAPO

DAPO 在 GRPO 的基础上做了 4 处关键升级,既保持 GRPO 的“无价值函数 + 组内归一化”思想,又通过 剪枝、采样、Token 级梯度、长度惩罚 解决长 Chain-of-Thought RL 的四大痛点。


1 剪枝范围解耦:Clip-Higher

GRPO:单一对称剪枝

min⁡⁣(rt(θ)A^t,clip(rt(θ),1−ε,1+ε)A^t)\min\!\Bigl(r_t(\theta)\hat A_t,\; \mathrm{clip}(r_t(\theta),\,1-\varepsilon,\,1+\varepsilon)\,\hat A_t\Bigr)min(rt(θ)A^t,clip(rt(θ),1ε,1+ε)A^t)

DAPO:将上下界拆成 ε_low, ε_high

min⁡⁣(rt(θ)A^t,clip(rt(θ),1−εlow,1+εhigh)A^t)\min\!\Bigl(r_t(\theta)\hat A_t,\; \mathrm{clip}(r_t(\theta),\,1-\varepsilon_{\text{low}},\,1+\varepsilon_{\text{high}})\,\hat A_t\Bigr)min(rt(θ)A^t,clip(rt(θ),1εlow,1+εhigh)A^t)

其中

εhigh>εlow\varepsilon_{\text{high}}>\varepsilon_{\text{low}}εhigh>εlow

→ 给低概率 “探索 token” 更大的上升空间,防止 熵崩溃


2 动态采样:Dynamic Sampling

GRPO:固定 batch,遇到全对 / 全错 prompt → 梯度为零。
DAPO:在采样阶段 过滤掉 reward=±1 的 prompt,直到 batch 内所有 prompt 均有 有效梯度
约束加入目标:

0<∣{oi∣is_equivalent(a,oi)}∣<G0<|\{o_i \mid \text{is\_equivalent}(a,o_i)\}|<G0<{oiis_equivalent(a,oi)}<G


3 Token-Level Policy Gradient

GRPO:先对 样本内 token 求平均,再跨样本平均。
DAPO:直接对 token 级 loss 求和,避免长回答权重稀释:

JDAPO(θ)=E(q,a)∼D,{oi}i=1G∼πθold[1∑i=1G∣oi∣∑i=1G∑t=1∣oi∣min⁡⁣(ri,t(θ)A^i,t,clip(ri,t(θ),1−εlow,1+εhigh)A^i,t)]J_{\text{DAPO}}(\theta)= \mathbb{E}_{(q,a)\sim\mathcal D,\{o_i\}_{i=1}^{G}\sim\pi_{\theta_{\text{old}}}} \left[ \frac{1}{\sum_{i=1}^{G}|o_i|}\sum_{i=1}^{G} \sum_{t=1}^{|o_i|} \min\!\Bigl( r_{i,t}(\theta)\hat A_{i,t},\, \mathrm{clip}(r_{i,t}(\theta),\,1-\varepsilon_{\text{low}},\,1+\varepsilon_{\text{high}})\,\hat A_{i,t} \Bigr) \right]JDAPO(θ)=E(q,a)D,{oi}i=1Gπθold[i=1Goi1i=1Gt=1oimin(ri,t(θ)A^i,t,clip(ri,t(θ),1εlow,1+εhigh)A^i,t)]


4 长度惩罚:Overlong Reward Shaping

GRPO:截断回答直接给惩罚 −1。
DAPO:引入 Soft Overlong Punishment(长度感知)

Rlength(y)={0,∣y∣≤Lmax⁡−Lcache(Lmax⁡−Lcache)−∣y∣Lcache,Lmax⁡−Lcache<∣y∣≤Lmax⁡−1,∣y∣>Lmax⁡R_{\text{length}}(y)= \begin{cases} 0, & |y|\le L_{\max}-L_{\text{cache}}\\[4pt] \frac{(L_{\max}-L_{\text{cache}})-|y|}{L_{\text{cache}}}, & L_{\max}-L_{\text{cache}}<|y|\le L_{\max}\\[4pt] -1, & |y|>L_{\max} \end{cases}Rlength(y)=0,Lcache(LmaxLcache)y,1,yLmaxLcacheLmaxLcache<yLmaxy>Lmax

最终奖励

Rtotal(y)=Rrule(y)+Rlength(y)R_{\text{total}}(y)=R_{\text{rule}}(y)+R_{\text{length}}(y)Rtotal(y)=Rrule(y)+Rlength(y)


5 总结公式(DAPO 完整目标)

JDAPO(θ)=E(q,a)∼D,{oi}i=1G∼πθold[1∑i=1G∣oi∣∑i=1G∑t=1∣oi∣min⁡⁣(ri,t(θ)A^i,t,clip(ri,t(θ),1−εlow,1+εhigh)A^i,t)]s.t.0<∣{oi∣is_equivalent(a,oi)}∣<G,ri,t(θ)=πθ(oi,t∣q,oi,<t)πθold(oi,t∣q,oi,<t)A^i,t=Ri−μσ,Ri=Rrule(oi)+Rlength(oi)\boxed{ \begin{aligned} J_{\text{DAPO}}(\theta)= \mathbb{E}_{(q,a)\sim\mathcal D,\{o_i\}_{i=1}^{G}\sim\pi_{\theta_{\text{old}}}} \Bigg[ &\frac{1}{\sum_{i=1}^G|o_i|}\sum_{i=1}^{G} \sum_{t=1}^{|o_i|} \min\!\Bigl( r_{i,t}(\theta)\hat A_{i,t},\, \mathrm{clip}\bigl(r_{i,t}(\theta),\,1-\varepsilon_{\text{low}},\,1+\varepsilon_{\text{high}}\bigr)\hat A_{i,t} \Bigr) \Bigg]\\[2pt] \text{s.t.}\quad &0<|\{o_i \mid \text{is\_equivalent}(a,o_i)\}|<G,\quad r_{i,t}(\theta)=\frac{\pi_\theta(o_{i,t}\mid q,o_{i,<t})}{\pi_{\theta_{\text{old}}}(o_{i,t}\mid q,o_{i,<t})}\\[2pt] &\hat A_{i,t}=\frac{R_i-\mu}{\sigma},\quad R_i=R_{\text{rule}}(o_i)+R_{\text{length}}(o_i) \end{aligned} }JDAPO(θ)=E(q,a)D,{oi}i=1Gπθold[s.t.i=1Goi1i=1Gt=1oimin(ri,t(θ)A^i,t,clip(ri,t(θ),1εlow,1+εhigh)A^i,t)]0<{oiis_equivalent(a,oi)}<G,ri,t(θ)=πθold(oi,tq,oi,<t)πθ(oi,tq,oi,<t)A^i,t=σRiμ,Ri=Rrule(oi)+Rlength(oi)


6 一句话总结

DAPO = GRPO

  • Clip-Higher(解决熵塌陷)
  • Dynamic Sampling(解决零梯度)
  • Token-Level Loss(解决长回答稀释)
  • Soft Length Penalty(解决截断噪声)
    AIME 50 分,仅用 50% 训练步数

VAPO

VC-PPO + DAPO

VC-PPO

value pretraining

1. 背景知识
  • Reward模型:在强化学习中,reward模型通常只在**最后一个token(即EOS token)**处给出评分,前面的token是没有奖励信号的。
  • Value模型:Value模型的作用是估计每个token位置的期望回报(即未来能获得的奖励总和)。
  • 热启(warm start):通常会用reward模型的参数来初始化value模型,因为两者都是输出一个标量值。
2. 问题分析
  • Reward模型的训练目标:reward模型只在EOS token处训练,因此它学会的是:
    • EOS token处的值是合理的(接近真实奖励)。
    • EOS token之前的token的值是未训练的,通常会被模型默认赋予较小的值(因为训练时这些位置的值没有约束,模型倾向于输出较小的值)。
  • Value模型的初始化:如果用reward模型的参数来初始化value模型,那么:
    • EOS token处的value初始值是合理的(因为reward模型在此处训练过)。
    • EOS token之前的token的value初始值会偏小(因为reward模型在这些位置的输出是未训练的,倾向于小值)。
3. 后果
  • Value偏小导致的问题
    • 在强化学习中,**advantage(优势函数)**的计算依赖于value的估计:
      [
      A_t = r_t + V(s_{t+1}) - V(s_t)
      ]
    • 如果靠前的token的value初始值偏小,那么( V(s_t) )会偏小,导致advantage ( A_t )偏大(因为减去的( V(s_t) )偏小)。
    • 这会让模型误以为靠前的token“很好”,从而倾向于生成更短的序列(因为靠前的token被高估了,模型会提前结束序列以获得更高的advantage)。
4. 直观理解
  • 比喻:想象你在玩一个游戏,游戏结束时才给你奖励。但你的“价值预测器”一开始被初始化得很奇怪:
    • 游戏结束时,它能准确预测奖励(比如100分)。
    • 游戏开始时,它却预测价值很低(比如0分)。
  • 后果:你会觉得“游戏开始时的价值很低,但下一步突然变高了”,于是你会倾向于“提前结束游戏”来获得这个“突然变高”的优势。这就是模型倾向于生成短序列的原因。
5. 总结
  • 核心原因:reward模型只在EOS token处训练,导致EOS之前的token的value初始值偏小。
  • 后果:靠前的token的advantage被高估,模型倾向于提前结束序列,导致生成短序列(无法生成长CoT)。

这就是为什么论文中提出value pretraining(提前用离线数据训练value模型),来避免这种初始化偏差。

一些思考:

论文其实没有真正从细节说明为啥value和advantage在eos附近断崖式drop的现象消失了

1. 价值预训练的目标值

论文原文(§3.2 第 4–5 段):

“Continuously generate responses by sampling from a fixed policy … update the value model using GAE with λ = 1.0, also known as the Monte-Carlo return.”

“Train the value model until key training metrics, including value loss and explained variance, attain sufficiently low values.”

也就是说,作者只说了“用 λ=1.0 的 MC return 当目标”,没有解释网络怎么保证前缀 token 不塌缩到同一个常数。


2. 训练曲线

论文图 6 给了 value-loss 的两段式下降,但没有给出 value 随 token 位置变化的曲线


decouple GAE
论文中提出的 Decoupled-GAE(解耦广义优势估计) 指的是:

在强化学习训练过程中,将价值模型(critic)和策略模型(actor)在计算广义优势估计(GAE)时使用的λ参数进行解耦,分别独立设置,以解决长链式思考(long-CoT)任务中价值估计的偏差和策略更新的方差问题。

具体而言:

  • 价值模型(critic)
    使用较大的λ值(论文中设为 λ=1.0),以保证奖励信号在长序列中无衰减地传播,从而避免价值估计的偏差(bias),实现更准确的价值估计。

  • 策略模型(actor)
    使用较小的λ值(论文中设为 λ=0.95),以降低策略梯度估计的方差(variance),加速策略收敛,提升训练稳定性。

通过这种方式,Decoupled-GAE 实现了:

  • 价值模型的无偏更新
    通过λ=1.0的蒙特卡洛回报(Monte-Carlo return),确保价值估计准确,避免奖励信号衰减。

  • 策略模型的稳定高效更新
    通过λ=0.95降低方差,避免策略更新过程中的震荡或不稳定,提升训练效率和稳定性。

简而言之,Decoupled-GAE 就是一种在强化学习训练过程中,分别为价值模型和策略模型设置不同λ参数的策略,以兼顾价值估计的准确性和策略更新的稳定性,特别适用于长链式思考(long-CoT)任务

GMPO

https://zhuanlan.zhihu.com/p/1934575387687490603

GSPO

https://blog.csdn.net/weixin_36378508/article/details/150395944

CISPO

https://blog.csdn.net/weixin_36378508/article/details/150395944

GFPO

https://zhuanlan.zhihu.com/p/1939843423994610732

把大象放进冰箱需要三步,把 LLM 训练成奥数冠军却需要五步:GRPO → GMPO → GSPO → CISPO → GFPO。
本文一次讲清每个字母背后的动机、公式差异与实战效果,并给出一张“对照速查表”,让你 5 分钟就能选对自己任务的算法。


0. 开场白:为什么大家集体“卷”GRPO?

2024 年开始,大模型后训练出现一条清晰技术路线:

  1. 冷启动 SFT →
  2. 在线 RL(可验证奖励) →
  3. 推理时 scaling(长 CoT)。

在线 RL 的核心矛盾是:不要价值模型,还要稳定训练
于是 DeepSeek 提出 GRPO(Group Relative Policy Optimization):

  • 把价值网络扔掉,省 50 % 显存;
  • 用“同 prompt 多条回答”做组内相对奖励,简单有效。

但很快,社区发现 GRPO 有三宗罪

罪名现象根因
长度偏差正确答案越来越短,错误答案越来越长算术平均 + token 归一化
离群值爆炸几个 token 的权重把策略拉飞算术平均对极端值敏感
MoE 不稳定专家路由一变,token 级权重全乱token 级重要性采样

接下来的一年,就是“打补丁”的一年——GMPO、GSPO、CISPO、GFPO 接连登场。


1. GRPO:把“价值网络”扔进历史的垃圾桶

  • 核心公式
    LGRPO=1G∑i=1G1∣oi∣∑t=1∣oi∣min⁡⁣(ρi,tA^i,clip(ρi,t,1⁣−⁣ϵ,1⁣+⁣ϵ)A^i)\mathcal L_{\text{GRPO}}=\frac{1}{G}\sum_{i=1}^{G}\frac{1}{|o_i|}\sum_{t=1}^{|o_i|} \min\!\Bigl(\rho_{i,t}\hat A_i,\ \text{clip}(\rho_{i,t},1\!-\!\epsilon,1\!+\!\epsilon)\hat A_i\Bigr)LGRPO=G1i=1Goi1t=1oimin(ρi,tA^i, clip(ρi,t,1ϵ,1+ϵ)A^i)
    其中

    • (G):组内样本数
    • (ρi,t\rho_{i,t}ρi,t=πθ/πold\pi_\theta/\pi_{\text{old}}πθ/πold):token 级概率比
    • (A^i\hat A_iA^i):序列级相对优势(组内标准化)
  • 一句话总结
    “token 级裁剪 + 算术平均” → 省价值模型,但易震荡。


2. GMPO:把“算术平均”换成“几何平均”

  • 痛点
    GRPO 的算术平均对离群 token 太敏感,训练曲线像过山车。

  • 补丁
    几何平均天然把极端值压到地板。
    核心改动只是把公式里的“平均”换成“几何平均”:

    LGMPO=1G∑i=1G(∏t=1∣oi∣ρi,t1∣oi∣)A^i\mathcal L_{\text{GMPO}}=\frac{1}{G}\sum_{i=1}^{G} \left(\prod_{t=1}^{|o_i|}\rho_{i,t}^{\frac{1}{|o_i|}}\right)\hat A_i LGMPO=G1i=1Gt=1oiρi,toi1A^i

  • 效果
    同资源下 +4.1 % AIME24(DeepSeek-R1-Distill-7B),
    还能把裁剪范围从 (0.8,1.2) 扩到 (e{-0.4},e{0.4}),探索更野。


3. GSPO:干脆把“token”扔掉,改成“序列”

  • 痛点
    token 级权重在长序列里累积方差 → 训练崩溃;
    MoE 里路由一变,权重直接“量子隧穿”。

  • 补丁
    整句采样权重代替逐 token 权重:
    si(θ)=exp⁡⁣(1∣oi∣∑t=1∣oi∣log⁡ρi,t)s_i(\theta)=\exp\!\Bigl(\frac{1}{|o_i|}\sum_{t=1}^{|o_i|}\log\rho_{i,t}\Bigr) si(θ)=exp(oi1t=1oilogρi,t)
    整条序列共享同一个 (s_i) 进行裁剪,梯度一次性广播到所有 token

  • 效果

    • 训练全程无崩溃,不再需要“routing replay”(MoE 稳定器)。
    • 在 Qwen3-30B-A3B 上,同等计算量 AIME24↑2.3 %

4. CISPO:别剪 token,剪“权重”

  • 痛点
    token 级裁剪把关键反思词(“Wait”、“Recheck”)直接剪没,长 CoT 断流。

  • 补丁
    保留所有 token,只裁剪重要性权重 IW:
    IWclip=clip⁣(IW,1−ϵ,1+ϵ)\text{IW}_{\text{clip}}=\text{clip}\!\bigl(\text{IW},\ 1-\epsilon,\ 1+\epsilon\bigr) IWclip=clip(IW, 1ϵ, 1+ϵ)

  • 效果

    • 关键 token 不再被误伤;
    • 50 % 训练步数即可追平 DAPO 性能。

5. GFPO:给“组”再做个过滤

  • 痛点(推测)
    组内样本质量参差不齐,坏样本拖累梯度。

  • 补丁(推测)
    在 GSPO 基础上加一层 Group Filter
    用轻量 reward model 先给每条回答打分,
    只保留 top-k 样本进入最终优化,
    相当于“先筛后炼”。

  • 效果(待官方报告)


6. 一张对照速查表

算法优化粒度平均方式重要性权重裁剪级别是否用 value解决痛点
GRPOtoken算术token ρtoken省 value,但易崩
GMPOtoken几何token ρtoken抗离群
GSPOsequence算术序列 ssequence抗长序列+MoE
CISPOtoken算术token ρ权重级保关键 token
GFPOsequence算术序列 ssequence组内再过滤

7. 怎么选?

  • 短回答 / 代码补全GMPO/CISPO(token 级仍有用)
  • 长 CoT / MoE 大模型GSPO/GFPO(序列级更稳)
  • 资源紧张 / 想先跑通GRPO(baseline 够用)

8. 尾巴

从 GRPO 到 GFPO,短短一年,我们看到了 “简化→稳定→再简化” 的螺旋上升:

扔掉价值网络 → 扔掉算术平均 → 扔掉 token 级权重 → 扔掉坏样本
每一步都在回答同一个问题:
如何在无价值模型的前提下,既省资源又训得稳?

答案或许还没写完,下一篇论文,也许就叫 “XFPO” 😉

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/919431.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/919431.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenHarmony之「星链Data」—— 分布式数据管理子系统核心架构与实战解密

目录 系统概述 架构设计 核心模块详解 数据库实现与设计原理 关键函数调用流程链 实际案例分析 常见需求与Bug分析 性能监控与调优

基于SpringBoot+Vue的写真馆预约管理系统(邮箱通知、WebSocket及时通讯、协同过滤算法)

&#x1f388;系统亮点&#xff1a;邮箱通知、WebSocket及时通讯、协同过滤算法&#xff1b;一.系统开发工具与环境搭建1.系统设计开发工具前后端分离项目架构&#xff1a;B/S架构 运行环境&#xff1a;win10/win11、jdk17前端&#xff1a; 技术&#xff1a;框架Vue.js&#xf…

linux下timerfd和posix timer为什么存在较大的抖动?

在linux中开发引用&#xff0c;timerfd和posix timer是最常用的定时器。timerfd是linux特有的定时器&#xff0c;通过fd来实现定时器&#xff0c;体现了linux"一切皆文件"的思想&#xff1b;posix timer&#xff0c;只要符合posix标准的操作系统&#xff0c;均应支持…

网络聚合链路与软件网桥配置指南

网络聚合链路与软件网桥配置指南一、聚合链路&#xff08;Team&#xff09; 网络组队&#xff08;聚合链路&#xff09;是一种将多个网络接口控制器&#xff08;NIC&#xff0c;Network Interface Controller&#xff09;以逻辑方式组合在一起的技术&#xff0c;通过这种方式可…

IDE/去读懂STM32CubeMX 时钟配置图(有源/无源晶振、旁路/晶振模式、倍频/分频)

文章目录概述配置图元素说明RCCHSI/LSI/HSE/LSEAHB 和 APBSYSCLK 和 HCLKMux 多路复用器Prescaler 预分频器PLL 锁相环PLL 配置寄存器时钟物理源内部时钟和驱动无源晶振和驱动有源晶振和驱动MCO 时钟信号音频时钟配置晶体振荡器&#xff1f;外部时钟源类型RCC 如何选择旁路模式…

8 文本分析

全文检索与常规关系型数据库SQL查询的显著区别&#xff0c;就是全文检索具备对大段文本进行分析的能力&#xff0c;它可以通过文本分析把大段的文本切分为细粒度的分词。 elasticsearch在两种情况下会用到文本分析&#xff1a; 原始数据写入索引时&#xff0c;如果索引的某个字…

告别 Count Distinct 慢查询:StarRocks 高效去重全攻略

在大数据分析中&#xff0c;去重计算&#xff08;如 Count Distinct&#xff09;是一个常见但计算开销极高的操作&#xff0c;尤其在高基数和高并发场景下&#xff0c;常常成为查询性能的瓶颈。以用户访问行为为例&#xff0c;同一用户一天内多次访问页面时&#xff0c;PV 会累…

MVC、MVP、MVCC 和 MVI 架构的介绍及区别对比

✅作者简介&#xff1a;大家好&#xff0c;我是 Meteors., 向往着更加简洁高效的代码写法与编程方式&#xff0c;持续分享Java技术内容。 &#x1f34e;个人主页&#xff1a;Meteors.的博客 &#x1f49e;当前专栏&#xff1a; ✨特色专栏&#xff1a; 知识分享 &#x1f96d;本…

【运维进阶】Ansible 角色管理

Ansible 角色管理 实验环境 [lthcontroller ~ 21:47:45]$ mkdir web && cd web[lthcontroller web 21:47:50]$ cat > ansible.cfg <<EOF [defaults] remote_user lth inventory ./inventory[privilege_escalation] become True become_user root become_m…

个人笔记SpringMVC

SpringMVC 1. 1.新建一个Maven-webapp项目 2.导入依赖pom.xml <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.…

arcgis-提取范围中最大占比面积的信息或唯一值

此方法本来应用于计算图斑占最大面积的房屋质量等别/高程/坡度级别&#xff08;房屋质量等别/高程/耕地坡度计算在无特定条件下&#xff0c;遵循按面积占比最大值信息赋值&#xff09;。1、测试数据中&#xff0c;增加唯一值字段&#xff1a;WYZ&#xff0c;并刷上图斑唯一值信…

Webapi发布后IIS超时(.net8.0)

文章目录前言一、报错信息二、日志分析三、分析四、最终解决办法&#xff1a;前言 最近实现服务器数据导出&#xff1a; .net8.0的webapi 获取到post请求&#xff0c;查询数据后dbReader导出到workbook. 并保存Excel到远程的文件服务器。 问题&#xff1a;本地调试无问题&…

linux中的hostpath卷、nfs卷以及静态持久卷的区别

在 Linux 容器环境中&#xff0c;HostPath 卷、NFS 卷和静态持久卷&#xff08;Static PersistentVolume&#xff09;是数据持久化的重要方案。三者的核心差异体现在管理方式、适用场景、跨节点能力等方面。核心定义与工作原理1. HostPath 卷定义&#xff1a;直接将容器所在宿主…

Unity 中控开发 多路串口服务器(一)

一 Unity 中控开发 多路串口服务器 多路串口服务器基础型号配置被控投影设备LG-UART8 算法配置软件结果测试多路串口服务器 你好&#xff01; 这是关于一篇使用TCP调用多路串口服务器的系列文章。在后续文章中,会结合使用Unity做一个中控系统 基础 型号 ULEGS 多路串口服务…

服务器数据恢复—硬盘坏道离线导致raid崩溃的StorNext文件系统数据恢复案例

服务器存储数据恢复环境&故障&#xff1a; 一台昆腾存储设备中有一组raid5磁盘阵列。阵列上有两块硬盘先后离线&#xff0c;raid5磁盘阵列不可用。服务器存储数据恢复过程&#xff1a; 1、将故障服务器存储内的所有磁盘编号后取出&#xff0c;将所有没有离线的硬盘以只读方…

C++小游戏NO.1游戏机

#include<conio.h> #include<windows.h> #include<bits/stdc.h> #include<cstdlib> #include<ctime> #include<vector> #include<string> using namespace std; int Your6,Other6; string daojuname[]{"放大镜","sho…

OpenHarmony WebView引擎:从Chromium魔改到分布式渲染的终极解析

🏗️ 架构解析 arkweb是OpenHarmony webview组件的Native引擎,基于Chromium和CEF构建。 OpenHarmony WebView是基于Chromium CEF构建的高性能Web渲染引擎,为OpenHarmony系统提供完整的Web内容展示能力。该引擎采用分层架构设计,实现了与ArkUI的深度集成。 🏗️ 架构设…

Mybatis-3自己实现MyBatis底层机制

MyBatis整体架构分析一图胜千言1、Mybatis核心框架示意图2、对上图的解读1)mybatis的核配置文件mybatis-config.xml:进行全局配置&#xff0c;全局只能有一个这样的配置文件XxxMapper.xml配置多个SQL,可以有多个XxxMappe.xml配置文件 2)通过mybatis-config.xml配置文件得到SqlS…

Uniapp 之renderjs解决swiper+多个video卡顿问题

一、效果图二、示例代码 test.vue<template><view style"" :style"{height: windowHeightpx}"><swiper class"video-swiper" vertical change"swiperChange" :current"current" animationfinish"swiper…

设计模式之【快速通道模式】,享受VIP的待遇

文章目录一、快速通道模式简介1、简介2、适用场景二、示例1、JDK源码&#xff1a;ArrayList构造方法2、String.intern()方法3、缓存系统设计&#xff08;典型&#xff09;三、注意事项1、核心设计原则2、避坑指南参考资料一、快速通道模式简介 1、简介 快速通道模式是一种基于…