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

基于three.js的虚拟人阴影渲染优化方案

作者:来自 vivo 互联网大前端团队- Su Ning

本文将探讨 three.js 中的阴影渲染机制,并分享一些针对性能和效果优化的实用技巧,帮助开发者在不同场景下做出最佳的权衡选择。

一、前言

在3D网页应用中,高质量的阴影渲染对于营造场景的真实感至关重要。作为广泛采用的 WebGL 框架之一,three.js 为开发者提供了多种阴影渲染选项,使得创建生动逼真的光影效果成为可能。然而,实现这些视觉上的增强往往伴随着性能开销,尤其在处理复杂场景或运行于低端设备时更为明显。因此,在确保画面质量的同时优化阴影渲染,以提升用户体验和保持流畅性,便成了一个核心挑战。本文将解析 three.js 中的阴影渲染机制,并提供一系列实用的优化策略,助力开发者在不同应用场景下达成最佳平衡。

二、数字人中使用的阴影

在开发拟我形象的过程中,恰当运用阴影可以显著增加模型的立体感与真实度。同时,在地面上添加阴影不仅能够为观察者提供空间定位的参考点,还能大大增强场景的空间层次感和沉浸体验。

图1(全局阴影)

图2(地面阴影)

接下来,我们将探讨全局阴影的优化方法以及地面阴影的具体实施方案。

三、全局阴影的优化

全局阴影的实现主要依赖于 three.js 提供的 shadowMap。只需简单几步——在 WebGLRenderer 中启用 shadowMap 功能、定义产生阴影的光源以及设定哪些物体负责投射或接收阴影——即可轻松完成设置。

若仅使用 three.js 默认配置下的阴影设置,虽然操作简便但效果通常不尽如人意。特别是在针对移动平台进行开发时,考虑到性能限制,我们有必要对 three.js 的阴影特性做进一步研究:

3.1 three.js 的阴影

在 three.js 中,阴影的类型主要有两种,分别是硬阴影(hard shadows)和软阴影(soft shadows)。硬阴影的边缘清晰,常用于模拟光源较小或光源位置靠近物体的场景;软阴影的边缘较模糊,更加接近现实中的阴影效果。这两种阴影效果是通过不同的阴影贴图(shadow map)类型实现的。以下是常见的阴影类型:

3.1.1 BasicShadowMap(硬阴影)

特性: 这是最基本的阴影类型,计算速度快,性能开销小,但效果相对简单。生成的阴影没有柔和的边缘,呈现出硬边界。

用途: 用于性能要求较高但不太关注阴影效果的场景。

图3(BasicShadowMap)

3.1.2 PCFShadowMap (Percentage-Closer Filtering)(软阴影)

特性: 默认的阴影类型,边缘相对柔和。使用了一种简单的滤波技术来使阴影边缘变得平滑。

用途: 大多数情况下推荐使用,效果较好,性能开销也可以接受。

图4(PCFShadowMap)

3.1.3 PCFSoftShadowMap(软阴影)

特性: 在 PCFShadowMap 的基础上,进一步对阴影的柔和度进行了优化,提供更柔和的阴影边缘效果,但性能开销会更大。

用途: 用于需要较高质量阴影效果的场景。

图5(PCFSoftShadowMap)

3.1.4 VSMShadowMap (Variance Shadow Map)(软阴影)

特性: 使用了方差阴影贴图算法,能够生成高质量且无锯齿的柔和阴影。相比 PCF 技术,它可以产生更加平滑的效果,并且可以避免常见的阴影采样问题。但该技术可能会产生“光晕”现象。

用途: 适用于高质量阴影场景,特别是需要柔和渐变的阴影效果。

图6(VSMShadowMap)

