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

【鸿蒙开发避坑】使用全局状态变量控制动画时,动画异常甚至动画方向与预期相反的原因分析以及解决方案

【鸿蒙开发避坑】使用全局状态变量控制动画,动画异常甚至动画方向相反的原因分析以及解决方案

    • 一、问题复现
      • 1、问题描述
      • 2、问题示意图
    • 二、原因深度解析
      • 1、查看文档
      • 2、调试
      • 3、原因总结:
        • (1)第一次进入播放页面功能一切正常的原因
        • (2)第二次再次进入播放页面出现问题的原因
    • 三、解决方案
    • 四、总结与最佳实践
      • (一)核心问题归纳
      • (二)最佳实践方案
      • (三)开发建议
    • 问题版本完整代码可在代码仓库的Issues中查看

一、问题复现

1、问题描述

定义了AvPlayManager工具类对象来管理APP中歌曲的播放控制,AVPlayManager中有个应用了AppStorageV2状态存储的用于放置共享播放数据,并且使用**@ObservedV2装饰的GlobalMusic类对象currentSong**,其在AppStorageV2中的key值为'SONG_KEY',之后会在多个与音乐播放相关的页面读取这个数据。

//代码已简化,完整代码见文章末尾gitee仓库链接class AvPlayerManager {//属性+方法//播放器player: media.AVPlayer | null = null//共享播放数据currentSong: GlobalMusic = AppStorageV2.connect(GlobalMusic, 'SONG_KEY', () => new GlobalMusic())!//篇幅限制只展示部分代码}

GloabalMusic有一个使用**@Trace装饰的Boollean类型的成员isPlay**,当歌曲在播放时其值为 true,其他时候都为false

@ObservedV2
export class GlobalMusic {@Trace img: string = ""  // 音乐封面@Trace name: string = ""  // 音乐名称@Trace author: string = ""  // 作者@Trace url: string = ""  // 当前播放链接@Trace time: number = 0  // 播放时间@Trace duration: number = 0  // 歌曲总时长//歌曲列表@Trace playIndex:number=0//当前播放的歌曲索引@Trace playList:SongItemType[]=[]//播放歌曲列表//播放和暂停@Trace isPlay:boolean=false//播放的状态,默认false//播放模式@Trace playMode:'auto'|'random'|'repeat'='auto'//重置数据reset(){this.img=''this.name=''this.author=''this.url=''this.time=0this.duration=0this.playIndex=0this.playList=[]this.isPlay=falsethis.playMode='auto'}
}

在歌曲播放Play页面获取到共享播放数据全局UI状态变量引用:

  // 当前播放的歌曲,全局UI状态变量@Local playState: GlobalMusic = AppStorageV2.connect(GlobalMusic, 'SONG_KEY', () => new GlobalMusic())!

使用playState.isPlay的值来驱动歌曲播放页面的歌曲封面无限顺时针旋转动画和唱片机唱针图片旋转动画:

//代码已简化,完整代码见文章末尾gitee仓库链接//专辑封面Image(this.playState.img).rotate({angle: this.playState.isPlay?360:0,centerX: '50%',centerY: '50%'}).animation({duration: 4000, //动画时长4秒iterations: -1, //无限循环curve: Curve.Linear//匀速运动}).width('70%').borderRadius(400)// 唱针Image($r('app.media.ic_stylus')).width(200).aspectRatio(1).rotate({angle: this.playState.isPlay ? -40 : -60,centerX: 100,centerY: 30}).animation({duration: 500})

在第一次进入播放页面的时候,两个动画都能被isPlay正确触发同步(isPlay为true时,歌曲封面旋转,唱片机唱针图片旋转到歌曲封面上,isPlay为false时,歌曲封面停止旋转,唱片机唱针图片回到原位置),当点击暂停按钮(isPlay变为false)后返回上一级页面,然后再次进入这个页面时(isPlay为true),唱片机动画触发与isPlay的值是正常对应的,但是歌曲封面旋转动画不触发(即isPlay值为true,但是封面不旋转),且当下一次isPlay改变时(变为false),歌曲封面旋转动画才触发开始旋转,之后歌曲封面的旋转动画触发逻辑会与isPlay的值不对应,即isPlay为ture,但是歌曲封面却不旋转,isPlay值为false,歌曲封面却旋转,还是逆时针旋转。(有点绕。。。。。。)

