目前 WebGPU 的标准还没有完全确定下来,需要下载开发者版本的 Chrome Canary 才能开启 WebGPU。(目前正式版中 Chrome 96 / 97 其实已经支持 WebGPU了,但并不是完全支持,98 (据说)会正式支持 WebGPU)。

WebGL 与 WebGPU

WebGL 的基础是 OpenGL。OpenGL 的初始版本可以追溯到 1992 年,整个 OpenGL 的设计是基于状态机模型。状态驱动的 OpenGL 难以利用今天 GPU 并行的特点。对于今天的多核计算的设备,使用 OpenGL 非常难以发挥机器的全部计算能力。WebGL 基于 OpenGL,这些 OpenGL 的问题也继承到了 WebGL了。

除此之外,OpenGL 也被各大厂商抛弃。微软的 Windows 有 Direct X,Apple 则提出了 Metal,并且直接不支持新版本的 OpenGL 4,科纳斯则提出了“次世代 OpenGL“ 的 Vulkan。这些新的图形编程语言的特点都是为了适应多核并行的高性能计算。

当然,复杂度也要比 OpenGL 更高。如果学习过 DirectX 12(支持多线程)和 DirectX 11,应该很清楚,DirectX 12 比 11 复杂多了。

需要注意的是,WebGPU 和 WebGL 并没有关系,它不需要显式地依赖 OpenGL ES。从某种意义上,wgsl 也是一门新的语言,然后经由浏览器翻译成更加底层的实现,至于底层是 Vulkan、Metal 或者是 Direct X 等等,则已经不是重点了。

由于 WebGPU 的入口是浏览器,它的标准会尽可能的大众化,也就是不能对设备要求过高,否则这个标准的通用程度也会是一个很大的问题。不可能要求每个需要使用 WebGPU 的用户的 GPU 都是 RTX 3090。可以理解,这也导致标准的复杂性会相应增加。

WebGPU 基本概念

  • GPUAdapter :WebGPU 中将物理的 GPU 硬件视为 GPUAdapter
  • GPUDevice :管理资源(它可能有自己处理单元的显存)
  • GPUQueue :执行 GPU 命令的队列
  • GPUBuffer (缓冲区)和 GPUTexture (纹理):在 GPU 内存(显存)中烘焙的物理资源
  • GPUCommandBufferGPURenderBundle 是用户记录命令的容器
  • GPUShaderModule 包含着色器代码。
  • GPUSamplerGPUBindGroup,配置 GPU 使用其它物理资源的方式

安全性

和 Web 一样,会保证是当前页面数据。由于通过浏览器翻译成底层的 GPU 语言,在翻译阶段会严格限定指令集并进行验证,避免出现未定义行为。

还有其他的针对安全问题的考虑,暂时不讨论

图形学基础概念

如果没有清楚一些基础概念,无论是学 WebGL 还是 WebGPU 都是无法深入下去的。(由于篇幅有限,这里只是简单概述一下,后续需要具体用到的概念再展开)

图形系统

计算机图形系统也是一个计算机系统,因此它肯定也包含了一个通用计算机的所有部件。图形系统包括以下 6 个部分:

  • 输入设备(鼠标、键盘、手绘板…)
  • 中央处理单元(CPU)
  • 图形处理单元(GPU)
  • 存储器(包括常说的内存、显存)
  • 帧缓冲区(比如前后缓冲区)
  • 输出设备(显示器、投影等等)

这是一个通用的模型,从手机到计算机都可以用这个模型。

像素和帧缓存

现代所有图形系统都是基于光栅的。输出设备看到的图像是由图形系统产生的图形元素组成的序列:

  • 图形元素也叫做像素(pixel)
  • 像素阵列称为光栅(raster)
  • 帧缓冲区(framebuffer)中的像素称为分辨率(resolution),决定了图像中可以分辨出多少细节
    • 帧缓冲区的深度(depth)或者精度(precision)表示的是像素所用的比特数,深度为 1 的帧缓冲区只能有 212^121 = 2 种颜色,而深度为 8 的帧缓冲区可以表示 256(282^828) 种颜色。
    • 全彩(full-color)显示中,每个像素 24 比特(现在基本上都有 32 比特)。这样系统可以逼真地表示大多数图像,也被称为真彩色(true-color)系统,或者 RGB 系统
  • 高动态范围(High Dynamic Range,HDR)给每一个颜色分配了 12 或者更多的比特位。
    • 现在,帧缓冲区已经支持用浮点数表示颜色值,可以更好的支持 HDR

