Three.js贴图技巧:优化性能与效果
引言
在当今数字化的时代,WebGL 技术为开发者们打开了一扇通往交互式 3D 图形世界的大门,而 Three.js 作为JavaScript库中的佼佼者,凭借其简单易用的 API 和丰富的功能,在创建3D场景和交互应用方面得到了广泛应用。在Three.js构建的虚拟世界中,贴图扮演着至关重要的角色。从赋予模型逼真的材质质感,到增强场景的视觉吸引力,贴图的质量直接影响着用户的体验。然而,随着场景复杂度的增加和贴图数量的增长,如何在保证贴图效果的同时优化性能,成为了开发者们必须面对的重要课题。本文将深入探讨Three.js贴图的相关知识,分享一系列优化性能与效果的实用技巧,并通过丰富的代码示例进行详细说明,帮助读者更好地理解和应用这些技巧,从而提升Three.js项目的品质。
Three.js贴图基础
纹理映射原理
纹理映射是将二维图像(纹理)应用到三维模型表面的技术。在Three.js中,通过在三维空间中定义每个顶点的纹理坐标(U、V坐标),然后在渲染过程中将纹理图像按照这些坐标映射到模型表面。例如,对于一个正方体模型,每个面的四个顶点都有对应的纹理坐标,将坐标与纹理图像的像素位置对应,就能实现纹理的正确应用。
常见贴图类型
• 漫反射贴图(Diffuse Map):用于模拟物体表面的基础颜色和纹理细节。例如创建木质桌子模型时,漫反射贴图可以是一张包含木材纹理的图像,使桌子呈现出逼真的木质外观。
• 法线贴图(Normal Map):模拟物体表面的微观凹凸细节,在视觉上产生凹凸感,而不增加实际的多边形数量。常用于创建石头、墙壁等具有复杂细节的模型。
• 高光贴图(Specular Map):控制物体表面的高光强度和分布。例如在创建汽车模型时,金属部件和塑料部件可以有不同的表现。
基本贴图的创建与应用
以下是一个创建与应用基本贴图的示例代码:
// 创建纹理加载器
const textureLoader = new THREE.TextureLoader();
// 加载漫反射贴图
const diffuseMap = textureLoader.load('path/to/diffuse.png');// 创建基础材质并应用漫反射贴图
const material = new THREE.MeshBasicMaterial({ map: diffuseMap });// 创建几何形状
const geometry = new THREE.BoxGeometry(1, 1, 1);
// 创建网格对象,将材质应用到几何形状上
const cube = new THREE.Mesh(geometry, material);
// 将网格对象添加到场景中
scene.add(cube);
在上述代码中,首先使用THREE.TextureLoader
加载了一个漫反射贴图图像。然后创建了一个MeshBasicMaterial
材质,并将贴图赋值给材质的map
属性。接着创建了一个立方体几何形状BoxGeometry
,并将其与材质一起创建为一个Mesh
网格对象。最后,将该网格对象添加到场景中。
影响Three.js贴图性能的因素
贴图分辨率
贴图分辨率是指纹理图像的像素数量。高分辨率贴图虽然能提供更清晰的细节,但会消耗更多内存和GPU资源。
纹理过滤方式
纹理过滤决定了纹理在不同缩放情况下的采样和插值方式,常见的方式有线性过滤和最近邻过滤。
Mipmapping技术
Mipmapping预先生成一系列逐渐缩小的纹理图像,根据物体与相机的距离自动选择合适的mipmap级别,有助于减少纹理闪烁和提高渲染性能。
纹理压缩格式
纹理压缩可以减少纹理图像占用的内存空间,但需权衡性能和兼容性。
其他因素
如纹理的加载和卸载策略、重复使用模式以及CPU和GPU之间的数据传输开销等也会影响贴图性能。
Three.js贴图性能优化技巧
合理控制贴图分辨率
根据模型在场景中的重要性和远近程度选择合适的贴图分辨率。以下是一个简单的示例,展示如何根据物体远近调整贴图分辨率:
// 假设存在一个相机和多个物体
const objects = [obj1, obj2, obj3,...]; objects.forEach((obj) => {const distance = obj.position.distanceTo(camera.position);if (distance > 10) {obj.material.map.image.width = 128;obj.material.map.image.height = 128;} else {obj.material.map.image.width = 512;obj.material.map.image.height = 512;}obj.material.map.needsUpdate = true;
});
在上述代码中,遍历场景中的物体,计算每个物体与相机的距离。根据距离远近,调整物体材质的贴图分辨率。
选择合适的纹理过滤模式
在一些对性能要求较高但不需要极致平滑效果的场景中,优先使用最近邻过滤;在需要高质量渲染的静态物体场景中,可使用线性过滤并结合Mipmapping。以下是设置纹理过滤模式的示例代码:
const diffuseMap = textureLoader.load('path/to/diffuse.png');// 设置纹理过滤模式为最近邻过滤
diffuseMap.minFilter = THREE.NearestFilter;
diffuseMap.magFilter = THREE.NearestFilter;// 创建材质
const material = new THREE.MeshBasicMaterial({ map: diffuseMap });
在上述代码中,将加载的纹理的minFilter
和magFilter
属性设置为THREE.NearestFilter
,即使用最近邻过滤模式。
正确使用Mipmapping
对于大型场景或有许多移动物体的场景,Mipmapping可减少纹理闪烁和性能消耗。以下是使用Mipmapping的示例:
const diffuseMap = textureLoader.load('path/to/diffuse.png');// 确保生成mipmap
diffuseMap.generateMipmaps = true;
diffuseMap.minFilter = THREE.LinearMipMapLinearFilter;const material = new THREE.MeshBasicMaterial({ map: diffuseMap });
在上述代码中,设置了纹理的generateMipmaps
属性为true
,并选择合适的minFilter
属性来使用Mipmapping。
运用纹理压缩技术
根据目标平台和设备选择合适的纹理压缩格式。例如,在一些支持ASTC格式的移动设备上可提高性能:
// 假设支持ASTC压缩格式
const compressedTexture = textureLoader.load('path/to/compressed_texture.astc');
const material = new THREE.MeshBasicMaterial({ map: compressedTexture });
在上述代码中,加载一个使用ASTC压缩格式的纹理,并将其应用于材质。
采用纹理图集
以下是将多个纹理合并为纹理图集并应用的示例代码:
// 假设已经有一个合并好的纹理图集图像
const atlasTexture = textureLoader.load('path/to/atlas_texture.png');// 设置纹理的uv坐标来对应不同的子纹理
const spriteMaterial1 = new THREE.SpriteMaterial({ map: atlasTexture, // 针对第一个子纹理设置uv坐标uvs: [0, 0, 0.25, 0, 0.25, 1, 0, 1]
});
const sprite1 = new THREE.Sprite(spriteMaterial1);const spriteMaterial2 = new THREE.SpriteMaterial({ map: atlasTexture, // 针对第二个子纹理设置uv坐标uvs: [0.25, 0, 0.5, 0, 0.5, 1, 0.25, 1]
});
const sprite2 = new THREE.Sprite(spriteMaterial2);scene.add(sprite1);
scene.add(sprite2);
在上述代码中,加载纹理图集图像,然后通过设置uvs
属性来指定每个子纹理在纹理图集中的位置,从而创建多个精灵并应用对应的子纹理。
Three.js贴图效果优化方法
增强纹理的真实感
结合法线贴图和高光贴图增强纹理的真实感。以下是一个简单的示例:
// 加载法线贴图和高光贴图
const normalMap = textureLoader.load('path/to/normal_map.png');
const specularMap = textureLoader.load('path/to/specular_map.png');// 创建材质并应用法线贴图和高光贴图
const material = new THREE.MeshPhongMaterial({map: diffuseMap,normalMap: normalMap,specularMap: specularMap
});
在上述代码中,加载法线贴图和高光贴图,并将它们与漫反射贴图一起应用于MeshPhongMaterial
材质。
改善光照对贴图的影响
合理设置光照模型和参数,确保光照与贴图良好结合。以下是设置光照的示例:
// 创建点光源
const pointLight = new THREE.PointLight(0xffffff, 1, 100);
pointLight.position.set(10, 10, 10);// 将点光源添加到场景中
scene.add(pointLight);
在上述代码中,创建一个点光源,并设置其位置和颜色等属性,然后将其添加到场景中。
处理纹理的拼接和边缘问题
使用无缝纹理或调整UV坐标来实现自然拼接。以下是调整UV坐标处理拼接的示例:
// 假设有两个纹理需要拼接的模型
const geometry = new THREE.PlaneGeometry(2, 2);const mesh1 = new THREE.Mesh(geometry, material1);
mesh1.geometry.attributes.position.array[0] += 1; // 调整第一个模型的位置
mesh1.geometry.attributes.uv.array[0] = 0; // 调整第一个模型的UV坐标const mesh2 = new THREE.Mesh(geometry, material2);
mesh2.geometry.attributes.position.array[0] -= 1; // 调整第二个模型的位置
mesh2.geometry.attributes.uv.array[0] = 1; // 调整第二个模型的UV坐标scene.add(mesh1);
scene.add(mesh2);
在上述代码中,通过调整模型的位置和UV坐标,实现两个纹理的拼接。
结论与展望
在Three.js开发中,贴图的性能与效果优化至关重要。通过合理控制贴图分辨率、选择合适的纹理过滤模式、有效运用Mipmapping技术和纹理压缩等性能优化技巧,以及增强纹理真实感、改善光照效果和处理纹理拼接等效果优化方法,可以显著提升Three.js项目的品质。
相关文章:
Three.js贴图技巧:优化性能与效果
引言 在当今数字化的时代,WebGL 技术为开发者们打开了一扇通往交互式 3D 图形世界的大门,而 Three.js 作为JavaScript库中的佼佼者,凭借其简单易用的 API 和丰富的功能,在创建3D场景和交互应用方面得到了广泛应用。在Three.js构建…...
Java Collection API增强功能系列之一 Arrays.asList()
在Java编程中,Arrays.asList() 是一个高频使用却又容易引发陷阱的工具方法。它能够快速将数组转换为列表,但其特殊行为常常让开发者踩坑。本文将深入剖析该方法的本质特性,并揭示其使用时的注意事项。一、方法定义与基础用法 1. 方法签名 p…...
websocket中spring注入失效
一个null指针引发的思考 websocket中spring注入失效 一个null指针引发的思考场景代码SpringBoot入口类配置类websocket类 问题排查问题1:问题2: 反思解决方案一:方案二:方案三:方案四: 场景 首页有个webso…...
Nat Commun:网络结构在塑造神经表征的强度中扮演着‘幕后推手’的角色
摘要 人类通过一系列离散事件构建他们对世界的心智模型。这一过程被称为图学习,它产生了一个编码事件间转移概率图的模型。近期的研究表明,一些网络比其他网络更容易学习,但这种效应的神经基础仍然未知。在这里,本研究使用功能磁共…...
Driver具体负责什么工作
在 Apache Spark 中,Driver(驱动程序) 是 Spark 应用的核心控制节点,负责协调整个应用的执行流程。它是用户编写的 Spark 应用程序(如 main() 方法)的入口点,直接决定了任务的调度、资源分配和结…...
LeetCode 热题 100----2.移动零
LeetCode 热题 100----2.移动零 题目描述 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。请注意 ,必须在不复制数组的情况下原地对数组进行操作。示例 1:输入: nums [0,1,0,3,12] 输出: [1,3,12,…...
能源革命新突破:虚拟电厂赋能微电网智能调控,构建低碳生态新格局
在“双碳”目标的引领下,中央一号文件明确提出了“推进农村能源革命,深化绿色低碳技术应用”。作为能耗集中区域,产业园区如何实现清洁能源高效消纳与碳减排的目标成为了难题,中电国为推出的虚拟电厂与风光储充柴多能互补的微电网…...
Java集合框架深度剖析:从数据结构到实战应用
引言 Java集合框架是Java开发中的核心组件之一,其设计目标是提供高性能、高复用性的数据容器。无论是数据处理、缓存设计还是高并发场景,集合框架都扮演着关键角色。本文将从List、Map、Set三大核心接口出发,深入剖析其主流实现类࿰…...
基于灵动微单片机SPIN系列的两轮车解决方案
电动车需配备与电机兼容性更高的双模控制器。灵动针对两轮车提供了相应的方案和解决算法。在两轮车的霍尔传感器出现故障时,系统应能继续有效地驱动电机。除了常规的过流、过压、过温保护措施外,灵动的方案还支持防盗功能,具备电刹车能力&…...
ngx_http_core_server_name
定义在 src\http\ngx_http_core_module.c static char * ngx_http_core_server_name(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) {ngx_http_core_srv_conf_t *cscf conf;u_char ch;ngx_str_t *value;ngx_uint_t i;ngx_…...
【Docker系列一】Docker 简介
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
[C++面试] 你了解transform吗?
层级核心知识点入门基本语法、与for_each对比、单/双范围操作进阶动态扩展、原地转换、类型兼容性、异常安全高阶性能优化、C20 Ranges、transform_if模拟 一、入门 1、描述std::transform的基本功能,并写出两种版本的函数原型 std::transform函数是 C 标准库<…...
MSE分类时梯度消失的问题详解和交叉熵损失的梯度推导
下面是MSE不适合分类任务的解释,包含梯度推导。以及交叉熵的梯度推导。 前文请移步笔者的另一篇博客:大模型训练为什么选择交叉熵损失(Cross-Entropy Loss):均方误差(MSE)和交叉熵损失的深入对比…...
docker 安装部署 canal
1 mysql 安装 1.1 拉取镜像 docker pull mysql:8.4.41.2 创建挂载目录 mkdir -p /user/lzl/tool/docker/mysql/mysql_8.4.4/home/confmkdir -p /user/lzl/tool/docker/mysql/mysql_8.4.4/home/datamkdir -p /user/lzl/tool/docker/mysql/mysql_8.4.4/home/log1.3 编辑配置文…...
flowable适配达梦7 (2.1)
经过第一版的问题解决,后端项目可以启动,前端页面也集成进去。 前端在流程设计页面报错 之后发现主要是组件中modelerStore这个值没有 解决方法:在data增加对象 给component/process/designer.vue 中涉及到的每个子组件传入 :modelerStore“modeler…...
优化 Docker 镜像 技巧
优化 Docker 镜像可以提高构建速度、减少镜像大小、提高安全性和效率。以下是一些优化 Docker 镜像的方法: 使用适当的基础镜像 选择合适的基础镜像可以减小镜像大小,并确保基础镜像的安全性和更新性。Alpine、Ubuntu Minimal 等轻量级基础镜像是常用选…...
Spring Boot框架中常用注解
以下是Spring Boot框架中常用注解的详细说明,包括名称、用途、用法、使用位置及扩展示例,按功能模块分类整理: 一、核心启动与配置注解 1. SpringBootApplication 用途:主启动类注解,整合了 Configuration、EnableAu…...
Linux笔记之Ubuntu22.04安装IBus中文输入法教程
Linux笔记之Ubuntu22.04安装IBus中文输入法教程 code review! 文章目录 Linux笔记之Ubuntu22.04安装IBus中文输入法教程安装 IBus 并配置中文输入法步骤 1: 安装 IBus 和拼音插件步骤 2: 设置 IBus 为默认输入法框架步骤 3: 重启会话步骤 4: 添加中文输入法步骤 5: …...
(UI自动化测试web端)第二篇:元素定位的方法_xpath属性定位
看代码里的【driver.find_element_by_xpath( )】()里的路径怎么写? xpath元素定位有多种写法,那我们现在说的就是在元素定位时,根据网页的实际情况来选择适合的xpath元素定位的写法。 文章主要介绍了xpath属性定位的方法和属性扩展使用的方法…...
Linux中执行 ifconfig 命令时提示 “未找到命令”
在 Linux 系统里,若执行 ifconfig 命令时提示 “未找到命令” 通常是由于系统没有安装 net-tools 包,或者该命令不在系统的 PATH 环境变量所包含的路径中 安装 net-tools 包 # Ubuntu/Debian sudo apt update sudo apt install net-tools# CentOS 7 及以…...
UE4学习笔记 FPS游戏制作15修正可以换枪中可以继续换枪和开火的Bug
现在存在的问题是换枪动作没完成时,可以继续换枪或者开枪 因为换枪这个动作是由玩家进行的,所以应该修改FppShooter脚本 我们添加两个参数 最后一次换枪的时间和换枪动画的长度 EquipmentLength 设置默认值0.6秒 添加一个新函数IsInEquip,返…...
SSL/TLS 和 SSH 介绍以及他们的区别
目录 SSL/TLS SSL/TLS工作原理的核心步骤握手阶段(Handshake Protocol)加密通信阶段(Encrypted Communication Phase)会话恢复(Session Resumption) SSH SSH 加密机制的核心步骤 SSH 和 SSL 区别 SSL/TLS …...
AudioTrack
AudioTrack是Android Audio系统提供给应用开发者(java/C)的API,用于操作音频播放的数据通路。MeidaPlayer在播放音乐时用到的是它,我们可以也可以直接使用AudioTrack进行音频播放。它是最基本的音频数据输出类。 AudioTrack.java…...
Windows安装Rust环境(详细教程)
一、 安装mingw64(C语言环境) Rust默认使用的C语言依赖Visual Studio,但该工具占用空间大安装也较为麻烦,可以选用轻便的mingw64包。 1.1 安装地址 (1) 下载地址1-GitHub:Releases niXman/mingw-builds-binaries GitHub (2) 下载地址2-W…...
监控IP,网站将异常情况通过飞书机器人发至指定群内
界面如下,丑是丑了点,但主打一个实用。 主要就是通过ping,就是一直在ping,当不通的时候,就根据你设置的报警时间,主要是利用飞书机器人来给飞书指定群里发异常信息报警。 直接上代码 import subprocess i…...
JVM 02
今天是2025/03/23 19:07 day 10 总路线请移步主页Java大纲相关文章 今天进行JVM 3,4 个模块的归纳 首先是JVM的相关内容概括的思维导图 3. 类加载机制 加载过程 加载(Loading) 通过类全限定名获取类的二进制字节流(如从JAR包、网络、动态…...
局域网设备访问虚拟机 挂载NFS
目录 引言:网络IP问题配置虚拟机网络有线网络:无线网络: NFS文件挂载服务端配置客户端连接 引言: 需求:局域网下树莓派设备想要访问电脑主机上的虚拟机。这样可以通过nfs挂载网络设备,有利于交叉编译环境调…...
零、ubuntu20.04 安装 anaconda
1.anaconda下载 地址:Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 选择:Anaconda3-2023.07-2-Linux-x86_64.sh 2.anaconda安装 选择下载目录,选在在终端中打开,然后在终端输入安装命…...
IntelliJ IDEA 将 Spring Boot 项目远程部署到服务器
使用 IntelliJ IDEA 将 Spring Boot 项目远程部署到服务器的详细步骤,涵盖多种常见方法: 方法一:通过 SSH Maven 插件直接部署 1. 服务器环境准备 确保服务器已安装: Java 运行环境(与项目 JDK 版本一致࿰…...
利用dify打造命令行助手
利用dify打造命令行助手 前言 我是mac os 的使用者。 如果说macos哪个工具我使用最频繁,最能提高效率的工作工具非zsh莫属(当然,我安装了iterm)。前不久,我要扩容线上的k8s集群。便想统计一下每个node上运行的pod数量。我不知道合适的命令&…...
前端面试整理
一、csshtml 二、js 三、vue 四、react 1.React 类组件与函数式组件核心区别 定义方式的不同,类组件用ES6的class,继承React.Component,而函数式组件用函数声明。 状态管理方面,类组件用this.state和setState,函…...
Perl语言的计算机网络
Perl语言在计算机网络中的应用 引言 在计算机科学的众多领域中,网络编程是一个极具挑战性和广泛应用的领域。在这其中,Perl语言以其强大的文本处理能力和简洁的语法,成为了网络编程的重要工具之一。自从1987年Larry Wall创造Perl以来&#…...
数据结构初阶-二叉树的应用
1.单值二叉树 题目链接:https://leetcode.cn/problems/univalued-binary-tree/description/ 题目思路:我们把根结点与左孩子和右孩子进行比较,只有左右子树都是单值二叉树的时候才为单值二叉树。但是我们需要先返回的是false,最…...
【赵渝强老师】在Docker中运行达梦数据库
Docker是一个客户端服务器(Client-Server)架构。Docker客户端和Docker守护进程交流,而Docker的守护进程是运作Docker的核心,起着非常重要的作用(如构建、运行和分发Docker容器等)。达梦官方提供了DM 8在Doc…...
掌握C#循环:for、while、break与continue详解及游戏案例
Langchain系列文章目录 01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块:四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain:从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…...
备份比赛数据【算法赛】
0备份比赛数据【算法赛】 - 蓝桥云课 问题描述 蓝桥杯大赛的组委会最近遇到了一个棘手的问题。他们有 N 台电脑需要备份比赛数据,每台电脑所需的备份时间分别为 A1,A2,…,AN 分钟。 备份必须按编号顺序依次进行,即先第 1 台,再第 2 …...
【算法笔记】图论基础(二):最短路、判环、二分图
目录 最短路松弛操作Dijkstra朴素Dijkstra时间复杂度算法过程例题 堆优化Dijkstra时间按复杂度算法过程例题 bellman-ford时间复杂度为什么dijkstra不能处理负权边?dijkstra的三个步骤:反例失效的原因 算法过程例题 spfa时间复杂度算法过程例题spfa求最短…...
【性能优化点滴】odygrd/quill 中一个简单的标记位作用--降低 IO 次数
在 StreamSink 类中,成员变量 _write_occurred 的作用是 跟踪自上次刷新(Flush)以来是否有写入操作发生,其核心目的是 优化 I/O 性能。以下是详细解析: _write_occurred 的作用 1. 避免不必要的刷新(Flush…...
Unity2022发布Webgl2微信小游戏部分真机黑屏
复现规律: Unity PlayerSetting中取消勾选ShowSplashScreen 分析: 在Unity中,Splash Screen(启动画面) 不仅是视觉上的加载动画,还承担了关键的引擎初始化、资源预加载和渲染环境准备等底层逻辑。禁用后导…...
TDengine 3.3.2.0 集群报错 Post “http://buildkitsandbox:6041/rest/sql“
原因: 初始化时处于内网环境下,Post “http://buildkitsandbox:6041/rest/sql“ 无法访问 修复: vi /etc/hosts将buildkitsandbox映射为本机节点 外网环境下初始化时没有该问题...
基于yolov11的中空圆柱形缺陷检测系统python源码+pytorch模型+评估指标曲线+精美GUI界面
【背景介绍】 中空圆柱形缺陷检测在多个领域具有深远意义。在石油、天然气及化工行业,缺陷检测可预防泄漏事故,避免火灾、爆炸及环境污染,保障人员与财产安全。建筑、桥梁及航空航天领域则依赖此技术确保中空圆柱形结构的稳定性,…...
Python爬虫-爬取AliExpress商品搜索词排名数据
前言 本文是该专栏的第49篇,后面会持续分享python爬虫干货知识,记得关注。 本文,笔者以AliExpress平台为例。基于Python爬虫,通过某个指定的“搜索关键词”,批量获取该“搜索关键词”的商品排名数据。 具体实现思路和详细逻辑,笔者将在正文结合完整代码进行详细介绍。废…...
20250321在荣品的PRO-RK3566开发板的buildroot系统下使用ll命令【直接编译进IMG】
./buildroot/system/skeleton/etc/profile # some more ls aliases alias llls -alF alias lals -A alias lls -CF 20250321在荣品的PRO-RK3566开发板的buildroot系统下使用ll命令【直接编译进IMG】 2025/3/21 16:53 cd /etc/ echo "" >> # some more ls ali…...
Flink 自定义数据源:从理论到实践的全方位指南
目录 第一章:自定义数据源的基础概念 数据源是什么?它在 Flink 中扮演什么角色? Flink 的内置数据源:开箱即用的 “标配” 为什么需要自定义数据源?它的杀手锏在哪? 第二章:自定义数据源的实现之道 接口选择:从简单到高级,选对工具事半功倍 SourceFunction:入门…...
如何在 Java 中查找 PDF 页面大小(教程)
PDF 文件并未被 Java 直接支持。本教程将向您展示如何使用 JPedal Java PDF 库 以简单的步骤提取 PDF 文件的页面大小(高度和宽度)。页面大小可以以 厘米、英寸或像素 为单位获取。 为什么要使用第三方库处理 PDF 文件? PDF 文件是一种复杂…...
java版嘎嘎快充玉阳软件互联互通中电联云快充协议充电桩铁塔协议汽车单车一体充电系统源码uniapp
演示: 微信小程序:嘎嘎快充 http://server.s34.cn:1888/ 系统管理员 admin/123456 运营管理员 yyadmin/Yyadmin2024 运营商 operator/operator2024 系统特色: 多商户、汽车单车一体、互联互通、移动管理端(开发中) 另…...
使用Mastra.ai构建AI智能体:一次动手实践
Mastra框架提供了一种简洁高效的AI智能体构建方式。 本文将分享我使用Mastra.ai的实践经历。 我们将逐步完成环境搭建、探索框架核心功能,并构建一个能与工具交互的基础智能体。 过程中我会总结成功经验、遇到的问题以及收获的启示。 如果你对AI开发感兴趣,或正在寻找一个…...
Redis之大key问题
BigKey 常见面试题目 你会么? MoreKey 案例 大批量往redis里面插入2000W测试数据key Linux Bash下面执行,批量插入100W for((i1;i<100*10000;i)); do echo "set k$i v$i" >> /tmp/redisTest.txt ;done;生成100W条redis批量设置kv的…...
Excel第41套全国人口普查
2. 导入网页中的表格:数据-现有链接-考生文件夹:网页-找到表格-点击→变为√-导入删除外部链接关系:数据-点击链接-选中连接-删除-确定(套用表格格式-也会是删除外部链接)数值缩小10000倍(除以10000即可&am…...
深度学习驱动的车牌识别:技术演进与未来挑战
一、引言 1.1 研究背景 在当今社会,智能交通系统的发展日益重要,而车牌识别作为其关键组成部分,发挥着至关重要的作用。车牌识别技术广泛应用于交通管理、停车场管理、安防监控等领域。在交通管理中,它可以用于车辆识别、交通违…...