2、问题示意图

在这里插入图片描述

二、原因深度解析

1、查看文档

查看鸿蒙官方开发文档中对animation动画的描述如下图:
在这里插入图片描述
鸿蒙开发文档-实现属性动画

通过文档中对于animation属性动画的原理,发现重要的线索:识别组件的可动画属性变化
重点是变化

2、调试

在包裹Image组件的父组件Row的onAppear()函数中输出日志查看isPlay的值
//代码已简化,完整代码见文章末尾gitee仓库链接Row() {//专辑封面Image(this.playState.img).rotate({angle: this.playState.isPlay?280:0,centerX: '50%',centerY: '50%'}).animation({duration: 4000, //动画时长4秒iterations: -1, //无限循环curve: Curve.Linear//匀速运动}).width('70%').borderRadius(400)}.onAppear(()=>{console.info('this.playState.isPlay值为:',this.playState.isPlay)})
}
第一次进入歌曲播放页面时,onAppear中打印日志结果如下

在这里插入图片描述

暂停歌曲播放,再退出播放界面,第二次进入歌曲播放界面时,onAppear中打印日志结果如下

在这里插入图片描述

3、原因总结:

(1)第一次进入播放页面功能一切正常的原因

首先在逻辑上,在进入播放页面时,isPlay的值并非手动设置的,而是在AvPlayerManager管理类的成员player: media.AVPlayer的绑定的状态改变监听函数中,当监听到歌曲准备就绪时再设置isPlay的值为true,且音频使用的是网络音频,需要异步网络获取资源。因此在第一次进入播放页面时,在时间线上,由于网络请求的异步性,出现animation动画先读取到isPlayfalse,然后网络音频准备就绪并设置isPlaytrueanimation识别到组件属性变化,自动添加动画。
在这里插入图片描述

(2)第二次再次进入播放页面出现问题的原因

逻辑上和第一次大部分相同,不同点在于,由于只是暂停,全局控制歌曲播放的AvPlayerManager还在,其media.AVPlayer类型成员player已经初始化过了,歌曲资源也还在内存中,当再次点击同一首歌曲进入歌曲播放界面时,歌曲能够马上准备就绪,导致在animation动画读取isPlay的值之前,歌曲已经准备就绪,isPlay已经是true了,所以animation动画相关的组件属性初始值就为true,没有发生改变,自然不会触发动画绘制,歌曲封面一开始就处于旋转了360度的状态。当点击暂停按钮时,设置isPlay的值为true,这时animation才监听到组件属性值发生变化变成了0度,触发动画360度到0度的逆时针旋转动画,就出现了逆时针旋转的现象。
在这里插入图片描述

//代码已简化,完整代码见文章末尾gitee仓库链接class AvPlayerManager {//属性+方法//播放器player: media.AVPlayer | null = null//共享播放数据currentSong: GlobalMusic = AppStorageV2.connect(GlobalMusic, 'SONG_KEY', () => new GlobalMusic())!//定义一个方法 创捷播放器+监听播放器的状态async init() {if (!this.player) {this.player = await media.createAVPlayer()}//状态监听this.player.on('stateChange', (state) => {if (state === 'initialized') {//this.player?.prepare()} else if (state === 'prepared') {this.player?.play()this.currentSong.isPlay = true} else if (state === 'completed') {this.nextPlay(true) //自动下一首} else if (state === 'released') {this.currentSong.reset()}})}
}
  • 关键矛盾点
    ▸ 首次进入时状态从falsetrue触发动画过渡
    ▸ 二次进入时状态持续为true无状态变化信号→动画系统判定无需更新

  • 动画方向异常根源
    ▸暂停操作 → isPlay: true → false → rotate(360 → 0)

  • 组件差异表现解析

组件动画类型正常/异常原因
唱片封面无限循环动画异常▶ 依赖持续的状态变化信号
▶ 角度累计导致插值异常
唱针组件定点位移动画正常✅ 目标角度固定(如45度)
✅ 状态切换时总有角度差值
  • 系统级运行机制
    在这里插入图片描述
  • 核心原因
    ▸ animation属性动画仅响应组件属性值的变更而非当前值
    ▸ 持续相同的状态值会被判定为"无变化需要处理"