在简单的图形系统中,帧缓冲区只存储屏幕上要显示的像素的颜色值。但在目前的图形系统中,帧缓冲区存储的信息其实非常多,比如还有生成 3D 图像所需要的深度信息等等。

输出设备

计算显示设备的历史可以追溯到阴极射线管(Cathode Ray Tube,CRT)。二十多年前那种带着长长尾巴的电视机就是基于这种原理。

CRT 因为电子轰击涂在管子上的磷光物质而发光。电子束的方向由两对偏转板控制。计算机的输出由数模转换器转换成 x 偏转板和 y 偏转板上的电压值。当强度足够大的电子束轰击到磷光物质上,CRT 屏幕就会发光。

如果控制电子束偏转的电压以恒定的速率改变,那么电子束就会扫过一条直线轨迹。这样的设备称为随机扫描(random-scan)显示器。

磷光物质被电子束激发以后,典型的 CRT 的发光只能持续很短的时间,一般是几毫秒。为了让人看到稳定的、不闪烁的图像,电子束必须以足够高的速率重复扫描相同的路径,这就是刷新(refresh),刷新的速率叫做刷新率。在早期的系统中,刷新的速率由电源的(交流电)频率决定,例如美国是 60 Hz,而其他大多数地方是 50 Hz。当然,目前显示器已经远远不止 60 Hz 了,例如 iPad Pro 可以 120 Hz,一些专业的游戏笔记本可以达到 144 Hz。

  • 逐行扫描:像素按照刷新率一行一行地显示
  • 隔行扫描:奇数行和偶数行交替刷新
    • 60 Hz 的隔行扫描,每秒钟屏幕被完整刷新只有 30 次

后面,CRT 就被平板显示技术取代了。平板显示器也是基于光栅原理,虽然平板的具体物理实现可能不同,比如是发光二极管(LED)、液晶显示器(LCD)、等离子显示屏等,但都使用了二维栅格来寻址每个单独的发光元件。

  • LED:由传递到栅格上的电信号控制开启和关闭;
  • LCD:电场改变液晶的排列方式,可以控制是否阻挡光线通过;
  • 等离子显示器:通过激发玻璃板的中的气体,获得能量的气体变成发光的等离子体;

3D 显示则利用交替刷新周期在左眼和右眼看到图像进行切换显示。观众需要佩戴满足一定刷新周期的特制眼镜。3D 电影放映机则会产生具有不同偏振方向的两个图像(通常称为左右眼),观众佩戴偏振光眼镜,这样每个眼睛只看到两个图像的一个,经过大脑的视觉合成,从而形成 3D 效果。

光学成像模型

因为这里不打算讲物理学(虽然后面如果深入了解光和材质的话,像光度学的概念还是要懂的)。这里一笔带过,现实世界中,我们作为观察者看到的图像是由于环境中光源投射到物体上,然后物体反射到我们的眼睛(当然,还有光源直射你的眼睛、包括物体本身的漫反射等等)。

物体(对象)的材质不同,对光的反射和折射也会不同(目前计算机图形学都是基于几何光学,至于波动光学(诸如衍射、偏振等)是不用于计算机图形学的)。所以材质代表了对光处理模型,例如是完全反射回去(理想镜子),还是会在内部进行不断的散射(蜡烛的次表面散射模型)。

三维绘图的 API

目前计算机三维模型使用的虚拟照相机模型,按照这个模型,API 就需要有下面四种类型的函数:

  • 对象
  • 观察者(也就是视点、相机)
  • 光源
  • 材质

流水线体系结构

图形绘制系统的体系结果经过多次反复,但无论如何演变,流水线结构的重要性依然不变。其他的图形绘制方法,包括光线跟踪、辐射度方法和光子映射都不能获得实时的行为。

而现在,流水线体系结构中,顶点处理模块和片元处理模块是可以编程的。

  • 顶点着色器可以在顶点经过流水线的时候修改每个顶点的位置或者颜色。这样就可以实现许多光线-材质模型或者创建新型的投影。
  • 片元着色器可以用许多新的方式来使用纹理,也可以实现基于每个片元的光照而不是每个顶点的光照。

WebGL 的三角形

初始化着色器

