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

skia的学习与研究

最近再研究skia,特地发一篇文章来记录一下。Skia版本更新非常频繁,大概每四周就会创建一个新版本,此版本持续维护六周左右就会被标记为稳定分支
在这里插入图片描述

skia三套渲染:

  1. 无gpu硬件如嵌入式设备,使用CPU渲染,使用软光栅化(soft rasterizer)来处理图形渲染;
  2. 无gpu硬件但在win下,CPU渲染使用Win的Warp; Windows 高级光栅化平台 (WARP) 指南
  3. 有gpu硬件(独立显卡&集成显卡)使用GPU绘制;

文档链接:

官方文档:User Documentation | Skia
API文档: skia api
win下skia编译: Windows环境编译skia库_skia 编译-CSDN博客
skia图形后端:主要是依靠google自家开源的图形后端angle 来实现,现在angle主要是ANGLE 目前提供从 OpenGL ES 2.0、3.0 到
在这里插入图片描述

调试工具Fiddle:

Skia Fiddle 的工具,这是一个专门用于测试和演示 Skia 代码片段的 Web 工具。Skia Fiddle 允许开发者在浏览器中编写和运行 Skia 代码,查看绘图结果,并分享代码片段。 Skia Fiddle
fiddle 有案例教程named: Skia Fiddle

skia模块:

web端: 作为 Skia 的核心绘制接口,它提供了一系列绘制图形的方法,如绘制点、线、矩形、圆形、文本等。Skia 现在提供了一个 WebAssembly 构建版本, CanvasKit , 将 WebGL 上下文封装为一个 SkSurface;
SkCanvas:在 Android 开发中,自定义 View 时常常会使用 SkCanvas 来实现特定的图形绘制效果。
path:在图形绘制和处理中path在skia扮演着至关重要的角色。Path 允许你定义各种复杂的 2D 形状和轮廓,是实现高级图形效果和自定义绘图的基础,简单的几何形状,如直线、矩形、圆形、椭圆等;
SkPaint与SkPath区别:SkPaint 负责绘制属性和效果 ,绘制的颜色、透明度和绘制样式,SkPath 负责图形的形状和轮廓, 绘制的图形的轮廓,包括直线、曲线、矩形、圆形、椭圆等几何形状及其组合;
SkBitmap与skimage的区别:SkBitmap是光栅位图,包含实际的像素数据比如RGBA8888/RGB888/RGB565。它主要用于管理和操作位图数据,包括读取、写入和修改像素。SkImage 是一个只读操作,主要用于如图像显示渲染、纹理缓存。

关于Skia做三维:

首先skia是二维渲染引擎,里面根本就没有三维的概念!有的人问是否可以把它改造成也支持三维,但是最好不要这样做。不然工作量会非常大非常多。

  1. 先不说顶点着色器、曲面细分着色器、几何着色器、计算着色器(skia目标主要是二维,甚至还有软光栅,他的目标就是只支持二维的通用语跨平台跟三维的目标有差距外);
  2. skia没有材质系统/光照系统/camera,要自己实现一套材质系统/光照系统难度比较大工作量也很大,比如实现PBR的材质/光照/camera就很难。
  3. 3D资源模型的解析也无,对应的3D资源管理也没,3D的场景图或场景管理也没有;
  4. pipline也无,粒子系统、骨骼动画、物理系统、全部都没有只有;
    所以综上所述skia就是提供最基础的渲染跟直接裸写opengl的没区别,它就不适合3D

源码剖析:

深入理解Flutter的图形图像绘制原理——图形库skia剖析
内存管理: SkBudgeted

  • 当使用 SkBudgeted::kYes 时,Skia 会尝试在其内部的内存预算范围内进行操作,这意味着 Skia 会对创建和使用的资源(如图像、纹理、缓存等)进行管理,避免过度分配内存。
  • 避免内存溢出:在一些资源受限的环境中,如移动设备或嵌入式系统,内存是非常宝贵的资源。通过设置 SkBudgeted::kYes,Skia 可以根据预先设定的内存预算来决定是否创建新的资源,或者在必要时释放一些不再使用的资源,从而避免因内存使用过多导致的系统崩溃或性能下降。
  • Skia 会定期检查和清理不再使用的资源,以释放内存空间。当设置为 SkBudgeted::kYes 时,这种资源回收机制会更加积极主动。例如,对于一些已经不再需要的纹理或缓存,Skia 会及时将其释放,以确保内存使用保持在预算范围内