三、解决方案

要使animation动画正确触发,就需要组件的可动画属性值发生变化,在本文的案例中就是组件变换中的rotate属性。

  • 1、单独设置一个状态变量angel用来控制歌曲专辑图片的旋转角度,初始化为0。当isPlay的值发生改变时angel的值也需要发生改变。可以使用@MonitorisPlay添加监视,当其值发生变化时,根据isPlay当前值改变angel的值。
  • 2、但是这样完全同步改变还不行,这样依旧会出现animation读取isPlay的值早于isPlay值发生改变的情况(当歌曲准备就绪isPlaytrue,但是动画还未初始化完成,旋转角度直接设置成360),依旧会导致动画无法正确触发。还需要判断animation是否已经初始化完毕。
  • 3、我们可以添加一个判断变量isUIReady初始值为false,在包裹图片的外层Row组件的组件生命周期函数onAppear()中对isUIReady设值为true,用于判断动画是否初始化完成。
  • 4、回到1中的@Monitor监视器,在对angle的值根据isPlay的改变进行对应改变前,需要增加一层判断逻辑:判断animation是否以及初始化,即isUIReady是否为true,当isUIReadytrue才可以对angel值进行更改。这个判断主要是应对刚进页面时防止animation初始化时根据已经变化后的isPlay值将旋转角度设置为了360
  • 简化后的示例代码如下:
// 代码已简化,完整代码见文章末尾gitee仓库链接
@Entry
@Component
struct Play {@Local playState: GlobalMusic = AppStorageV2.connect(GlobalMusic, 'SONG_KEY', () => new GlobalMusic())!;// 动画是否就绪@Local isUIReady: boolean = false;// 歌曲专辑图片旋转角度,初始化为0@Local angel: number = 0;// 监控playState的成员isPlay的值变化,应对播控中心同步及播放/暂停控制@Monitor('playState.isPlay')isPlayChange(monitor: IMonitor) {// 需要动画已经初始化好if (this.isUIReady) {this.angel = this.playState.isPlay ? 360 : 0;}}build() {Column() {// 专辑封面容器Row() {Image(this.playState.img).rotate({angle: this.angel,centerX: '50%',centerY: '50%'}).animation({duration: 4000,  // 动画时长4秒iterations: -1, // 无限循环curve: Curve.Linear}).width('70%').borderRadius(400)}.backgroundImage($r('app.media.ic_cd')).backgroundImageSize(ImageSize.Cover).onAppear(() => {this.isUIReady = true;this.angel = this.playState.isPlay ? 360 : 0;}).onDisAppear(()=>{this.isUIReady=falsethis.angel = 0})}}
}

四、总结与最佳实践

(一)核心问题归纳

问题维度技术本质典型表现
动画触发机制依赖属性值变化量而非当前值▶ 首次进入正常
▶ 二次进入失效
状态同步机制AppStorageV2数据更新时点控制▶ 异步资源加载时序冲突
▶ 组件生命周期钩子触发顺序
动画方向异常插值计算逆向路径▶ 360°→0°逆时针旋转
▶ 动画系统默认最短路径

(二)最佳实践方案

  1. 状态管理分离原则
// 状态分层架构
┌──────────────┐       ┌──────────────┐
│ 业务逻辑状态 │──────▶│ 动画驱动状态 │
  (isPlay)   (angle)    │
└──────────────┘       └──────────────┘
  • 实现方式:

    @Monitor('playState.isPlay')
    syncAnimationState() {if (this.isUIReady) {this.angle = this.playState.isPlay ? 360 : 0}
    }
    
  1. 动画初始化保障机制
Component Lifecycle:onAppear() → 设置isUIReady=true → 触发首次状态同步onDisappear() → 重置isUIReady=false
  1. 动画参数优化配置
// 防抖动配置
.animation({duration: 4000,iterations: -1,curve: Curve.EaseOut,delay: 50 // 增加启动延迟
})

(三)开发建议