在 WebGL 中,首先需要创建顶点着色器和片段着色器,并且绑定和编译对应的着色器程序。在这之后,需要将这两个着色器程序链接成为一个着色器。

function initShader(gl, vertexShader, fragShader) {// 创建顶点着色器const v_shader = gl.createShader(gl.VERTEX_SHADER);// 绑定顶点着色器代码gl.shaderSource(v_shader, vertexShader);// 编译顶点着色器gl.compileShader(v_shader);// 创建片段着色器const f_shader = gl.createShader(gl.FRAGMENT_SHADER);gl.shaderSource(f_shader, fragShader);gl.compileShader(f_shader);// 创建着色器程序const shaderProgram = gl.createProgram();gl.attachShader(shaderProgram, v_shader);gl.attachShader(shaderProgram, f_shader);gl.linkProgram(shaderProgram);gl.useProgram(shaderProgram);// WebGL 没有类似 getProgram 的接口,所以绑定到 program 上gl.program = shaderProgram
}

绘制一个点

要绘制一个点,首先区分流水线上的不同节点,点的位置和大小属于顶点着色器的内容,而顶点的颜色属于片段着色器。和 C 系语言类似,由 main 函数开始作为程序的入口,需要注意的是,返回值不是 int,而是 void

顶点着色器,点的位置最后的 1.0 主要目的是齐次化,这样才可以更好地运用在矩阵运算中,避免由于颜色的 4 个维度(rgba)而无法进行矩阵运算。

// 顶点着色器代码 
const v_shader = `void main() {gl_Position = vec4(0.0, 0.0, 0.0, 1.0);gl_PointSize = 10.0;}`;
// 片段着色器代码
const f_shader = `void main() {gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);}`;

获取 HTML 标签,清空画布就都是比较容易理解的操作:

    // DOM 节点与 WebGL 上下文const canvas = document.getElementById("hello-point");const gl = canvas.getContext("webgl");if (!gl) {console.log("Failed to get the rendering context for WebGL.")return;}// 初始化着色器initShader(gl, v_shader, f_shader);// 清空 <canvas> 颜色gl.clearColor(0.0, 0.0, 0.0, 1.0);gl.clear(gl.COLOR_BUFFER_BIT)// 绘制点gl.drawArrays(gl.POINTS, 0, 1);

WebGL绘制一个点

绘制多个点

对于多个点的组成的图形,例如三角形、矩形和立方体。我们肯定更希望一次性把图形的的顶点全部传入到顶点着色器,而不是用循环一次一个顶点的传入。WebGL 提供了缓冲区对象(buffer object),它可以一次性地向着色器传入多个顶点的数据。缓冲区对象是 WebGL 系统中的一块内存区域,可以一次性地向缓冲区对象中填充大量的顶点数据。

使用缓冲区对象向顶点着色器传入多个顶点的数据,需要遵循以下五个步骤(处理其他对象,例如纹理、帧缓冲区对象也类似):

  1. 创建缓冲区对象 gl.createBuffer()
  2. 绑定缓冲区对象 gl.bindBuffer()
  3. 将数据写入缓冲区对象 gl.bufferData()
  4. 将缓冲区对象分配给一个 attribute 变量 gl.vertexAttribPointer()
  5. 开启 attribute 变量 gl.enableVertexAttribArray()
function initVertexBuffers(gl) {const vertices = Float32Array.of(...[0.0, 0.5, -0.5, -0.5, 0.5, -0.5]);const n = 3;// 1. 创建缓冲区对象const vertexBuffer = gl.createBuffer();if (!vertexBuffer) {console.log("Failed to create the buffer object.");return -1;}// 2. 绑定目标gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);// 3. 写入缓冲区gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);// 4. 创建分配 attribute 变量const a_Position = gl.getAttribLocation(gl.program, "a_Position");if (a_Position < 0) {console.log("Failed to get the storage location of a_Position");return -1;}// 需要指明数据的格式,这里坐标是 2 个 Float,并且没有归一化gl.vertexAttribPointer(a_Position, 2, gl.FLOAT, false, 0, 0);// 5. 开启 attribute 变量gl.enableVertexAttribArray(a_Position);return n;
}

着色器程序中片段着色器提供颜色信息,这里不需要修改。由于我们传入的是多个点,需要将顶点着色器中的顶点改为 attribute vec4