从上面的预览图可以看出,对于 BasicShadowMap 和 PCFShadowMap,阴影的边缘有比较多的锯齿,而对于 PCFSoftShadowMap,除了有更多的性能开销之外,人物在动的时候边缘也会有明显的闪烁的情况出现,而且边缘模糊半径过大导致阴影的效果并不明显。使用 VSMShadowMap 虽然可以得到相对好的效果,但是会出现严重的伪影问题,虽然可以通过调整 shadow 的偏置值(bias)来解决,但是过大的 bias 值会使得阴影的深度测试结果偏移过多,导致阴影被错误地渲染得过远,从而产生不自然的视觉效果。

作为一个手机上的H5页面,除了要保障基础的视觉效果,还需要优化性能以使其运行在更多的设备上,为了实现一开始向大家展示的效果同时不增加性能的开销,我们有了下面的优化思路。

3.2 优化思路

要想有一个比较好的阴影效果,首先不能是硬阴影,所以排除了 BasicShadowMap;

由于 PCFSoftShadowMap 对于性能的开销较大的同时效果提升的也不是很明显,所以也排除掉;最后由于伪影难以控制,所以我们选择了基于 PCFShadowMap进行优化。

为了得到更好的阴影边缘,可以通过提升 shadowMap 的分辨率来优化,但是分辨率的提升势必会导致性能开销变大,如何在不提升贴图分辨率的情况下提升阴影边缘的质量呢?

我们都知道在不同尺寸的屏幕相同分辨率的情况下,越小的屏幕显示效果越细腻,DirectionalLight 在生成阴影时,会使用一个正交相机(OrthographicCamera)来确定渲染阴影的区域。这个相机的四个边界(left、right、top、bottom)定义了阴影贴图的范围。通过缩小这些边界,可以将阴影贴图的像素更集中于需要渲染阴影的区域,从而提升阴影的清晰度。实际上在虚拟人的场景中,用户的主要注意力都集中在头部区域,所以只要将阴影相机聚焦在头部的区域即可,而不需要获取全局的阴影。

const bias = 1.6 // 设置一个y轴的偏置值,使得阴影相机可以正对人脸
const mainLight = new THREE.DirectionalLight(0xf2f7ff)
mainLight.intensity = 1.8
mainLight.position.set(0.3, 0.81 + bias, 2.71)const target = new THREE.Object3D()
target.position.set(0, bias, 0)  // 设置灯光的照射目标
group.add(target)
mainLight.target = target
mainLight.castShadow = truemainLight.shadow.radius = 2  // 设置阴影边缘的模糊半径,这个值并不是越大越好,需要根据实际场景进行微调
const { camera } = mainLight.shadow
camera.far = 5// 阴影相机的默认边界为上下左右分别为5,将其缩小至各0.5
camera.top = -0.5
camera.bottom = 0.5
camera.left = -0.5
camera.right = 0.5

四、地面阴影的实现

在最开始的动图(图2)中,除了脸部的阴影,还有一个地面的阴影,很显然地面阴影不可能专门打一束光照在脚上获得,这样会使得整体的光影显得很奇怪,那么地面阴影是怎么实现的呢。

实际上这里参考了