这个案例体现了鸿蒙动画系统的两个重要特性:

  1. 动画触发严格依赖状态变化过程而非当前状态值
  2. 角度动画会自动计算最优路径,可能产生方向偏差

开发者需要建立「状态变更驱动动画」的思维模型,而非「状态值决定动画」的静态认知

  1. 状态监控三原则
    ✅ 监控粒度细化到具体属性
    ✅ 添加防抖/节流控制
    ✅ 结合生命周期管理

  2. 动画调试技巧

    // 调试标记
    .onClick(() => {console.debug(`[AnimationState] isPlay:${this.isPlay}, angle:${this.angle}`)
    })
    
  3. 性能优化方向

    优化策略实施方法收益点
    动画缓存预加载关键帧减少首帧延迟
    分层渲染分离静态/动态元素降低GPU负载
    精度控制使用整数角度值减少插值计算量

问题版本完整代码可在代码仓库的Issues中查看

完整解决方案源码:Gitee仓库链接
更多鸿蒙开发技巧:鸿蒙专栏目录–持续更新中

文章内容如果有误欢迎指正

相关文章:

【鸿蒙开发避坑】使用全局状态变量控制动画时,动画异常甚至动画方向与预期相反的原因分析以及解决方案

【鸿蒙开发避坑】使用全局状态变量控制动画,动画异常甚至动画方向相反的原因分析以及解决方案 一、问题复现1、问题描述2、问题示意图 二、原因深度解析1、查看文档2、调试3、原因总结:(1)第一次进入播放页面功能一切正常的原因&a…...

天拓四方锂电池卷绕机 PLC 物联网解决方案

近年来,锂电制造行业作为新能源领域的核心支柱产业,呈现出迅猛发展的态势,市场需求持续高涨。在此背景下,行业内对产品质量、生产效率以及成本控制等方面提出了更为严苛的要求。锂电制造流程涵盖混料、涂布、辊压、分切、制片、卷…...

RFID系统:技术解析与应用全景

一、技术架构与运行逻辑 RFID(Radio Frequency Identification)系统通过无线电波实现非接触式数据交互,其核心由三部分组成: 电子标签(Tag): 无源标签:依赖读写器电磁场供电&…...

hbuilderX 安装Prettier格式化代码

一、打开插件安装 搜索输入:Prettier 安装后,重启hbuilderX ,再按AltShiftF 没安装Prettier格式化: import {saveFlow,getTemplate } from "../../api/flowTemplate.js"; 安装Prettier格式化后: import …...

Python-92:最大乘积区间问题

问题描述 小R手上有一个长度为 n 的数组 (n > 0),数组中的元素分别来自集合 [0, 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024]。小R想从这个数组中选取一段连续的区间,得到可能的最大乘积。 你需要帮助小R找到最大乘积的区间,并输出这…...

Compose笔记(二十三)--多点触控

这一节主要了解一下Compose中多点触控,在Jetpack Compose 中,多点触控处理需要结合Modifier和手势API来实现,一般通过组合 pointerInput、TransformableState 和 TransformModifier 来创建支持缩放、旋转和平移的组件。 一、 API 1. Pointer…...

2025.05.17淘天机考笔试真题第一题

📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围OJ 01. 魔法棋盘构造 问题描述 LYA 正在设计一款魔法棋盘游戏。游戏棋盘由 2 n 2 \times n...

python的漫画网站管理系统

目录 技术栈介绍具体实现截图![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/0ed2084038144499a162b3fb731a5f37.png)![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/a76a091066f74a80bf7ac1be489ae8a8.png)系统设计研究方法:设计步骤设计流程核…...

系统架构设计(十):结构化编程