const v_shader = `attribute vec4 a_Position;void main() {gl_Position = a_Position;gl_PointSize = 10.0;}`;

绘制点的数量也从 1 修改为 n:

    // 初始化着色器initShader(gl, v_shader, f_shader);const n = initVertexBuffers(gl);if (n < 0) {console.log("Failed to get the positions of the vertices");return;}// 清空 <canvas> 颜色gl.clearColor(0.0, 0.0, 0.0, 1.0);gl.clear(gl.COLOR_BUFFER_BIT)// 绘制点gl.drawArrays(gl.POINTS, 0, n);

多个点

三角形

只要在上面的代码上稍微改改,就能得到一个三角形:

  1. gl_PointSize = 10.0; 去掉,因为只有绘制点的时候,点的大小才是有用的;
  2. gl.drawArrays 的第一个参数从 gl.POINTS 修改为三角形 gl.TRIANGLES
gl.drawArrays(gl.TRIANGLES, 0, n);

WebGL三角形

WebGPU 的三角形

WebGPU 的流水线体系结构和 WebGL 没什么差别,应该说整个实时渲染的渲染大体步骤都是一样的。顶点着色器到顶点组装(例如组装成三角形),经过剪裁和光栅化后进入片段着色器进行着色再到最终显示。WebGPU 从一开始就考虑的是并发(并行)的计算,所以异步过程贯穿始终。当然,今天的前端开始也是如此。

wsgl 的语法挺像 Rust 的…代码高亮我都选的是 Rust…但却是比 GL 的语法晦涩一点,也可能不止一点。

初始化

由于整个过程是异步的,所以需要使用 async 声明函数:

(async () => {
// ... 下面的代码写在这里 ...
})();

WebGPU 的具体实现是没有限制的,Windows 可能是使用 Direct X 12,而 OSX 则可能是 Metal。为了屏蔽这种差异,引入了适配器层,由适配器提供对应的底层设备:

// 适配器
const adapter = await navigator.gpu.requestAdapter();
// 通过适配器获取具体设备
const device = await adapter.requestDevice();

接下来获取画布和上下文就和 WebGL 没有太大的差别了:

const canvas = document.getElementById("webgpu-canvas");
const context = canvas.getContext("webgpu");

由于具体实现是由适配器管理的,绘制所需要的纹理格式同样应该通过适配器获取。可以通过 getPreferredFormat 获取对应的的纹理格式。

const presentationFormat = context.getPreferredFormat(adapter);
context.configure({device,format: presentationFormat
});

顶点缓冲区和颜色缓冲区

和 WebGL 一样,也需要声明顶点缓冲区和颜色缓冲区,需要注意的是,CPU 和 GPU 是异构的。可以使用 createBuffer 映射显存,为了让 GPU 能再次访问这块显存,它必须取消映射 umap()

// 映射显存
const positionBuffer = device.createBuffer({size: 24,usage: GPUBufferUsage.VERTEX,mappedAtCreation: true
});
// 取消映射
positionBuffer.unmap();const colorBuffer = device.createBuffer({size: 12,usage: GPUBufferUsage.VERTEX,mappedAtCreation: true
});    
colorBuffer.unmap();

顶点着色器

[[stage(vertex)]]
fn main([[builtin(vertex_index)]] VertexIndex : u32)-> [[builtin(position)]] vec4<f32> {var pos = array<vec2<f32>, 3>(vec2<f32>(0.0, 0.5),vec2<f32>(-0.5, -0.5),vec2<f32>(0.5, -0.5));return vec4<f32>(pos[VertexIndex], 0.0, 1.0);
}

stage 的中文是阶段,[[stage(vertex)]] 显然说明了这是一个顶点着色阶段。builtin 则指明是内置类型:

  • vertex_index : 顶点索引,类似数组下标,值的类型为 u32
  • position : [输出] 当前顶点的输出位置,使用的是齐次坐标。所以从 pos 中获取到二维坐标后,再补上两个维度(zw )的值,组成一个 vec4 四维的坐标。

片元着色器

片元着色 RGBA,代表不透明的纯红色。

[[stage(fragment)]]
fn main() -> [[location(0)]] vec4<f32> {return vec4<f32>(1.0, 0.0, 0.0, 1.0);
}

location(0) 和 WebGL 中 (location = 0) 是一个意思,都是指定该属性在顶点缓冲区中的位置。

创建渲染管线