skia渲染属性一、

skia的坐标系:
Skia Coordinate Spaces | Skia
device与local坐标系: device与local坐标系从左上角的(0, 0)到右下角的(w, h)的范围, 默认情况下,本地和设备坐标系相同;片源着色器的坐标是local坐标。
修改local坐标系是直接使用canvas->translate/scale等;
修改着色器的坐标比如: SkGradientShader::MakeLinear函数的localMatrix;

色彩空间:
skia : Skia Color Management | Skia
以D50 XYZ颜色空间为中间者、在任意两个颜色空间之间做转换,
在这里插入图片描述

alpha预乘:
在 Skia 管线里,每个 SkShader 都会返回预乘Alpha的颜色,如果从一个非预乘的SkImage(例如常见的 PNG 格式图像)开始,将其转换为SkImageShader并进行求值,得到的颜色值是经过预乘处理的,即[RA, GA, B*A, A] ,而不是原本未预乘的[R, G, B, A];

线性与非线性颜色空间转换:
toLinearSrgb 和 fromLinearSrgb 函数用于在 sRGB 和线性 sRGB 颜色空间之间进行转换;

// sRGB 颜色空间转换为线性 RGB 采用分段函数,分为线性和非线性两部分
// 当 sRGB 颜色值较小时(小于等于 0.04045),采用线性转换公式 C_linear = C_srgb / 12.92
// 当 sRGB 颜色值较大时(大于 0.04045),采用非线性转换公式 C_linear = ((C_srgb + 0.055) / (1 + 0.055)) ^ 2.4
// 其中 0.04045 是线性和非线性转换的分界点
// 12.92 是通过计算 (1 + 0.055) / (0.04045 ^ (1 / 2.4)) 得到,保证线性和非线性转换在分界点处连续
// 0.055 是 sRGB 非线性转换公式中的偏移常量
// 2.4 是 sRGB 非线性转换公式中的伽马值
vec3 toLinearSrgb(vec3 srgb) {const float a = 0.055;  // sRGB 非线性转换公式中的偏移常量return mix(srgb / 12.92,  // 线性转换部分pow((srgb + a) / (1.0 + a), vec3(2.4)),  // 非线性转换部分step(0.04045, srgb)  // 根据 srgb 值是否大于 0.04045 选择线性或非线性转换);
}// 将线性 RGB 颜色转换为 sRGB 颜色
// 从线性 RGB 转换回 sRGB 同样采用分段函数
// 当线性 RGB 颜色值较小时(小于等于 0.0031308),采用线性转换公式 C_srgb = C_linear * 12.92
// 当线性 RGB 颜色值较大时(大于 0.0031308),采用非线性转换公式 C_srgb = (1 + 0.055) * (C_linear ^ (1 / 2.4)) - 0.055
// 0.0031308 是线性和非线性转换的分界点,通过将线性和非线性转换公式在分界点处相等计算得到
// 12.92、0.055 和 2.4 的含义与 toLinearSrgb 函数中相同
vec3 fromLinearSrgb(vec3 linear) {const float a = 0.055;  // sRGB 非线性转换公式中的偏移常量return mix(linear * 12.92,  // 线性转换部分(1.0 + a) * pow(linear, vec3(1.0 / 2.4)) - a,  // 非线性转换部分step(0.0031308, linear)  // 根据 linear 值是否大于 0.0031308 选择线性或非线性转换);
}