定义 结构化编程是一种遵循清晰逻辑结构、避免使用 goto 的编程方法。它强调使用有限的三种基本控制结构来组织程序,提高程序的可读性、可维护性和可测试性。 它是现代程序设计的基础,被广泛应用于命令式语言(如 C、Pascal、Java&#xff0…...

系统架构设计(七):数据流图

定义 数据流图(Data Flow Diagram, DFD)是一种用于表示信息系统数据流转及处理过程的图形工具。 它反映系统功能及数据之间的关系,是结构化分析与设计的重要工具。 主要符号 符号说明描述举例方框外部实体(源或终点&#xff09…...

BrepGen中的几何特征组装与文件保存详解 deepwiki occwl OCC包装库

有这种好东西我怎么不知道 AutodeskAILab/occwl: Lightweight Pythonic wrapper around pythonocc 组装几何特征以创建B-rep模型 保存为STEP和STL文件细说 Fast 快速 Searched across samxuxiang/BrepGen Ill explain how BrepGen assembles geometric features to create B-r…...

QT6 源(105)篇二:阅读与注释 QAction,给出源代码

&#xff08;5&#xff09;本源代码来自于头文件 qaction . h &#xff1a; #ifndef QACTION_H #define QACTION_H#include <QtGui/qtguiglobal.h> #if QT_CONFIG(shortcut) # include <QtGui/qkeysequence.h> #endif #include <QtGui/qicon.h> #include &…...

复旦微FMQL调试笔记:PS网口

引言 FPGA&#xff0c;全程现场可编程门阵列&#xff0c;是指一切通过软件手段更改、配置器件内部连接结构和逻辑单元&#xff0c;完成既定设计功能的数字集成电路。换个简单通俗的介绍方式&#xff0c;就好比一个全能的运动员&#xff0c;FPGA就是这么神奇的可以通过设定而实…...

SpringBoot启动流程深入分析

文章目录 背景启动流程listeners.starting先获取运行监听器获取SpringApplicationRunListener的实例监听器接口从spring.factories中加载数据&#xff0c;这里有本地缓存监听启动发布starting事件 prepareEnvironment准备环境获取或创建环境配置环境 createApplicationContext创…...

Linux - 2.系统命令

1.帮助命令 1.help [root@localhost /]# cp --help1.查看命令的信息和参数2.只能显示shell内部的命令信息3.help命令第一部分是概述,第二部分是参数详解,第三部分是说明和注意 # 使用语法 Usage: cp [OPTION]... [-T] SOURCE DESTor: cp [OPTION]... SOURCE... DIRECTORYor:…...

CSP 2024 提高级第一轮(CSP-S 2024)单选题解析

单选题解析 第 1 题 在 Linux 系统中&#xff0c;如果你想显示当前工作目录的路径&#xff0c;应该使用哪个命令&#xff1f;&#xff08;A&#xff09; A. pwd B. cd C. ls D. echo 解析&#xff1a;Linux 系统中&#xff0c;pwd命令可以显示当前工作目录的路径。pwd&#x…...

JavaScript运算符

在JavaScript开发中&#xff0c;运算符是编程的基础工具。它们用于执行各种操作&#xff0c;从简单的数学计算到复杂的逻辑判断。本文将深入探讨JavaScript中的各种运算符&#xff0c;包括算术运算符、比较运算符、布尔运算符、位运算符以及其他一些特殊运算符。 一、算术运算…...

无线信道的噪声与干扰

目录 1. 无线信道(wireless channel)与电磁波 2.1 电磁波的传输(无线信道传输) 2.2 视线(line of sight)传播与天线高度 2. 信道的数学模型 2.1 调制信道模型 2.1.1 加性噪声/加性干扰 2.1.2 乘性噪声/乘性干扰 2.1.3 随参信道/恒参信道 2.2 编码信道模型 2.3 小结 …...

计算机视觉与深度学习 | Python实现EMD-CNN-LSTM时间序列预测(完整源码、数据、公式)

EMD-CNN-LSTM 1. 环境准备2. 数据生成(示例数据)3. EMD分解4. 数据预处理5. CNN-LSTM模型定义6. 模型训练7. 预测与重构8. 性能评估核心公式说明1. 经验模态分解(EMD)2. CNN-LSTM混合模型参数调优建议扩展方向典型输出示例以下是使用Python实现EMD-CNN-LSTM时间序列预测的完…...

基于Yolov8+PyQT的老人摔倒识别系统源码

概述 随着人工智能技术的普及&#xff0c;计算机视觉在安防领域的应用日益广泛。幽络源本次分享的​​基于Yolov8PyQT的老人摔倒识别系统​​&#xff0c;正是针对独居老人安全监护的实用解决方案。该系统通过深度学习算法实时检测人体姿态&#xff0c;精准识别站立、摔倒中等…...

【网络入侵检测】基于Suricata源码分析运行模式(Runmode)

【作者主页】只道当时是寻常 【专栏介绍】Suricata入侵检测。专注网络、主机安全&#xff0c;欢迎关注与评论。 1. 概要 &#x1f44b; 在 Suricata 中抽象出线程、线程模块和队列三个概念&#xff1a;线程类似进程&#xff0c;可多线程并行执行操作&#xff1b;监听、解码、检…...

深入解析:java.sql.SQLException: No operations allowed after statement closed 报错

在 Java 应用程序开发过程中&#xff0c;尤其是涉及数据库交互时&#xff0c;开发者常常会遇到各种各样的异常。其中&#xff0c;java.sql.SQLException: No operations allowed after statement closed是一个较为常见且容易令人困惑的错误。本文将深入剖析这一报错&#xff0c…...

ARM-Linux 完全入门

1.准备部分 1.1 虚拟机安装 准备VMware软件、ubuntu系统镜像安装过程 VMware安装 破解&#xff08;自己百度破解码&#xff0c;多试几个网址&#xff0c;会有能用的&#xff09;Ubuntu安装 配置联网 桥接 虚拟机Ubuntu系统必须能连接到外网&#xff0c;不然不能更新软件安装…...

前端二进制数据指南:从 ArrayBuffer 到高级流处理

前端开发中&#xff0c;二进制数据是处理文件、图像、音视频、网络通信等场景的基础。以下是核心概念和用途的通俗解释&#xff1a; 前端二进制数据介绍 1. 什么是前端二进制数据&#xff1f; 指计算机原始的 0 和 1 格式的数据&#xff08;比如一张图片的底层代码&#xff…...

深入理解构造函数,析构函数

目录 1.引言 2.构造函数 1.概念 2.特性 3.析构函数 1.概念 2.特性 1.引言 如果一个类中什么都没有&#xff0c;叫作空类. class A {}; 那么我们这个类中真的是什么都没有吗?其实不是,如果我们类当中上面都不写.编译器会生成6个默认的成员函数。 默认成员函数:用户没有显…...

数值分析知识重构

数值分析知识重构 一 Question 请构造一下数值分析中的误差概念以及每一个具体数值方法的误差是如何估计的&#xff1f; 二 Question 已知 n 1 n1 n1个数据点 ( x i , y i ) , i 0 , 1 , ⋯ , n (x_i,y_i),i0,1,\cdots,n (xi​,yi​),i0,1,⋯,n,请使用多种方法建立数据之间…...

全端同步!ZKmall开源商城如何用B2B2C模板让消费者跨设备购物体验无缝衔接?

在数字化浪潮席卷下&#xff0c;消费者的购物行为不再局限于单一设备。早晨用手机小程序浏览商品&#xff0c;中午在 PC 端对比参数&#xff0c;晚上通过平板下单&#xff0c;跨设备购物已成常态。然而&#xff0c;设备间数据不同步、操作体验割裂等问题&#xff0c;严重影响购…...

Redis Sentinel如何实现高可用?

Redis Sentinel 通过以下核心机制实现高可用&#xff1a; 1. 监控&#xff08;Monitoring&#xff09; Sentinel 集群会持续监控主节点&#xff08;Master&#xff09;和从节点&#xff08;Slave&#xff09;的状态&#xff1a; 定期发送 PING 命令检测节点是否存活&#xf…...

环形缓冲区 ring buffer 概述

环形缓冲区 ring buffer 概述 1. 简介 环形缓冲区&#xff08;ring buffer&#xff09;&#xff0c;是一种用于表示一个固定尺寸、头尾相连的缓冲区的数据结构&#xff0c;适合缓存数据流。也称作环形缓冲区&#xff08;circular buffer&#xff09;&#xff0c;环形队列&…...

Spring源码之解决循环依赖 三级缓存

目录 三级缓存核心原理 循环依赖的解决过程 1. Bean A创建过程中提前曝光工厂 2. Bean B创建时发现依赖A&#xff0c;从缓存获取 3. Bean A继续完成初始化 三级缓存的作用总结 二级缓存为何不够解决缓存依赖&#xff1f; 三级缓存如何解决&#xff1f; 为什么不直接在…...

山东大学计算机图形学期末复习9——CG12上

CG12上 几何管线末端&#xff1a;顶点已组装成基本图元&#xff08;Primitives&#xff0c;如点、线、三角形&#xff09;。 主要任务&#xff1a; 裁剪&#xff1a;视锥体是一个三维空间区域&#xff08;由近裁剪面、远裁剪面和侧面组成&#xff09;&#xff0c;超出该区域的图…...

关于软件测试开发的一些有趣的知识

文章目录 一、什么是测试&#xff1f;二、为什么要软件测试软件测试三、测试的岗位有哪些四 、软件测试和开发的区别五、走测试岗位为什么还要学开发。4、优秀的测试人员具备的素质我为什么走测试岗位 一、什么是测试&#xff1f; 其实这个问题说简单也不简单&#xff0c;说难…...

在Solana上使用 Scaled UI Amount 扩展

本指南提供 Solana Web3.js (Legacy v 1.x) 和 Solana Kit (v 2.x) 版本。选择适当的选项卡以查看你首选库的代码片段和说明&#xff1a; Solana Web3.js (Legacy)Solana Kit 概述 Solana Token-2022 程序 引入了强大的扩展&#xff0c;增强了代币功能&#xff0c;使其超越了…...

线性表之数组与栈详解

线性表之数组与栈详解 前言一、数组&#xff08;Array&#xff09;1.1 数组的基本概念1.2 数组的实现与操作1.3 数组的应用场景1.4 数组的优缺点 二、栈&#xff08;Stack&#xff09;2.1 栈的基本概念2.2 栈的实现方式2.3 栈的应用场景 2.4 栈的优缺点 三、数组与栈的对比总结…...

车载以太网驱动智能化:域控架构设计与开发实践

title: 车载以太网驱动专用车智能化&#xff1a;域控架构设计与开发实践 date: 2023-12-01 categories: 新能源汽车 tags: [车载以太网, 电子电气架构, 域控架构, 专用车智能化, SOME/IP, AUTOSAR] 引言&#xff1a;专用车智能化转型的挑战与机遇 专用车作为城市建设与工业运输…...

【Redis】redis用作缓存和分布式锁

文章目录 1. 缓存1.1 Redis作为缓存1.2 缓存更新、淘汰策略1.3 缓存预热、缓存穿透、缓存雪崩和缓存击穿1.3.1 缓存预热&#xff08;preheating&#xff09;1.3.2 缓存穿透&#xff08;penetration&#xff09;1.3.3 缓存雪崩&#xff08;avalanche&#xff09;1.3.4 缓存击穿&…...

深度学习中独热编码(One-Hot Encoding)

文章目录 独热编码独热编码的作用独热编码的优点独热编码的缺点场景选择独热编码&#xff08;PyTorch实现&#xff09;替代方案 实际使用分析&#xff1a;对对象类型使用独热编码为什么使用独热编码是合适的&#xff1f;&#x1f4cc; 场景说明&#xff1a;&#x1f4cc; 为什么…...

如何根据竞价数据判断竞价强度,是否抢筹等

竞价强度判断方法 价格变化幅度 观察开盘价与前一交易日收盘价的差距 &#xff1a;如果一只股票在开盘集合竞价阶段价格大幅高于前一交易日收盘价&#xff0c;说明市场对该股票的预期较为积极&#xff0c;可能有资金在主动抬高价格&#xff0c;这是一种较强的竞价强度表现。例如…...

Codex与LangChain结合的智能代理架构:重塑软件开发的未来

🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言:当代码生成遇见智能决策 想象以下场景: 凌晨三点:你需要紧急修复一个遗留系统的内存泄漏漏洞,但代码注释缺失且逻辑复杂; 产品经理需求变更:要求在24小时内将现有…...

2025年PMP 学习十八 第11章 项目风险管理 (11.5~11.7)

2025年PMP 学习十八 第11章 项目风险管理 &#xff08;11.5~11.7&#xff09; 第11章 项目风险管理 序号过程过程组1规划风险管理规划2识别风险规划3实施定性风险分析规划4实施定量风险分析规划5规划风险应对执行6实施风险应对执行7监控风险监控 文章目录 2025年PMP 学习十八…...

2025年PMP 学习十七 第11章 项目风险管理 (11.1~11.4)

2025年PMP 学习十七 第11章 项目风险管理 &#xff08;11.1~11.4&#xff09; 第11章 项目风险管理 序号过程过程组1规划风险管理规划2识别风险规划3实施定性风险分析规划4实施定量风险分析规划5规划风险应对执行6实施风险应对执行7监控风险监控 文章目录 2025年PMP 学习十七…...

impala

Impala&#xff0c;它是 Cloudera 开发的开源 实时 SQL 查询引擎&#xff0c;专为 Hadoop 设计。与 Presto 类似&#xff0c;Impala 用于交互式分析&#xff0c;但架构和设计理念有所不同。以下是 Impala 的核心特点和工作原理&#xff1a; 一、Impala 核心架构 1. 组件组成 …...

湖北理元理律师事务所:债务优化中的双维支持实践解析

在债务压力与生活质量失衡的社会议题下&#xff0c;法律服务机构的功能边界正在从单一的法律咨询向复合型支持延伸。湖北理元理律师事务所通过“法律心理”双维服务模式&#xff0c;探索债务优化与生活保障的平衡路径&#xff0c;其方法论或为行业提供实践参考。 法律框架&…...

Redis设计与实现——Redis命令参考与高级特性

Redis命令参考 数据类型相关命令 SET&#xff1a;设置键值&#xff0c;支持过期时间、不存在/存在条件。GET&#xff1a;获取键值&#xff0c;若键不存在返回 nil。INCR/DECR&#xff1a;将键的整数值增1/减1&#xff0c;键不存在时初始化为0。MSET/MGET&#xff1a;批量设置…...

TCP/UDP协议原理和区别 笔记

从简单到难吧 区别就是TCP一般用于安全稳定的需求&#xff0c;UDP一般用于不那么需要完全数据的需求&#xff0c;比如说直播&#xff0c;视频等。 再然后就是TPC性能慢于UDP。 再然后我们看TCP的原理&#xff08;三次握手&#xff0c;数据传输&#xff0c;四次挥手&#xff0…...

JavaScript基础-对象的相关概念

在JavaScript中&#xff0c;对象是核心的数据结构之一&#xff0c;几乎所有的高级功能都围绕着对象展开。理解对象的基本概念、创建方法以及操作方式对于掌握JavaScript至关重要。本文将详细介绍JavaScript中对象的相关概念&#xff0c;包括对象的定义、属性的操作、原型链和面…...

如何通过交流沟通实现闭环思考模式不断实现自身强效赋能-250517

感谢一直以来和我交流沟通的朋友们。 闭环思考 文字部分&#xff08;25-05-04&#xff09;这一天是青年节&#xff0c;在这一天与青年朋友交流这个是事先规划好的&#xff1a; “可以猜一猜&#xff0c;博士会被撤销吗&#xff1f;导师会被处理吗&#xff1f;千万不要回复&…...

震荡指标工具

一、引言 - 可视化数字烛台工具是对传统蜡烛图的补充&#xff0c;旨在帮助交易者更有效地进入和退出交易&#xff0c;提高交易利润。 - 通过分析蜡烛图&#xff0c;结合烛台震荡指标&#xff0c;提出了一个辅助视觉工具来辅助交易决策。 二、烛台指标与交易策略 -图表通过平均开…...

【自然语言处理与大模型】大模型(LLM)基础知识④

&#xff08;1&#xff09;微调主要用来干什么&#xff1f; 微调目前最主要用在定制模型的自我认知和改变模型对话风格。模型能力的适配与强化只是辅助。 定制模型的自我认知&#xff1a;通过微调可以调整模型对自我身份、角色功能的重新认知&#xff0c;使其回答更加符合自定义…...

返回码的方案对比和思考

前言 一般我们定义 Restful 接口返回码&#xff0c;常见的就是 const 定义 code &#xff0c; StatusToText() 来实现定义 msg&#xff0c; 在封装1 ~ 2个返回方法&#xff08;success、error&#xff09;就可以实现&#xff0c;只是突然想到这样设计是违反开闭原则的&#xf…...