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

Cocos Creator Shader入门实战(五):材质的了解、使用和动态构建

引擎:3.8.5

您好,我是鹤九日!



回顾


前面的几篇文章,讲述的主要是Cocos引擎对Shader使用的一些固定规则,这里汇总下:

一、Shader实现基础是OpenGL ES可编程渲染管线,开发者只需关注顶点着色器片段着色器

二、Cocos引擎对Shader实现进行了多层封装,用于简化Shader的难度,以及更灵活管理,主要有:

  1. 封装了EffectAsset资源,主要包含CCEffectCCProgram两部分
  2. CCEffect部分, 采用YAML 1.2标准,与JSON兼容,并封装了渲染技术Technique、渲染过程Pass,以及Properties等多种属性配置
  3. CCProgram部分,采用GLSL语言,引擎封装了宏定义常量、函数以及Chunk等多种文件

三、Shader效果的实现,需要借助Effect Asset资源的属性配置和Material材质的数据包装。



简介


此篇文章,主要讲解关于材质Material部分,主要讲述内容:

一、材质的基本使用

二、使用iMaterialInfo动态初始化材质

三、材质的属性设置

四、材质的动态加载

正式开始之前,有两点需要注意:

  1. 材质是依托EffectAsset资源的,没有Effect资源,渲染材质无从谈起。
  2. 材质的作用,可以理解为两个:一、属性检查器的可视化调整; 二、通过脚本进行属性的动态调整

借助Cocos引擎实现Shader效果,简要的说,三个步骤:

一、创建EffectAsset资源,配置CCEffect渲染参数和编写CCProgram着色器片段

二、创建Material材质,设置属性检查器着色器资源,渲染技术、宏定义开关

三、渲染组件设置自定义材质属性



内置Effect

使用之前,首先我们需要有EffectAsset资源,可以通过编译器创建,也可以使用引擎内置的Effect资源。

内置Effect目录:../internal/effects
请添加图片描述

按照官方文档所言:

  • advanced 基于PBR着色器制作的一些高级效果,比如水面、皮肤、头发、玉石等,引擎会持续迭代
  • for2d 2D渲染相关着色器,比如:sprite、spine等
  • internal 引擎内置功能相关着色器,用户无需关注
  • particles 粒子相关特效
  • pipeline 管线着色器,比如延迟光照、后效和抗锯齿等

更多信息,可参考:内置着色器

本篇文章,便以内置的buitin-sprite.effect为例,主要原因有二:

  1. 精灵组件的Grayscale灰度渲染效果是它实现的
  2. CCEffect的属性配置和顶点着色器的片段代码,算是2D渲染中较为通用的。

内容如下:

  • CCEffect部分:
// Copyright (c) 2017-2020 Xiamen Yaji Software Co., Ltd.
CCEffect %{# 渲染技术techniques:# 渲染过程- passes:# 顶点、片段着色器的名字和入口,必须参数- vert: sprite-vs:vertfrag: sprite-fs:frag# 深度和模板测试depthStencilState:depthTest: falsedepthWrite: false# 混合模式状态blendState:targets:- blend: trueblendSrc: src_alphablendDst: one_minus_src_alphablendDstAlpha: one_minus_src_alpha# 光栅化状态,禁用面剔除,常见参数有:front, back, nonerasterizerState:cullMode: none# 属性参数配置,可用于属性检查器的可视化调整或代码的传参properties:alphaThreshold: { value: 0.5 }
}%
  • CCProgram着色器部分:
// 顶点着色器
CCProgram sprite-vs %{// 精度的设置precision highp float;// 引擎的Chunk和宏定义开关#include <builtin/uniforms/cc-global>#if USE_LOCAL#include <builtin/uniforms/cc-local>#endif#if SAMPLE_FROM_RT#include <common/common-define>#endif// 应用程序传入的顶点参数,分别是:位置(xyZ), 纹理坐标(uv), 颜色(rgba)in vec3 a_position;in vec2 a_texCoord;in vec4 a_color;// 顶点着色器传给片段着色器的数据,颜色会经过光栅化采样,纹理坐标用于纹理采样out vec4 color;out vec2 uv0;vec4 vert () {vec4 pos = vec4(a_position, 1);// 顶点坐标的坐标转换#if USE_LOCAL// 从局部坐标系转换到世界坐标系pos = cc_matWorld * pos;#endif#if USE_PIXEL_ALIGNMENT// cc_matView 视图矩阵, 将世界坐标系转换到视图坐标系pos = cc_matView * pos;pos.xyz = floor(pos.xyz);// cc_matProj 投影矩阵,将视图坐标转换为裁剪坐标pos = cc_matProj * pos;#else// cc_matViewProj 视图投影矩阵,将世界坐标转换为裁剪坐标pos = cc_matViewProj * pos;#endifuv0 = a_texCoord;#if SAMPLE_FROM_RTCC_HANDLE_RT_SAMPLE_FLIP(uv0);#endifcolor = a_color;return pos;}
}%// 片段着色器
CCProgram sprite-fs %{precision highp float;#include <builtin/internal/embedded-alpha>#include <builtin/internal/alpha-test>in vec4 color;// 纹理采样相关#if USE_TEXTUREin vec2 uv0;#pragma builtin(local)layout(set = 2, binding = 12) uniform sampler2D cc_spriteTexture;#endifvec4 frag () {vec4 o = vec4(1, 1, 1, 1);#if USE_TEXTUREo *= CCSampleWithAlphaSeparated(cc_spriteTexture, uv0);// 是否使用灰度测试#if IS_GRAYfloat gray  = 0.2126 * o.r + 0.7152 * o.g + 0.0722 * o.b;o.r = o.g = o.b = gray;#endif#endifo *= color;ALPHA_TEST(o);return o;}
}%

注: 注释相关在原有的文章中提及过,这里就当是加深印象吧!



基本使用


创建任意Effect资源,将builtin-sprite.effect内容复制粘贴进去。

然后创建Material材质,这里使用编译器直接构建普通材质Material即可。

请添加图片描述

其属性如下:

请添加图片描述

  • Effect :材质使用到的着色器资源EffectAsset,可通过下拉条进行选择。
  • Technique :Effect资源在CCEffect中所包含的渲染技术,可通过下拉条选择,用于设置不同的渲染效果。
  • Pass… :Effect资源在CCEffect中针对于每一个渲染技术所包含的渲染过程
  • USE… :预处理宏定义开关组合,不同宏定义的组合生成不同的代码,进而实现不同的效果。

这里我们只需关注Effect即可,选择我们添加的effect文件,保存。

请添加图片描述

构建任一页面,页面中包含一个Sprite组件,如下图所示:

请添加图片描述

将创建的demo.mtl材质拖拽进去,保存后,打开demo.mtl材质的属性检查器,如下图:

请添加图片描述

标记部分的勾选与否,便可直接预览灰度渲染效果。



自定义材质


Cocos引擎对Shader为开发者默默做了很多的事情。

上图中,我们借助的是Sprite渲染组件下的customMaterial ,即自定义材质。

我们可以这样认为:

一、对于任何持有CustomMaterial属性的UI和2D组件,我们都可以认为设置自定义材质

二、自定义材质属性即使为空,引擎也会进行默认配置

学习shader,customMateiral属性是一个很重要的入口。

注意:2D渲染对象不支持多材质,自定义材质数量最多为一个。

参考:2D渲染对象自定义材质



imaterialInfo初始化


材质的构建,编译器是最为直观、简洁的方式。那么它支持代码初始化吗?答案可以。

代码的动态初始化,与编译器的构建有相似之处。

引擎对于材质构建所需要的参数进行了封装叫做:IMaterialInfo,它的主要结构如下:

// 初始化材质的基本信息
export interface IMaterialInfo {// effectAsset资源引用,和effectName至少要指定一个effectAsset?: EffectAsset | null;// effect资源名,和effectAsset至少要指定一个effectName?: string;// 使用到的渲染技术,默认0technique?: number;// 使用到的预处理宏定义组合,默认全为0defines?: renderer.MacroRecord | renderer.MacroRecord[];// 自定义管线状态states?: renderer.PassOverrides | renderer.PassOverrides[];
}

使用的接口是Material下的initialize,代码的构建实例:

@ccclass('demo')
export class demo extends Component {@property(Sprite)sprite: Sprite = null!;@property(EffectAsset)effect: EffectAsset = null!;        // Effect资源引用          protected onLoad(): void {this.initMaterial();}// 初始化材质private initMaterial() {const material = new Material();const info: IMaterialInfo = {effectAsset: this.effect,technique: 0,defines: {USE_TEXTURE: true,      // 宏定义开关,使用纹理开启IS_GRAY: true,          // 宏定义开关,置灰开启}};material.initialize(info);// 设置精灵的自定义材质this.sprite.customMaterial = material;};
}

效果如下:

请添加图片描述



动态加载

不管是普通材质Material,还是物理材质Physics Material,它们都属于Asset资源的范畴。

  • 普通材质Material,主要用于渲染
  • 物理材质Physics Material,主要定义物体在物理模拟中的摩擦力、弹性等。

它们的继承结构如下:

Material
Asset
PhysicsMaterial

既然为Asset资源,那便支持动态加载,大概示例如下:

@ccclass('demo')
export class demo extends Component {@property(Sprite)sprite: Sprite = null!;       protected onLoad(): void {this.loadMateiral();}private loadMateiral() {// 资源路径,不需要后缀const url = "demo/demo";resources.load(url, Material, (err: Error, material: Material) => {if (err) {return console.error(err.message);}this.sprite.customMaterial = material;});}
}


总结


今天的文章到这里就结束了!

可能理解有误,欢迎您的指出,如果觉得文章不错,期待您的点赞和留言,感谢!

我是鹤九日,祝你生活快乐!

相关文章:

Cocos Creator Shader入门实战(五):材质的了解、使用和动态构建

引擎&#xff1a;3.8.5 您好&#xff0c;我是鹤九日&#xff01; 回顾 前面的几篇文章&#xff0c;讲述的主要是Cocos引擎对Shader使用的一些固定规则&#xff0c;这里汇总下&#xff1a; 一、Shader实现基础是OpenGL ES可编程渲染管线&#xff0c;开发者只需关注顶点着色器和…...

【Python】pillow库学习笔记1-Image类

《Python语言程序设计基础 》第3版&#xff0c;嵩天 黄天羽 杨雅婷著&#xff0c;P293 1.pillow库概述 Pillow 库是Python图像处理重要的第三方库。 Pillow库是PIL (Python image library) 库的一个扩展&#xff0c;需要通过pip工具安装。安装PIL库需要注意&#xff0c;安装…...

解决 MySQL 的 sql_mode 中包含 only_full_group_by模式导致group by SQL报错

sql 报错&#xff1a; Cause: java.sql.SQLSyntaxErrorException: Expression #6 of SELECT list is not in GROUP BY clause and contains nonaggregated column ev_data_transmission.p.push_type which is not functionally dependent on columns in GROUP BY clause; this…...

【微服务架构】本地负载均衡的实现(基于随机算法)

前言 负载均衡 概念&#xff1a;一种将网络流量或业务请求均匀分配到多个服务器或服务实例上的技术&#xff0c;旨在提高系统的可用性、性能和可伸缩性。作用&#xff1a; 提高性能&#xff1a;通过将请求分散到多个实例上&#xff0c;避免单个实例因请求过多而过载&#xff…...

记一次线上SQL死锁事故

一、 引言 SQL死锁是一个常见且复杂的并发控制问题。当多个事务在数据库中互相等待对方释放锁时&#xff0c;就会形成死锁&#xff0c;从而导致事务无法继续执行&#xff0c;影响系统的性能和可用性。死锁不仅会导致数据库操作的阻塞&#xff0c;增加延迟&#xff0c;还可能对…...

电机控制常见面试问题(十八)

文章目录 一.电机控制高级拓扑结构1.LLC 二.谈谈电压器饱和后果三.电压器绕组连接方式的影响四.有源逆变的条件 一.电机控制高级拓扑结构 1.LLC LLC是什么&#xff1f;—— 一个会"变魔术"的电源盒子 想象你有一个魔法盒子&#xff0c;能把电池的电压变大或变小&…...

数据结构之双链表

目录 1 简介 2 双链表的基本概念 2.1 节点结构 2.2 头插法和尾插法 3 代码实现 4 代码解析&#xff08;部分&#xff09; 4.1 初始化双链表 4.2 添加节点 4.3 删除节点 4.4 获取节点 4.5 插入节点 4.6 反转链表 4.7 打印链表 4.8 核心操作分析 5 总结 1 简介 …...

dell 台式机 电脑 纽扣电池 如何取下?

dell 台式机 电脑 纽扣电池 如何取下&#xff1f; 戴尔-optiplex-3060-塔式机-服务手册...

JSON二次序列化问题分析

正常的JSON应该是: json Apply to VectorServic... { "id": "d471c19c-70eb-4f29-8604-b8284e8a9400", "text": "人为干预, 降低生产成本...", "metadata": { "chunkIndex": 2, …...

WebSocket 传输大量数据好不好?稳定不稳定

使用 WebSocket 传输大量数据 是可行的&#xff0c;但在实际应用中需要注意一些限制和优化策略。以下是关于 WebSocket 传输大量数据的详细分析&#xff1a; 1. WebSocket 传输大量数据的可行性 优点 实时性&#xff1a;WebSocket 是全双工通信协议&#xff0c;适合实时传输数…...

代码随想录刷题day52|(二叉树篇)106.从中序与后序遍历序列构造二叉树(▲

目录 一、二叉树理论知识 二、构造二叉树思路 2.1 构造二叉树流程&#xff08;给定中序后序 2.2 整体步骤 2.3 递归思路 2.4 给定前序和后序 三、相关算法题目 四、易错点 一、二叉树理论知识 详见&#xff1a;代码随想录刷题day34|&#xff08;二叉树篇&#xff09;二…...

无人设备遥控器之调度自动化技术篇

一、技术原理 信息采集与处理&#xff1a; 通过传感器、仪表等设备采集无人设备的各种数据&#xff0c;如位置、速度、状态等。 将采集到的数据传输到调度自动化系统中进行处理和分析&#xff0c;以获取设备的实时状态。 系统建模与优化&#xff1a; 调度自动化系统会根据…...

红宝书第十五讲:详解JavaScript迭代器与生成器:Symbol.iterator与yield

红宝书第十五讲&#xff1a;详解JavaScript迭代器与生成器&#xff1a;Symbol.iterator与yield 资料取自《JavaScript高级程序设计&#xff08;第5版&#xff09;》。 查看总目录&#xff1a;红宝书学习大纲 一、迭代器&#xff08;Iterator&#xff09;的“传送带”模式 迭代…...

【AI】NLP

不定期更新&#xff0c;建议关注收藏点赞。 目录 transformer大语言模型Google Gemma疫情网民情绪识别 整体框架 baseline构建 模型调参、模型优化、其他模型 数据trick、指标优化、magic feature 数据增强、伪标签、迁移学习 模型融合sklearn中TFIDF参数详解 频率阈值可以去掉…...

ENSP学习day10

NAT地址转换技术&#xff08;一&#xff09; NAT&#xff08;Network Address Translation&#xff09;地址转换技术是一种在计算机网络中常用的技术&#xff0c;在数据包从一个网络传输到另一个网络时&#xff0c;会对数据包中的源IP地址和目的IP地址进行修改的过程。这种技术…...

文件上传绕过的小点总结(4)

9.末尾点删除处理缺陷 给出源码&#xff1a; $file_name trim($_FILES[upload_file][name]); $file_name deldot($file_name);//删除文件名末尾的点 $file_ext strrchr($file_name, .); $file_ext strtolower($file_ext); //转换为小写 $file_ext str_ireplace(::$DATA,…...

实战-MySQL5.7升级8.0遇到的四个问题

近期几个项目的MySQL由5.7升级到8.0&#xff0c;升级过程中遇到四个问题&#xff0c;记录下来分享一下&#xff1a; 第一个问题详见之前的文章&#xff1a; MySQL 5.7升级8.0报异常&#xff1a;处理新增关键字 第二个问题详见之前的文章&#xff1a; MySQL 5.7升级8.0报异常…...

卷积神经网络的原理、实现及变体

卷积神经网络convolutional neural network&#xff0c;CNN 是为处理图像数据而生的网络&#xff0c;主要由卷积层&#xff08;填充和步幅&#xff09;、池化层&#xff08;汇聚层&#xff09;、全连接层组成。 卷积 虽然卷积层得名于卷积&#xff08;convolution&#xff09…...

java 线程创建Executors 和 ThreadPoolExecutor 和 CompletableFuture 三者 区别

Executors是一个线程池的工具类&#xff0c;而ThreadPoolExecutor是Executor接口的一个实现&#xff0c;是线程池的核心类。‌ Executors提供了多种快速创建线程池的方法&#xff0c;而ThreadPoolExecutor则提供了更高的自定义和控制能力‌。 Executors是一个工具类&#xff0…...

Redisson 实现分布式锁简单解析

目录 Redisson 实现分布式锁业务方法&#xff1a;加锁逻辑LockUtil 工具类锁余额方法&#xff1a;工具类代码枚举代码 RedisUtil 工具类tryLock 方法及重载【分布式锁具体实现】Supplier 函数式接口调用分析 Redisson 实现分布式锁 业务方法&#xff1a; 如图&#xff0c;简单…...

Python条件处理,新手入门到精通

Python条件处理&#xff0c;新手入门到精通 对话实录 **小白**&#xff1a;&#xff08;崩溃&#xff09;我写了if x 1:&#xff0c;为什么Python会报错&#xff1f; **专家**&#xff1a;&#xff08;推眼镜&#xff09;**是赋值&#xff0c;才是比较**&#xff01;想判断相…...

详细比较StringRedisTemplate和RedisTemplate的区别及使用方法,及解决融合使用方法

前言 感觉StringRedisTemplate和RedisTemplate非常的相识&#xff0c;到底有什么区别和联系呢&#xff1f;点开idea&#xff0c;打开其依赖关系&#xff0c;可以看出只需使用maven依赖包spring-boot-starter-data-redis&#xff0c;然后在service中注入StringRedisTemplate或者…...

开源模型应用落地-语音转文本-whisper模型-AIGC应用探索(五)

一、前言 在上一节中&#xff0c;学习了如何使用vLLM来部署Whisper-large-v3-turbo模型。不过&#xff0c;在实际使用时&#xff0c;模型一次只能处理30秒的音频。今天&#xff0c;将结合实际业务&#xff0c;介绍如何处理一段完整的音频&#xff0c;并生成相应的字幕文件。 相…...

python每日十题(10)

在Python语言中&#xff0c;源文件的扩展名&#xff08;后缀名&#xff09;一般使用.py。 保留字&#xff0c;也称关键字&#xff0c;是指被编程语言内部定义并保留使用的标识符。Python 3.x有35个关键字&#xff0c;分别为&#xff1a;and&#xff0c;as&#xff0c;assert&am…...

安装和部署Tomcat并在idea创建web文件

一、背景 实验任务为安装Tomcat并创建web文件 为提高安装效率并且通俗易懂&#xff0c;免得大量文字浪费时间&#xff0c;这里我们采用图片加文字的方式来给大家讲解这个安装教程。 二、安装过程 首先第一步一定要注意你是否下载了JDK&#xff0c;如果你是像我一样下载一个…...

【Linux】Ubuntu 24.04 LTS 安装 OpenJDK 8

目录 通过 apt-get 直接安装 JDK 1. 更新 apt 软件源 2. 检查 JDK 是否已安装 3. 安装OpenJDK 4. 检查 JDK 是否成功安装 5. 设置 JAVA_HOME 环境变量 找到需要设置的 Java 路径 使用文本编辑器打开/etc/environment文件 添加 Java 安装路径 应用更改和验证配置 通过…...

图灵300题-21~40-笔记002

图灵300题 图灵面试题视频&#xff1a;https://www.bilibili.com/video/BV17z421B7rB?spm_id_from333.788.videopod.episodes&vd_sourcebe7914db0accdc2315623a7ad0709b85&p20。 本文是学习笔记&#xff0c;如果需要面试没有时间阅读原博文&#xff0c;可以快速浏览笔…...

蓝桥杯--bfs专题第二个题目(leetcode103二叉树)

文章目录 1.题目概述2.思路分析3.代码分析 1.题目概述 这个题目是关于二叉树的锯齿形的遍历&#xff1a;这个锯齿形是什么意思呢&#xff1f;简单的通俗的解释&#xff0c;就是S型的&#xff0c;例如下面的这个示例里面的二叉树&#xff1a; 第一行从左到右&#xff1a;但是只…...

React 知识回顾(HOC、合成事件、Fiber)

HOC 嗯&#xff0c;用户问的是HOC是什么以及它能用来做什么。我需要先理解HOC的基本概念&#xff0c;然后整理它的用途。根据搜索结果&#xff0c;HOC是React中的高阶组件&#xff0c;用来复用逻辑。网页1提到HOC是一个函数&#xff0c;接收组件返回新组件&#xff0c;属于设计…...

s1: Simple test-time scaling 【论文阅读笔记】

s1: Simple test-time scaling 关于test-time scaling 这个概念其实是相对 train scaling而言的。train scalling 指的是增加训练数据&#xff0c;增加训练flops等等&#xff0c;投入更多资源在train上。test-time scaling&#xff0c;其实现在简化点的理解&#xff0c;就是 …...

基于 Milvus 和 BiomedBERT 的医学文献智能搜索系统

前言 随着医学研究的不断深入&#xff0c;文献数量呈爆炸式增长&#xff0c;如何快速从海量文献中提取关键信息成为一大挑战。最近&#xff0c;我基于 Milvus 向量数据库和 BiomedBERT 嵌入模型&#xff0c;开发了一个智能搜索系统&#xff0c;支持语义搜索和关键词匹配&#…...

ASP.NET Web的 Razor Pages应用,配置热重载,解决.NET Core MVC 页面在更改后不刷新

Razor Pages应用&#xff0c;修改页面查看修改效果&#xff0c;如果没有热重载&#xff0c;改一句话跑一次&#xff0c;这个活就没法干了。 1、VS2022中的NuGet中安装RuntimeCompilation Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation 需要配套你的.net sdk版本&#x…...

MySQL 对text类型字段添加索引

对于 MySQL 中的 text 类型字段&#xff0c;可以通过以下步骤向其添加索引&#xff1a; 创建辅助字段&#xff1a;创建一个辅助字段&#xff0c;将该字段的一部分数据转移到辅助字段中。例如&#xff0c;可以创建一个 varchar 类型的字段来存储 text 字段的前缀。 添加索引&am…...

深入解析SQL2API平台:数据交互革新者

在数字化转型持续深入的当下&#xff0c;企业对数据的高效利用与管理的需求愈发迫切。SQL2API平台应运而生&#xff0c;成为助力企业突破数据交互困境的有力工具&#xff0c;特别是它由麦聪软件基于DaaS&#xff08;数据即服务&#xff09;产品创新衍生而来&#xff0c;备受业界…...

@Autowired 和 @Resource 注解的区别

前言 Autowired 和 Resource 是 Spring 中用于依赖注入的注解&#xff0c;但两者在实现机制和使用方式上有显著差异。 主要区别 1.来源不同 Autowired&#xff1a;由 Spring 框架提供&#xff08;org.springframework.beans.factory.annotation&#xff09;&#xff0c;与 S…...

稳定运行的以ElasticSearch数据库为数据源和目标的ETL性能变差时提高性能方法和步骤

在使用 Elasticsearch 作为数据源和目标的 ETL&#xff08;Extract, Transform, Load&#xff09;过程中&#xff0c;性能逐渐变差的原因可能有很多&#xff0c;比如查询效率下降、集群负载过高、资源配置不合理等。 性能的提升通常需要从多个方面入手&#xff0c;尤其是在处理…...

游戏引擎学习第182天

回顾和今天的计划 昨天的进展令人惊喜&#xff0c;原本的调试系统已经被一个新的系统完全替换&#xff0c;新系统不仅能完成原有的所有功能&#xff0c;还能捕获完整的调试信息&#xff0c;包括时间戳等关键数据。这次的替换非常顺利&#xff0c;效果很好。 今天的重点是在此基…...

EJS缓存解决多页面相同闪动问题

基于 EJS 的模板引擎特性及其缓存机制&#xff0c;以下是关于缓存相同模块的详细解答&#xff1a; 一、EJS 缓存机制的核心能力 模板编译缓存 EJS 默认会将编译后的模板函数缓存在内存中&#xff0c;当相同模板文件被多次渲染时&#xff0c;会直接复用已编译的模板函数&#x…...

【MySQL】mysql日志文件

目录 日志文件特征 错误日志&#xff08;Error log &#xff09; 常规查询日志&#xff08;General query log &#xff09; 慢速查询日志&#xff08;Slow query log &#xff09; 审计日志&#xff08;Audit log &#xff09; 二进制日志&#xff08;Binary log &#…...

【C++】STL性能优化实战

STL性能优化实战 STL (Standard Template Library) 是 C 标准库的核心部分&#xff0c;提供了各种容器、算法和迭代器。虽然 STL 提供了强大的功能&#xff0c;但不恰当的使用可能导致性能问题。下面我将详细介绍 STL 性能优化的实战技巧&#xff0c;并通过具体案例说明。 1.…...

Playwright + MCP:用AI对话重新定义浏览器自动化,效率提升300%!

一、引言&#xff1a;自动化测试的“瓶颈”与MCP的革新 传统自动化测试依赖开发者手动编写脚本&#xff0c;不仅耗时且容易因页面动态变化失效。例如&#xff0c;一个简单的登录流程可能需要开发者手动定位元素、处理等待逻辑&#xff0c;甚至反复调试超时问题。而MCP&#xf…...

12-scala样例类(Case Classes)

例类&#xff08;Case classes&#xff09;和普通类差不多&#xff0c;只有几点关键差别&#xff0c;接下来的介绍将会涵盖这些差别。样例类非常适合用于不可变的数据。 定义一个样例类 一个最简单的样例类定义由关键字case class&#xff0c;类名&#xff0c;参数列表&#…...

WPF 与 C# 开发深度剖析

一、引言 在当今的软件开发领域&#xff0c;Windows 平台依旧占据着重要的地位。而 WPF&#xff08;Windows Presentation Foundation&#xff09;作为微软推出的一款强大的用户界面&#xff08;UI&#xff09;框架&#xff0c;为开发者提供了丰富的功能和灵活的设计方式&…...

【工具使用-编译器】VScode(Ubuntu)使用

1. VScode的快捷键 快捷键功能说明Ctrl+Shift+P / F1显示命令面板Ctrl+P快速打开文件Ctrl+Shift+N新建窗口Ctrl+Shift+W关闭窗口Ctrl+,打开设置Ctrl+K Ctrl+S打开快捷键设置Ctrl+X剪切行(无选中时剪切整行)Ctrl+C复制行(无选中时复制整行)Alt+↑ / Alt+↓向上/向下移动行Sh…...

C# SerialPort 使用详解

总目录 前言 在工业控制、物联网、嵌入式开发等领域&#xff0c;串口通信&#xff08;Serial Port Communication&#xff09;是连接串行设备&#xff08;如条码扫描器、GPS接收器等&#xff09;与计算机的重要手段。C# 提供了内置的 SerialPort 类&#xff0c;简化了串口开发…...

数据结构--二叉排序树

一、二叉排序树的定义 二叉排序树&#xff0c;又称二叉查找树。 性质&#xff1a; 左子树结点值<根结点值<右子树结点值&#xff08;进行中序遍历&#xff0c;可以得到一个递增的有序序列&#xff09; 二、查找操作 利用二叉排序树的性质&#xff0c;如果树空&#xff0c…...

FPGA的直方图均衡

文章目录 一、直方图均衡二、代码实现三、仿真 一、直方图均衡 直方图均衡&#xff08;Histogram Equalization&#xff09;是一种用于增强图像对比度的图像处理技术。它通过重新分配图像像素的灰度值&#xff0c;使得图像的灰度直方图在整个灰度范围内均匀分布&#xff0c;从而…...

使用Python将视频转化为gif

使用Python将视频转化为gif 一、前言二、准备三、测试 一、前言 最近想把喜欢的视频片段作成gif&#xff0c;就试着用Python做了下&#xff0c;感觉效果还行&#xff0c;这里做个记录。 二、准备 先下载安装对应的库&#xff0c;命令如下&#xff1a; pip install moviepy …...

基于javaweb的SpringBoot雪具商城系统设计与实现系统(源码+文档+部署讲解)

​ 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、…...

Harbor镜像仓库迁移与高可用集群搭建HTTPS实现实战指南

实验环境 Ubuntu22.04操作系统 registry节点 10.0.0.91 master节点 10.0.0.92 backup节点 10.0.0.93 在企业信息化建设的不同演进阶段&#xff0c;私有镜像仓库的选型策略存在显著差异。近期主导完成某企业级容器镜像仓库升级项目&#xff0c;成功实现Docker Registry至Ha…...