model-viewer (https://github.com/google/model-viewer)

的实现,地面上的阴影实际上是一个方形加上阴影贴图:

  • 创建一个正交相机,将相机的位置设置在脚下,朝向上方并有一点点倾角,获取到从地面向上看的图像;

  • 创建一个材质,并且自定义着色器渲染物体的深度信息,渲染第一步创建的相机的场景的时候将材质赋值给scene.overrideMaterial属性,这样场景中所有的物体都会使用这个材质进行渲染;

  • 再创建一个正交相机,用于模糊第一个相机获取到的图像;

  • 将模糊后的图像作为贴图,应用到地板平面上;

  • 此方案在每帧画面渲染之前都要再额外先把地面阴影的场景渲染出来,所以会增加额外的性能开销,由于地面阴影的边缘经过模糊平滑的处理,所以分辨率并不需要太高,贴图尺寸设置为64*64即可,有效的控制地面阴影带来的性能损失。

// 设置阴影渲染目标,作为阴影贴图
const size = 64
const shadowTarget = new THREE.WebGLRenderTarget(size, size)
const shadowTargetBlur = new THREE.WebGLRenderTarget(size, size)
this.shadowTarget = shadowTarget
this.shadowTargetBlur = shadowTargetBlur// 调整位置
this.position.set(0, -0.05, 0)
this.rotateX(Math.PI / 2)  //旋转地板与地面平行// 设置阴影相机
const camera = new THREE.OrthographicCamera(-0.75, 0.75, 0.75, -0.75, 0, 0.5)// 设置地面相机的一个倾斜角度
camera.rotateX(Math.PI / 6)
camera.rotateY(Math.PI / 6)
this.add(camera)
this.camera = camera// 设置视觉相机
const visionCamera = new THREE.OrthographicCamera(-0.75, 0.75, 0.75, -0.75, 0, 2)
this.add(visionCamera)
this.visionCamera = visionCamera// 设置深度材质的片段着色器
this.depthMaterial.onBeforeCompile = function (shader) {shader.fragmentShader = shader.fragmentShader.replace('gl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );','gl_FragColor = vec4( vec3( 0.0 ), ( 1.0 - fragCoordZ ) * opacity );')
}// 创建地板
const planeGeometry = new THREE.PlaneGeometry(1.5, 1.5)
const material = new THREE.MeshBasicMaterial({opacity: 0.3,transparent: true,map: shadowTarget.texture,side: THREE.DoubleSide,color: 0x666666
})
const plane = new THREE.Mesh(planeGeometry, material)
visionCamera.add(plane)const blurPlane = new THREE.Mesh(planeGeometry)
blurPlane.visible = false
visionCamera.add(blurPlane)this.plane = plane
this.blurPlane = blurPlane

五、结语

针对全局阴影和地面阴影,我们采取了不同的优化方式:

  • 通过合理选择阴影的渲染方式、优化阴影相机的视野范围以及优化阴影贴图的分辨率,可以在保证性能没有明显提升的情况下显著提升阴影的品质;

  • 通过获取底部视角的深度信息结合自定义shader来生成地面阴影,对页面的性能没有明显的损耗的同时达到一个比较好的效果。

后续也可以通过在 webview 注入机型信息,通过机型对手机的性能进行分级,调用针对性的渲染方案,可以使页面在流畅运行的前提下进一步提升画面的表现。为了实现更好的阴影效果,也可以对 three.js 的阴影相机进行扩展,实现多机位 shadowMap 等能力,在不增加太多负载的情况下进一步提升阴影的效果。

相关文章:

基于three.js的虚拟人阴影渲染优化方案

作者:来自 vivo 互联网大前端团队- Su Ning 本文将探讨 three.js 中的阴影渲染机制,并分享一些针对性能和效果优化的实用技巧,帮助开发者在不同场景下做出最佳的权衡选择。 一、前言 在3D网页应用中,高质量的阴影渲染对于营造场…...

人工智能中神经网络是如何进行预测的

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 https://www.captainbed.cn/north 文章目录 引言神经网络的基本结构神经网络的前向传播前向传播的步骤激活函数 代码实现流程图详细解释…...

vue3 中使用 Recorder 实现录音并上传,并用Go语言调取讯飞识别录音(Go语言)

录音并识别 效果图一、开启游览器录音权限二、前端代码三、Go代码,上传到讯飞识别录音返回到前端 效果图 recorder-core插件可以在网页中进行录音。录音文件(blob)并可以自定义上传,可以下载录音文件到本地,本文录音过程中会显示可视化波形,插件兼容PC端…...

自探索大语言模型微调(一)

一、数据 1.1、失败案例 Hugging Face: 根据B站上搜索到的资料,datasets这个库可以直接下载丰富的数据集合和与训练模型,调用也非常的简单,唯一的缺点就是,需要外网(翻墙),用国内的…...

算法练习(链表)

链表 链表的分类 单向链表,双向链表带头链表,不带头链表循环的,非循环的 链表的结构 图中所示的为链表的一个节点,value是这个节点的所存储的数据值,next为下一节点的地址。 代码实现链表 1.创建节点类 节点由…...

在 Ubuntu 服务器上使用宝塔面板搭建博客

📌 介绍 在本教程中,我们将介绍如何在 Ubuntu 服务器 上安装 宝塔面板,并使用 Nginx PHP MySQL 搭建一个博客(如 WordPress)。 主要步骤包括: 安装宝塔面板配置 Nginx PHP MySQL绑定域名与 SSL 证书…...

K8S学习之基础二十八:k8s中的configMap

k8s中的configMap ​ configMap是k8s的资源对象,简称cm,用于保存非机密性的配置,数据可以用key/value键值对形式保存,也可以通过文件形式保存 ​ 在部署服务的时候,每个服务都有自己的配置文件,如果一台服…...

EDID读取学习

简介 Video BIOS可以被认为是一个具有独立硬件抽象层的操作系统。它不会阻止或监视操作系统、应用程序或设备驱动程序对硬件的直接访问。虽然不推荐,但一些DOS应用程序确实可以改变基本的硬件设置,而根本不需要通过视频BIOS。大多数现代应用程序和操作系统都避免直接使用硬件…...

基于 SSE 和 WebSocket 的在线文本实时传输工具

简介 在线文本实时传输工具支持 SSE(Server-Sent Events) 和 WebSocket,可在不同设备间快速共享和同步文本,适用于跨设备协作、远程办公和即时通讯。 核心功能 实时同步:文本输入后,另一端用户可立即看到…...

​​​​​​​大语言模型安全风险分析及相关解决方案

大语言模型的安全风险可以从多个维度进行分类。 从输入输出的角度来看,存在提示注入、不安全输出处理、恶意内容生成和幻觉错误等风险; 从数据层面来看,训练数据中毒、敏感信息泄露和模型反演攻击是主要威胁; 模型自身则面临拒绝服务和盗窃的风险; 供应链和插件的不安全引…...

4、linux c 进程

【三】进程 1. 进程与程序的区别 程序:存放在磁盘上的指令和数据的有序集合(文件),是静态的。 进程:执行一个程序所分配的资源的总称,是动态的。 2. 进程的组成部分 BSS段(bss)&…...

OpenFeign

OpenFeign 工作原理详解 1. 声明式接口 开发者通过定义一个接口,并使用特定的注解(如GetMapping, PostMapping等)来描述HTTP请求。OpenFeign会根据这些注解自动生成相应的HTTP请求。 注解支持: FeignClient:用于定…...

Centos离线安装perl

文章目录 Centos离线安装perl1. perl是什么?2. Perl下载地址3. perl的安装4. 安装结果验证 Centos离线安装perl 1. perl是什么? Perl 是一种 高级脚本语言,诞生于 1987 年,以强大的 文本处理能力 和灵活性著称,常用于…...

RabbitMQ可靠性进制

文章目录 1.生产者可靠性生产者重连生产者确认小结 2. MQ的可靠性数据持久化LazyQueue小结 3. 消费者的可靠性消费者确认机制消费者失败处理方案业务幂等性唯一消息ID业务判断 兜底方案业务判断 兜底方案 1.生产者可靠性 生产者重连 在某些场景下由于网络波动,可能…...

PHP优化技术

最近在学习php语言,打算用来提升开发小项目的效率。下面是php项目中常见的优化手段。 1、引起php性能问题的原因 (1)php语法使用不当 (2)使用php做了它不擅长的事 (3)用php连接的服务不给力 &…...

【Go类库分享】Go expr 通用表达式引擎

【Go类库分享】Go expr 通用表达式引擎 官方教程:https://expr-lang.org/docs/language-definition 官方Github:https://github.com/expr-lang/expr 文章所含代码地址:https://github.com/ziyifast/ziyifast-code_instruction/tree/main/go-d…...

线性代数(1)用 excel 计算鸡兔同笼

线性代数excel计算鸡兔同笼 案例:鸡兔同笼问题的三种解法(递进式教学)一、问题描述二、方程式解法(基础版)步骤解析 三、线性代数解法(进阶版)1. 方程组转化为矩阵形式2. 矩阵求解(逆…...

Docker基础知识介绍

Docker基础篇 必须要在Linux环境下才能运行,windows下运行也是安装虚拟机后才能下载安装运行 下载安装 linux 依次执行下边步骤 更新 yum yum update 卸载旧的Docker yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \do…...

机器人交社保属于“无稽之谈”?

今晨浏览社交网站,惊奇地看到“给机器人上社保”的网页搜索结果竟然多达“约 3,280,000个”。所以被称为“无稽之谈”和“本质上是利用社保之名收税”就实不为过,而且还会让人读罢笑得喷饭:“连搞笑大王赵本山见了,也定会拱手作揖…...

接口测试和功能测试的区别

接口测试和功能测试的区别 一 **接口测试概述**1.1 定义1.2 优缺点 二 **功能测试概述**2.1 定义2.2 优缺点 三 **主要区别**四 两者在测试点的区别4.1 **接口测试的测试点**4.2 **功能测试的测试点**4.3 **接口测试 vs. 功能测试的测试点对比** 五 区别类比**例子背景**&#…...

人工智能中的线性代数基础详解

‌ 线性代数是人工智能领域的重要数学基础之一,是人工智能技术的底层数学支柱,它为数据表示、模型构建和算法优化提供了核心工具。其核心概念与算法应用贯穿数据表示、模型训练及优化全过程。更多内容可看我文章:人工智能数学基础详解与拓展-CSDN博客 一、基本介绍 …...

nginx不在默认的yum仓库的解决方法

1、添加 Nginx 官方仓库 epel-release 是 Extra Packages for Enterprise Linux 的仓库,包含了 nginx 等常用软件。 sudo yum install -y epel-release sudo yum install -y nginx 2、手动添加 Nginx 仓库 如果 epel-release 不可用,可以手动添加 Ng…...

IXTUR气控永磁铁:以高精度气控和稳定磁场,为机器人应用提供稳定抓取力

在现代工业生产和物流领域,物料的抓取与搬运是影响生产效率和成本控制的重要环节。传统夹爪在面对不同材质、形状和重量的物体时,常常存在适应性差、抓取不稳定、操作复杂等问题,导致生产流程中频繁出现停机调整,增加了人工干预成…...

【uni-app运行错误】SassError: expected selector @import “@/uni.scss“;

ERROR in ./src/pages/biddingViews/address_add.vue?vue&typestyle&index0&id41672bf3&scopedtrue&langscss& (./node_modules/vue/cli-service/node_modules/css-loader/dist/cjs.js??clonedRuleSet-22[0].rules[0].use[1]!./node_modules/dcloud…...

堆排序:力扣215.数组中的第K个大元素

一、问题描述 在一个整数数组 nums 中,需要找出第 k 个最大的元素。这里要注意,我们要找的是数组排序后的第 k 个最大元素,而不是第 k 个不同的元素。例如,对于数组 [3,2,1,5,6,4],当 k 2 时,第 2 个最大…...

【网络协议】应用层协议HTTPS

文章目录 为什么引入HTTPS?基本概念加密的基本过程对称加密非对称加密中间人攻击证书 为什么引入HTTPS? 由于HTTP协议在网络传输中是明文传输的,那么当传输一些机密的文件或着对钱的操作时,就会有泄密的风险,从而引入…...

网络安全防护总体架构 网络安全防护工作机制

1 实践内容 1.1 安全防范 为了保障"信息安全金三角"的CIA属性、即机密性、完整性、可用性,信息安全领域提出了一系列安全模型。其中动态可适应网络安全模型基于闭环控制理论,典型的有PDR和P^2DR模型。 1.1.1 PDR模型 信息系统的防御机制能…...

图像处理篇---图像预处理

文章目录 前言一、通用目的1.1 数据标准化目的实现 1.2 噪声抑制目的实现高斯滤波中值滤波双边滤波 1.3 尺寸统一化目的实现 1.4 数据增强目的实现 1.5 特征增强目的实现:边缘检测直方图均衡化锐化 二、分领域预处理2.1 传统机器学习(如SVM、随机森林&am…...

探针泄露(WEB)

##解题思路 题目提示是探针泄露,未及时删除的探针可能造成严重的数据泄露 探针的文件常见命名为tz.php,访问它 对于php相关参数,我们是可以点击的,点击phpinfo访问 跳转后搜索flag,得到flag...

Webpack总结

Webpack是一个前端模块打包工具。它可以将多个模块按照依赖关系进行静态分析,并生成一个或多个打包后的文件。 Webpack的核心概念包括entry(入口)、output(输出)、loader(加载器)和plugin&…...

什么是物理信息神经网络PINN

定义原理 物理信息神经网络(PINN)是一种创新的机器学习方法,将深度学习与物理知识相结合,旨在解决偏微分方程(PDE)相关问题。PINN的核心思想是在神经网络的训练过程中引入物理定律,从而提高模型的泛化能力和预测精度。 PINN的工作原理基于以下关键步骤: 构建神经网络…...

Java面向对象(中)

面向对象(中) 1.继承性 继承性的好处: 减少了代码的冗余,提高了代码的复用性。 便于功能的拓展。 为多态性的使用提供了前期。 格式: class A extends B {} A:子类,派生类,subclass。 B:父类&#x…...

ospf单区域

OSPF单区域是指将整个自治系统(AS)内的所有路由器划分到同一个逻辑区域(Area 0,即骨干区域)中运行的OSPF协议模式。以下是其核心要点: 一、定义与核心特点 ‌区域统一性‌ 所有路由器均属于同一区域&…...

kali之nmap

kali之nmap Nmap(Network Mapper)是 Kali Linux 中最著名的网络扫描工具之一,广泛用于网络发现、端口扫描、服务识别、操作系统检测等任务。它是一个功能强大且灵活的开源工具,适用于渗透测试、网络管理和安全审计。 1. Nmap 的主…...

【Rust基础】排序和分组

排序 简单排序 整数排序 #[test] fn test_sort(){let mut list vec![1, 5, 3, 2, 4];list.sort(); //✔assert_eq!(list, vec![1, 2, 3, 4, 5]); }小数排序 #[test] fn test_sort(){let mut list vec![1, 5, 3, 2, 4];//❌ 不能直接使用sort,因为f32和f64未实现O…...

HarmonyOS NEXT开发实战——HUAWEI DevEco Studio 开发指南

概述 HUAWEI DevEco Studio(以下简称 DevEco Studio)是基于 IntelliJ IDEA Community 开源版本打造的一站式开发平台,专为 HarmonyOS 系统上的应用和元服务(以下简称 应用/元服务)提供高效的开发环境。 作为一款专业…...

R 语言科研绘图 --- 密度图-汇总

在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...

【拒绝算法PUA】LeetCode 2270. 分割数组的方案数

系列文章目录 【拒绝算法PUA】0x00-位运算 【拒绝算法PUA】0x01- 区间比较技巧 【拒绝算法PUA】0x02- 区间合并技巧 【拒绝算法PUA】0x03 - LeetCode 排序类型刷题 【拒绝算法PUA】LeetCode每日一题系列刷题汇总-2025年持续刷新中 C刷题技巧总结: [温习C/C]0x04 刷…...

k8s 配置两个deployment主机级别互斥部署

在 Kubernetes 中,要实现两个 Deployment 的 Pod 在主机级别互斥部署,可以使用 podAntiAffinity 配置。通过设置 podAntiAffinity,可以确保两个 Deployment 的 Pod 不会被调度到同一节点上。 实现步骤 定义 Deployment: 为每个…...

Axure大屏可视化原型模板及素材:数据可视化的高效解决方案

数据可视化已成为企业决策、运营分析、市场洞察的重要工具。数据可视化大屏,作为数据展示和交互的直观平台,能够实时呈现关键数据,帮助企业快速做出决策。Axure作为原型设计领域的领先工具,以其丰富的组件库、强大的交互设计能力和…...

AGI大模型(2):GPT:Generative Pre-trained Transformer

1 Generative Pre-trained Transformer 1.1 Generative生成式 GPT中的“生成式”指的是该模型能够根据输入自动生成文本内容,而不仅仅是从已有的文本库中检索答案。 具体来说: 生成(Generative):GPT是一个生成式AI模型,能够根据给定的提示(Prompt)动态生成连贯、…...

Profinet转Profinet以创新网关模块为核心搭建西门子和欧姆龙PLC稳定通讯架构案例​

你是否有听过PROFINET主站与PROFINET主站之间需要做数据通讯有需求? 例如西门子1500与霍尼韦尔DCS系统两个主站之间的通讯。应用于PROFINET为主站设备还有欧姆龙、基恩士、罗克韦尔、施耐德、GE、ABB等品牌的PLC或DCS、FCS等平台。在生产或智能领域有通讯需求。两头…...

函数调用汇编

目录 一、核心概念 二、函数调用过程(以 x86 cdecl 为例) 三、x86 vs x64 区别 四、示例分析(C代码 → 汇编) 五、常见问题 一、核心概念 调用约定 (Calling Convention) 规定参数传递顺序(如 cdecl 是右到左&…...

LabVIEW 线性拟合

该 LabVIEW 程序实现了 线性拟合(Linear Fit),用于计算给定一组数据点的斜率(Slope)和截距(Intercept),并将结果可视化于 XY Graph 中。本案例适用于数据拟合、实验数据分析、传感器…...

在办公电脑上本地部署 70b 的 DeepSeek 模型并实现相应功能的大致步骤

以下是为客户在办公电脑上本地部署 70b 的 DeepSeek 模型并实现相应功能的大致步骤: 硬件准备: 70b 模型对硬件要求较高,确保办公电脑有足够强大的 GPU(例如 NVIDIA A100 等高端 GPU,因为模型规模较大,普通…...

国产编辑器EverEdit - 脚本(解锁文本编辑的无限可能)

1 脚本 1.1 应用场景 脚本是一种功能扩展代码,用于提供一些编辑器通用功能提供不了的功能,帮助用户在特定工作场景下提高工作效率,几乎所有主流的编辑器、IDE都支持脚本。   EverEdit的脚本支持js(语法与javascript类似)、VBScript两种编程…...

网络安全需要学多久才能入门?

网络安全是一个复杂且不断发展的领域,想要入行该领域,我们需要付出足够多的时间和精力好好学习相关知识,才可以获得一份不错的工作,那么网络安全需要学多久才能入门?我们通过这篇文章来了解一下。 学习网络安全的入门时间因个人的…...

H5端vue3 SSR 项目报错小计

H5端vue3 SSR 项目报错小计 环境 "vue-router": "^4.1.6" "vue": "^3.2.45", "vant": "^3.4.9",报错复现 ①.页面刷新点击 RouterLink 跳转链接, 页面无法跳转 问题排查 ①.去除 van-popup 使用的 teleport“…...

【Node.js入门笔记4---fs 目录操作】

Node.js入门笔记4 Node.js---fs 目录操作一、目录操作1.fs.mkdir():创建目录。异步,非阻塞。创建单个目录创建多个目录创建目前之前需要确认是否存在: 2. fs.mkdirSync():用于创建一个新的目录。异步,非阻塞。3.fs.rmd…...

xcode 旧版本、历史版本下载

下载链接:https://developer.apple.com/download/all/ 版本发布日志:https://developer.apple.com/documentation/xcode-release-notes 需要登录开发者账号,搜索下载即可: 再贴一下网友做的版本统计macOS 版本对应的 Xcode 版本&…...