指定渲染管线和提供必要的材料,我们之前已经说过了,GPU 流水线中,可以定制代码的主要就是就是顶点着色器和片元着色器。createShaderModule 绑定 shader 源码,entryPoint 指定入口函数。buffers 则描述了对象的布局。

const pipeline = device.createRenderPipeline({vertex: {module: device.createShaderModule({code: vs}),entryPoint: "main",buffers: [{// 步进值(单位:byte),32位浮点数占 4 bytes,平面坐标x,y 所以是 => 8arrayStride: 8,attributes: [{shaderLocation: 0,format: "float32x2",offset: 0}]},{// 8位 无符号整数 = 1byte * 4 = 4bytesarrayStride: 4,attributes: [{shaderLocation: 1,// UNORM 无符号整数format: "unorm8x4",offset: 0}]}]},fragment: {module: device.createShaderModule({code: fs}),entryPoint: "main",targets: [{format: presentationFormat}]},primitive: {// 图元topology: "triangle-list"}
});

提交渲染命令

// 创建指令编码器
const commandEncoder = device.createCommandEncoder();
// 视图
const textureView = context.getCurrentTexture().createView();
// 启动渲染通道(WebGPU 还提供了计算通道)
const renderPass = commandEncoder.beginRenderPass({colorAttachments: [{view: textureView,loadValue: { r: 0.0, g: 0.0, b: 0.0, a: 1.0 } // 背景颜色}]
});
// 设置渲染管线
renderPass.setPipeline(pipeline);renderPass.setVertexBuffer(0, positionBuffer);
renderPass.setVertexBuffer(1, colorBuffer);renderPass.draw(3, 1, 0, 0);
// 结束管道编码
renderPass.endPass();
// 提交到队列,commandEncoder 调用 finish 完成编码操作,并返回一个指令缓存
device.queue.submit([commandEncoder.finish()]);

WebGPU三角形

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

相关文章

  1. 短视频直播系统,接收到产生验证码请求时随机生成验证码

    短视频直播系统&#xff0c;接收到产生验证码请求时随机生成验证码实现的相关代码 public class Demo1 {public static void main(String[] args) { // vertifyCode("15022588756");checkCode("240329","15022588756");}//①随机生成一个…...

    2024/4/23 15:15:30
  2. 周鸿祎表示「不理解 35 岁被职场抛弃」一情况,你认同这一说法吗?如遇到中年危机该如何面对?

    程序员越老越容易失业是一种国内短期内发生的畸形的就业现状&#xff0c;许多互联网公司再招聘员工的时候&#xff0c;明文规定只要求xx岁以下的员工&#xff0c;而xx一般为35岁。 仿佛40岁人生就要结束了一样。所以这种现象也被称之为“35岁危机”。 我们来用数据说话。 实…...

    2024/4/18 4:09:50
  3. 3.Android 小米专家彻底解读SyetemServer ( 基于安卓12源码分析

    SyetemServer进程是 Zygote 进程 fork 创建的&#xff01;&#xff08;通过C代码&#xff09; 开始的时候只有uid&#xff0c;还没有pid // fork 创建 system_server 进程&#xff0c;后面会具体分析 pid Zygote.forkSystemServer( parsedArgs.uid, parsedArgs.gid, parsedA…...

    2024/4/14 1:59:46
  4. Air Raid 空袭

    题目链接&#xff1a;https://acs.jxnu.edu.cn/problem/HDU1151 描述&#xff1a; 考虑到一个城镇所有街道都是单向的&#xff0c;每条街道都从一个十字路口通向另一个十字路口。 众所周知&#xff0c;从十字路口开始穿过城镇的街道&#xff0c;你永远无法到达同一个十字路口…...

    2024/4/14 1:59:46
  5. spring filter拦截器配置

    spring filter拦截器配置 Filter可以认为是Servlet的一种“加强版”&#xff0c;它主要用于对用户请求进行预处理&#xff0c;也可以对HttpServletResponse进行后处理&#xff0c;是个典型的处理链。Filter也可以对用户请求生成响应&#xff0c;这一点与Servlet相同&#xff0…...

    2024/4/20 9:54:48
  6. linux下简单好用的端口映射转发工具rinetd

    linux下简单好用的工具rinetd&#xff0c;实现端口映射/转发/重定向 官网地址http://www.boutell.com/rinetd 软件下载 wget http://www.boutell.com/rinetd/http/rinetd.tar.gz 解压安装 tar zxvf rinetd.tar.gz make make install 编辑配置 vi /etc/rinetd.conf 0.0.0.0 8…...

    2024/4/14 2:00:06
  7. 关于session、cookie、token 的思考

    Cookie的出现是因为http连接是无状态啊的&#xff0c;为了记录用户的登录状态&#xff0c;引入了cookie这个概念&#xff0c;cookie是将信息都存储在客户端以文件的形式存储。 因为cookie是将敏感信息存储在客户端上&#xff0c;所以安全性得不到保障。所以引入了session这个概…...

    2024/4/16 18:48:54
  8. Github年度最值得推荐的TOP30 Python项目,值得收藏

    还有几天就是农历新年了&#xff0c;大家都有顺利回到老家和父母亲人团圆么&#xff1f;今天我整理归纳了2021年Github上面最受欢迎的30个Python项目&#xff0c;帮助大家在打磨技术与提升自我上面更进一步。 喜欢记得收藏、关注、点赞。废话不多说&#xff0c;我们开始吧 通…...

    2024/4/5 3:55:05
  9. Git笔记(待补全)

    1.Git中的全局忽略—配置 【为什么要进行全局忽略配置&#xff1f;】&#xff1a; A&#xff1a;在操作Git时&#xff0c;我们会将修改的内容$git add . 到Git&#xff0c;Git会提示我们哪些文件都修改了。此时提示中会包括系统自动修改的文件&#xff0c;bin文件等。 而我们a…...

    2024/4/18 2:56:08
  10. css标签中判断样式

    <button :class "{border-bottpm:true item.title}"></button> 注意&#xff1a;这里是判断true是否等于你循环中item下的title&#xff0c;相等则有border-bottpm class&#xff0c;进行相应的样式显示&#xff0c;否则没有...

    2024/4/20 13:25:18
  11. 省选模拟赛2022/1/27

    省选模拟赛2022/1/27比赛时间安排赛后总结反思比赛时间安排 7.30-7.40 看了下三道题&#xff0c;感觉暴力分都非常好拿&#xff0c;能写 7.40-8.10 写完了三道题的暴力&#xff0c;我以为我要开始了&#xff0c;谁知道&#xff0c;我已经结束了 8.10-11.20 3个小时不知道在干…...

    2024/4/14 1:59:51
  12. 项目在运行npm install 出现Failed at the canvas@2.8.0 install script错误

    项目在运行npm install 出现Failed at the canvas2.8.0 install script错误&#xff1a; npm ERR! code ELIFECYCLE npm ERR! errno 1 npm ERR! canvas2.8.0 install: node-pre-gyp install --fallback-to-build npm ERR! Exit status 1 npm ERR! npm ERR! Failed at the canv…...

    2024/4/14 1:59:56
  13. Vue history模式项目发布

    nginx部署vue项目 server {#前端页面访问地址端口&#xff08;可根据实际修改&#xff09;listen 4343;server_name localhost;location /file {root /opt/;autoindex on;}#/dev-api 对接后台接口地址/dev-apilocation /dev-api {client_max_body_size 20m;#后端部…...

    2024/4/16 5:41:19
  14. 浅谈javascript基本语法

    转自&#xff1a;微点阅读 https://www.weidianyuedu.com/content/3217446569201.html javascript的基本语法。 1、组成 javascript由三方组成&#xff0c;分别是&#xff1a; 1&#xff09;ECMAScript&#xff1a;js基本语法与标准 2&#xff09;BOM&#xff1a; 操作浏览…...

    2024/4/14 1:59:31
  15. 【JS】数组去重的几种方式

    数组去重的方法有很多&#xff0c;接下来&#xff0c;讲几种常见的方式&#xff1a; 一、includes方法 for循环 includes() 方法用来判断一个数组是否包含一个指定的值&#xff0c;根据情况&#xff0c;如果包含则返回 true&#xff0c;否则返回 false. const array [1,2,3,…...

    2024/4/14 1:59:36
  16. epub注释

    a /*通用注释&#xff08;仅多看可弹&#xff09;*/ sup a img {width: 1em;height: 1em;padding-top: 0.5em;vertical-align: middle; }li p a img {width: 1em;height: 1em;vertical-align: middle; }ol {padding: 0;list-style-type: circle;list-style-position: outside;…...

    2024/4/7 17:52:57
  17. 【信息学奥赛】1007:计算(a+b)×c的值(C++)

    今天来让我们来继续分析信息学奥赛一本通的第十五道题&#xff0c;也就是按照题目的要求输出(ab)c的值。&#xff08;并且&#xff0c;看了我的文章的人只有少数人点了赞&#xff0c;如果你觉得我写的好&#xff0c;或对你有帮助的话&#xff0c;请点赞&#xff01;&#xff01…...

    2024/4/7 17:52:56
  18. 2022海南最新通信安全员模拟考试试题及答案

    百分百题库提供道通信安全员考试试题、通信安全员考试预测题、通信安全员考试真题、通信安全员证考试题库等&#xff0c;提供在线做题刷题&#xff0c;在线模拟考试&#xff0c;助你考试轻松过关。 411、吊篮在动力试验时&#xff0c;应有超过&#xff08;&#xff09;额定载重…...

    2024/4/16 9:30:51
  19. mysql迁移data文件后无法打开

    官方迁移教程地址&#xff1a;https://dev.mysql.com/doc/refman/8.0/en/innodb-moving-data-files-offline.html 官方对此操作的称呼&#xff1a;服务器离线时移动表空间文件 修改my.cnf(mac系统下)、my.ini(win系统下)配置文件 [mysqld]datadir/Volumes/mac-back/mysql/dat…...

    2024/4/14 1:59:51
  20. Echarts图表之条形进度条(二)

    <!DOCTYPE html> <html> <head> <meta charset"utf-8" /> <title>Echarts图表</title> <!-- 引入echarts.min.js --> <script src"https://cdn.staticfile.org/echarts/4.3.…...

    2024/4/19 19:47:16

最新文章

  1. Qt 把.exe打包成安装文件形式

    目录 1.下载工具 Qt Installer Framework2.将bin文件添加到环境变量3.拷贝startmenu示例-备用4.准备Qt Release打包好的程序5.把Release打包好的程序放到packages\org.qtproject.ifw.example\data文件夹下6.生成安装包7.修改安装包图标8.修改主程序程序安装引导-创建快捷键9.添…...

    2024/4/26 12:06:03
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. HiveSQL如何生成连续日期剖析

    HiveSQL如何生成连续日期剖析 情景假设&#xff1a; 有一结果表&#xff0c;表中有start_dt和end_dt两个字段&#xff0c;&#xff0c;想要根据开始和结束时间生成连续日期的多条数据&#xff0c;应该怎么做&#xff1f;直接上结果sql。&#xff08;为了便于演示和测试这里通过…...

    2024/4/26 10:38:31
  4. yolov9直接调用zed相机实现三维测距(python)

    yolov9直接调用zed相机实现三维测距&#xff08;python&#xff09; 1. 相关配置2. 相关代码2.1 相机设置2.2 测距模块2.2 实验结果 相关链接 此项目直接调用zed相机实现三维测距&#xff0c;无需标定&#xff0c;相关内容如下&#xff1a; 1. yolov4直接调用zed相机实现三维测…...

    2024/4/25 5:18:48
  5. 解析大语言模型训练三阶段

    大语言模型的训练过程一般包括3个阶段&#xff1a;预训练&#xff08;Pre-training&#xff09;、SFT&#xff08;有监督的微调&#xff0c;Supervised-Finetuning&#xff09;以及RLHF&#xff08;基于人类反馈的强化学习&#xff0c;Reinforcement Learning from Human Feedb…...

    2024/4/23 6:25:26
  6. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/4/25 11:51:20
  7. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/25 18:39:24
  8. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/25 18:38:39
  9. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/25 18:39:23
  10. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/25 18:39:22
  11. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/25 18:39:22
  12. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/25 18:39:20
  13. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/25 16:48:44
  14. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/25 13:39:44
  15. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/25 18:39:16
  16. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/25 18:39:16
  17. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/25 0:00:17
  18. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/25 4:19:21
  19. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/25 18:39:14
  20. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/4/25 18:39:12
  21. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/25 2:10:52
  22. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/25 18:39:00
  23. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/25 13:19:01
  24. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/25 18:38:58
  25. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/25 18:38:57
  26. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  27. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  28. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  29. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  30. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  31. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  32. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  33. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  34. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  35. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  36. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  37. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  38. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  39. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  40. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  41. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  42. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  43. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  44. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  45. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57