blender混合:
SkPaint Overview | Skia Skia 使用默认的 SkBlendMode::kSrcOver`进行混合;跟opengl的混合模式一样 混合 - LearnOpenGL CN

skia的shader-SKSL

sksl资料:
SKSL教程
验证sksl
sksl debug

sksl简介:
skia的shader使用的是sksl,sksl是skia自定义的shader语法,底层由angle实现图形后端RHI;SKSL只开放了片源着色器!sksl与glsl很类似但是特别要住于他俩的区别, 由于:使用GLSL语言,您正在编程GPU管线的阶段。使用SKSL,您正在编程SKIA这个2D图形引擎的管道的阶段(引擎图形后端封装一层)。

SkSL 效果是 Skia 管道的一部分。当你发出画布绘图操作指令时,Skia(通常)会组装一个单一的 GPU 片段着色器来完成所有必要的工作。这个色器通常包括几个部分。例如,它可能包括:

  • 评估一个像素是否在被绘制的形状内部或外部(或者在边界上,在这种情况下可能会应用抗锯齿)。
  • 评估一个像素是否在剪裁区域的内部或外部(同样,对于边界像素可能会有抗锯齿逻辑)。
  • SkPaint 上的 SkShader 的逻辑。SkShader 实际上可以是一个对象树(由于 SkShaders::Blend 和下面描述的其他特性)。
  • 类似的 SkColorFilter 逻辑(它也可以是一个树结构,由于 SkColorFilters::Compose、SkColorFilters::Blend 和下面描述的特性)。
  • 混合代码(对于某些 SkBlendModes,或者通过 SkPaint::setBlender 指定的自定义混合)。
  • 颜色空间转换代码,作为 Skia 颜色管理的一部分。

即使 SkPaint 在 SkShader、SkColorFilter 或 SkBlender 字段中有一个复杂的对象树,仍然只有一个 GPU 片源着色器。该树中的每个节点都会创建一个函数。剪裁代码和几何代码各自创建一个函数。混合代码可能会创建一个函数。总体片段着色器然后调用所有这些函数(这些函数可能会调用其他函数,例如在 SkShader 树的情况下)。(号称很优化的HSR技术、函数复用、内联函数、预计算或缓存 减少overdraw但是我感觉有点吹过头了吧,不过除非二维的比较什么…)

清空:
SkCanvas 的 canvas->clear(SK_ColorGRAY);作用清除画布:clear 方法会清除画布上的所有内容。填充颜色:clear 方法会用指定的颜色填充整个画布。跟 glClear(GL_COLOR_BUFFER_BIT)类似!

原始图像着色器:
在SkImage::makeRawShader 采样计算是属于线性空间如果后续需要绘制到屏幕上需要伽马矫正或需要进行颜色空间的变换的。所以makeRawShader主要是用于对存储法线、粗糙度、oa、高度图或恰好存储在图像中的任何其他纯数学数据的图像。它的工作方式与常规图像着色器(包括过滤和平铺)类似,但有一些主要区别:

  • 不应用色彩空间转换(忽略图像的色彩空间)。
  • alpha 类型为 kUnpremul 的图像不会自动预乘。
  • 不支持双三次滤波(Bicubic filtering)调用makeRawShader时请求双三次过滤将返回nullptr 。

sksl renderTaget(FBO)
sksl 采样二维纹理SkSL_EvaluatingImageShader
sksl调用另一个render pass,动态组合着色器片段
sksl坐标系:
在这里插入图片描述

参考资料:

漫谈史上最强Skia 2D渲染引擎(少谈优点,多谈缺点)
深入理解Flutter的图形图像绘制原理——图形库skia剖析
[总结] 漫谈HDR和色彩管理(二)颜色空间 - 知乎

相关文章:

skia的学习与研究

最近再研究skia,特地发一篇文章来记录一下。Skia版本更新非常频繁,大概每四周就会创建一个新版本,此版本持续维护六周左右就会被标记为稳定分支; skia三套渲染: 无gpu硬件如嵌入式设备,使用CPU渲染,使用…...

Linux--基础命令3

大家好,今天我们继续学习Linux的基础命令 mv命令 mv命令是move的缩写,可以用来移动文件或者将文件改名 move(rename) files,经常⽤来备份⽂件或者目录 语法: mv [ 选项 ] 源⽂件或目录 目标⽂件或目录 mv src[文件、目录] dst[路径、文…...

[LeetCode]day33 150.逆波兰式求表达值 + 239.滑动窗口最大值

逆波兰式求表达值 题目链接 题目描述 给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。 请你计算该表达式。返回一个表示表达式值的整数。 注意: 有效的算符为 ‘’、‘-’、‘*’ 和 ‘/’ 。 每个操作数(运…...

记一次误禁用USB导致键盘鼠标失灵的修复过程

背景说明 在电脑上插入了一个USB hub,然后弹窗提示:“集线器端口上出现电涌”,点开让选择“重置”或者“关闭”,不小心点了关闭,结果这个usb口就被关了,再插任何东西都没反应,找了很多办法都恢…...

node项目前后端密码加密传输及存储方案

前端:使用crypto-js库的SHA256算法,包含用户注册时使用的邮箱加上自定义的secret key生成盐值,接着使用PBKDF2算法进行加密。最后将加密后的密码传给后端。 import CryptoJS from "crypto-js";export const encryptPassword (ema…...

GIt分支合并

分支 1: C0 → C1 → C2 → C3(最新) 分支 2: C0 → C4 → C5 → C6(最新)1. 找到共同父节点 C0 Git 会先找出 branch1 和 branch2 的共同祖先节点 C0。这通常借助 git merge-base 命令达成,虽然在日常使用 git merge…...

Python 入门教程(2)搭建环境 | 2.3、VSCode配置Python开发环境

文章目录 一、VSCode配置Python开发环境1、软件安装2、安装Python插件3、配置Python环境4、包管理5、调试程序 前言 Visual Studio Code(简称VSCode)以其强大的功能和灵活的扩展性,成为了许多开发者的首选。本文将详细介绍如何在VSCode中配置…...

linux一些使用技巧

linux一些使用技巧 文件名称和路径的提取切换用户执行当前脚本一行演示单引号与双引号的使用curl命令仅输出响应头信息,不输出body体文件名称和路径的提取 文件路径为 /tmp/tkgup/test.sh 方式获取文件名获取文件路径获取文件全路径方式一basename ${file}dirname ${file}real…...

GPU/CUDA 发展编年史:从 3D 渲染到 AI 大模型时代(上)

目录 文章目录 目录1960s~1999:GPU 的诞生:光栅化(Rasterization)3D 渲染算法的硬件化实现之路学术界算法研究历程工业界产品研发历程光栅化技术原理光栅化技术的软件实现:OpenGL 3D 渲染管线设计1. 顶点处理&#xff…...

chrome Vue.js devtools 提示不支持该扩展组件,移除

可能是版本不兼容,可以重新安装,推荐网址极简插件官网_Chrome插件下载_Chrome浏览器应用商店 直接搜索vue,下载旧版,vue2、vue3都支持,上面那个最新版本试了下,vue2的肯定是不能用...

大模型工程师学习日记(十):基于 LangChain 构建向量存储和查询 Qdrant

Qdrant介绍 Qdrant(读作:quadrant /kwɑdrənt/ n. 象限;象限仪;四分之一圆)是一个向量相似度搜索引擎。它提供了一个生产就绪的服务,具有方便的 API 来存储、搜索和管理点 - 带有附加载荷的向量。Qdrant专…...

Spring Boot拦截器(Interceptor)与过滤器(Filter)详细教程

Spring Boot拦截器(Interceptor)与过滤器(Filter)详细教程 目录 概述 什么是拦截器(Interceptor)?什么是过滤器(Filter)?两者的核心区别 使用场景 拦截器的典…...

ffmpeg源码编译支持cuda

1.安装cuda CUDA Toolkit 11.3 Downloads | NVIDIA Developer 在选择组件的时候,将CUDA中的Nsight VSE和Visual Studio Integration取消勾选 不然会安装失败 2.编译ffmpeg 把cuda编译宏定义开启,再编译avcodec 3.编译livavutil报错struct "Cuda…...

【Linux 系统层面应急响应并分析日志溯源的流程】

Linux 层面响应安全事件并分析日志溯源的流程 一、事件响应核心流程1. 初步隔离与现场保护2. 关键日志收集与备份 二、日志分析工具链与溯源步骤1. 基础日志分析工具2. 高级日志分析框架3. 恶意行为深度检测4. 时间线重构工具 三、关键注意事项1. 日志可信度验证2. 攻击者反取证…...

【笔记ing】python

1 Python基础概念及环境搭建 1.1 python简介及发展史 之父Guido van Rossum。ABC语言的替代品。Python提供了高效的数据结构,还能简单有效地面向对象编程。Python语法和动态类型,以及解释性语言的本质,使之成为多数平台上写脚本和快速开发应…...

QT 作业 day4

作业 代码 Widget.h class Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);~Widget();private slots:// 槽函数void on_listWidget_itemDoubleClicked(QListWidgetItem *item);private:Ui::Widget *ui; }; #endif Widget.cpp Widget::Widget(QW…...

flink和yarn和mpp架构区别

为了全面理解 Flink 架构、YARN 架构和 MPP 架构的区别,我们从多个维度进行分析。以下是详细的对比: 1. 设计目标 架构设计目标Flink实时数据流处理和批处理,支持低延迟、高吞吐量的实时分析。YARN作为 Hadoop 的资源管理框架,负…...

DeepSeek崛起:如何在云端快速部署你的专属AI助手

在2025年春节的科技盛宴上,DeepSeek因其在AI领域的卓越表现成为焦点,其开源的推理模型DeepSeek-R1擅长处理多种复杂任务,支持多语言处理,并通过搜索引擎获取实时信息。DeepSeek因其先进的自然语言处理技术、广泛的知识库和高性价比…...

高频 SQL 50 题(基础版)_1141. 查询近30天活跃用户数

1141. 查询近30天活跃用户数 select activity_date day,count(distinct user_id) active_users from Activity where (activity_date<2019-07-27 and activity_date>DATE_sub(2019-07-27,INTERVAL 30 DAY)) group by(activity_date)...

DRMPlaneType里有VIG, DMA,和RGB三种类型,这是不是说明DRMPlane就是代表DPU里的Pipeline

DRMPlane 代表了 DPU&#xff08;Display Processing Unit&#xff09; 里的 Pipeline&#xff08;数据通路&#xff09;&#xff0c;不同的 DRMPlaneType 对应 DPU 内部的不同 渲染/合成管线。 &#x1f4cc; DRMPlaneType 与 DPU Pipeline 的关系 在 高通&#xff08;Qualco…...

not support ClassForName

com.alibaba.fastjson2.JSONException: not support ClassForName : java.lang.String, you can config JSONReader.Feature.SupportClassForName 官方说明中提到默认关闭&#xff0c; 可通过配置开启 JSON.config(JSONReader.Feature.SupportClassForName);...

为什么要学习数据结构与算法

今天&#xff0c;我向大家介绍一门非常重要的课程——《数据结构与算法》。这门课不仅是计算机学科的核心&#xff0c;更是每一位开发者从“小白”迈向“高手”的必经之路。 1、为什么要学习数据结构与算法 总的来说&#xff0c;数据结构与算法是&#xff1a; 求职的“敲门砖”…...

从浏览器输入网址,到页面展示都发生了什么?

查询缓存 其实从填写上url按下回车后&#xff0c;我们就进入了第一步就是 DNS 解析过程&#xff0c;首先需要找到这个 url 域名的服务器 ip,为了寻找这个 ip&#xff0c;浏览器首先会寻找缓存&#xff0c;查看缓存中是否有记录缓存的查找记录为&#xff1a;浏览器缓存>系统…...

Octave3D 关卡设计插件

课程参考链接 这位大佬有在视频合集中有详细的讲解&#xff0c;个人体验过&#xff0c;感觉功能很强大 https://www.bilibili.com/video/BV1Kq4y1C72P/?share_sourcecopy_web&vd_source0a41d8122353e3e841ae0a39908c2181 Prefab资源管理 第一步 在场景中创建一个空物体…...

JavaWeb后端基础(4)

这一篇就开始是做一个项目了&#xff0c;在项目里学习&#xff0c;我主要记录在学习过程中遇到的问题&#xff0c;以及一些知识点 Restful风格 一种软件架构风格 在REST风格的URL中&#xff0c;通过四种请求方式&#xff0c;来操作数据的增删改查。 GET &#xff1a; 查询 …...

【计算机网络】IP协议

目录 1. 协议头格式 2. 网段划分 3. 特殊的IP 4. 公网IP && 内网IP 总结 网络层的IP协议主要解决的是什么问题&#xff1f;——将数据包从B主机发送给C主机&#xff1b;传输层协议tcp提供可靠的策略&#xff1b;网络层IP协议提供数据数据传输的能力&#xff1b; 发…...

Libgdx游戏开发系列教程(2)——接水滴游戏实现

目录 游戏玩法 步骤 1.创建项目 2.添加资源文件 3.设置游戏配置 4.加载资源文件 5.播放背景音乐 6.绘制图形 7.雨滴下落实现 8.判断雨滴是否掉落在桶里 9.键盘控制改变桶位置 10.随机雨滴 打包 本文使用Kotlin语言开发 通过本文的学习可以初步了解以下基础知识的…...

【2025rust笔记】超详细,小白,rust基本语法

一、常见cargo命令 查看cargo版本 cargo --version创建cargo项目 create new demo_name构建编译项目 cargo build运行项目 cargo run检查项目代码 cargo check (比cargobuild快)发布构建项目 cargo build --release 电子markdown/pdf格式 二、小demo-----猜数游戏 1、print…...

将 SSH 密钥添加到 macOS 的钥匙串中

git提交代码时&#xff0c;如果SSH密码并未免密&#xff0c;每次拉取&#xff0c;上传操作时都需要密码输入&#xff0c; 可将SSH密钥添加到钥匙串中 git config --global credential.helper store报错&#xff1a; WARNING: The -K and -A flags are deprecated and have bee…...

Gpt翻译完整版

上一篇文章收到了很多小伙伴的反馈&#xff0c;总结了一下主要以下几点&#xff1a; 1. 说不知道怎么调api 2. 目前只是把所有的中文变成了英文&#xff0c;如果想要做多语言还需要把这些关键字提炼出来成放到message_zh.properties和message_en.properties文件中&#xff0c…...

CC++的内存管理

目录 1、C/C内存划分 C语言的动态内存管理 malloc calloc realloc free C的动态内存管理 new和delete operator new函数和operator delete函数 new和delete的原理 new T[N]原理 delete[]的原理 1、C/C内存划分 1、栈&#xff1a;存有非静态局部变量、函数参数、返回…...

HTTP 状态代码 501 502 问题

问题 单个客户端有时会出现 报错 501 或 502 如下&#xff1a; System.Net.Http.HttpRequestException: Response status code does not indicate success: 501 (Not Implemented) 分析 可以排除 服务器无法处理的问题&#xff08;测试发现 一个客户端报错&#xff0c;不会影响…...

virtio_video virtio_snd

在 Qualcomm 平台的 虚拟机&#xff08;VM&#xff09; 环境中&#xff0c;qcom,virtio_snd 是 VirtIO 机制下的 音频 DMA 共享 设备节点&#xff0c;它用于 虚拟机和宿主机&#xff08;Hypervisor&#xff09;之间共享音频数据&#xff0c;类似于标准的 VirtIO 声音设备。 1️…...

【大模型安全】大模型安全概述

【大模型安全】大模型安全概述 1.大模型安全目前的关键挑战技术安全合规安全 2.大语言模型的安全隐患与主要风险点3.大语言模型与国家安全风险4.大语言模型的信息安全原则 1.大模型安全目前的关键挑战 技术安全 1、数据的安全与合理利用 大语言模型通常需要处理大量敏感数据…...

基于 vLLM 部署 LSTM 时序预测模型的“下饭”(智能告警预测与根因分析部署)指南

Alright,各位看官老爷们,准备好迎接史上最爆笑、最通俗易懂的 “基于 vLLM 部署 LSTM 时序预测模型的智能告警预测与根因分析部署指南” 吗? 保证让你笑出猪叫,看完直接变身技术大咖!🚀😂 咱们今天的主题,就像是要打造一个“智能运维小管家”! 这个小管家,不仅能提…...

深入理解三色标记、CMS、G1垃圾回收器

三色标记算法 简介 三色标记算法是一种常见的垃圾收集的标记算法&#xff0c;属于根可达算法的一个分支&#xff0c;垃圾收集器CMS&#xff0c;G1在标记垃圾过程中就使用该算法 三色标记法&#xff08;Tri-color Marking&#xff09;是垃圾回收中用于并发标记存活对象的核心算…...

【车规芯片】如何引导时钟树生长方向

12nm车规DFTAPR项目中&#xff0c;我们可以看到&#xff0c;绝大部分的sink都受控于xxxx_tessent_occ_clk_cpu_inst/tessent_persistent_cell_clock_out_mux/C10_ctmi_1这个mux&#xff0c;这是我们DFT设计结果&#xff1a; 这里我们重新打开place的数据 Anchor&#xff0c;也就…...

基于Spring Boot的企业车辆管理系统设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…...

Spring Boot 中短时间连续请求时出现Cookie获取异常问题

Spring Boot 中短时间连续请求时出现Cookie获取异常问题 一、问题描述&#xff1a;异步线程操作导致请求复用时 Cookie 解析失败1. 场景背景2. 问题根源 二、问题详细分析1. 场景重现2. 问题分析 三、如何避免影响下一次请求&#xff1f;✅方式 1&#xff1a;在主线程提前复制 …...

轮播图案例

&#xff08;1&#xff09;、搭建轮播图的结构 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><title>轮播图结构</title><!-- <script src"../js/tools.js"></script> --…...

通俗版解释:分布式和微服务就像开餐厅

一、分布式系统&#xff1a;把大厨房拆成多个小厨房 想象你开了一家超火爆的餐厅&#xff0c;但原来的厨房太小了&#xff1a; 问题&#xff1a;一个厨师要同时切菜、炒菜、烤面包&#xff0c;手忙脚乱还容易出错。 解决方案&#xff1a; 拆分成多个小厨房&#xff08;分布式…...

【开源-常用C/C++命令行解析库对比】

以下是几种常用的C/C命令行解析库的对比表格&#xff0c;以及它们的GitHub开源库地址&#xff1a; 库名称语言特点是否支持子命令是否支持配置文件是否支持自动生成帮助信息GitHub地址ClaraC11及以上单一头文件&#xff0c;轻量级&#xff0c;非异常错误处理&#xff0c;自动类…...

JavaEE_多线程(一)

目录 1. 为啥要有线程1.1 线程是什么1.2 进程和线程的区别1.3 Java如何进行多线程编程 2 使用线程2.1 创建线程2.2 Thread类的几个常见方法和属性2.2.1 Thread常见构造方法2.2.2 Thread常见属性2.2.3 常见其他方法 2.3 终止一个线程2.3.1 通过共享的标记位来进行沟通2.3.2 调用…...

table 拖拽移动

表格拖拽 Sortable.js中文网|配置 <!-- 教务处 --><template><div class"but"><el-button click"mergeAndPrintArrays()" type"primary">保存数据</el-button><el-button click"restoration()" t…...

【QGIS二次开发】地图显示与交互-01

1. 系统界面设计 设计的系统界面如下&#xff0c;很好还原了QGIS、ArcGIS等软件的系统界面&#xff0c;充分利用了QT中顶部工具栏、菜单栏、底部状态栏&#xff0c;实现了图层管理器、鹰眼图、工具箱三个工具面板。 菜单栏、工具栏、工具箱集成了系统中实现的全部功能&#x…...

Microsoft.Office.Interop.Excel 的简单操作

Microsoft.Office.Interop.Excel 的简单操作 1、安装 Microsoft.Office.Interop.Excel2、声明引用 Microsoft.Office.Interop.Excel3、简单的新建 EXCEL 操作代码4、将 DataGridView 表数据写到 EXCEL 操作代码5、将 EXCEL 表数据读取到 C# 数据表 DataTable 操作代码 1、安装 …...

Debezium日常分享系列之:Debezium 3.0.8.Final发布

Debezium日常分享系列之&#xff1a;Debezium 3.0.8.Final发布 稀疏向量逻辑类型重命名架构历史配置默认值的更改潜在的 Vitess 数据丢失Oracle 的 Reselect 列后处理器行为更改MariaDB 的 SSL 连接 稀疏向量逻辑类型重命名 PostgreSQL 扩展 vector&#xff08;也称为 pgvecto…...

论传输层的TCP协议和UDP协议scoket通讯

TCP传输前需要三次握手---断开需要四次挥手 谁先发出请求、谁是客户端&#xff08;client&#xff09;另一个就是服务器&#xff08;server&#xff09;---简称CS架构 现在更多的是BS架构 什么是BS架构&#xff1f; blower server 浏览器服务器---也就是浏览器代替了客户端…...

《鸢尾花数学大系:从加减乘除到机器学习》开源资源

《鸢尾花数学大系&#xff1a;从加减乘除到机器学习》开源资源 Gitee&#xff1a;https://gitee.com/higkoo/ bilibili&#xff1a;https://space.bilibili.com/513194466 GitHub&#xff1a;https://github.com/Visualize-ML...

DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)示例2: 分页和排序

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕 目录 DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)示例2: 分页和排序📚页面效果📚指令输入定义…...