发布时间:2026/7/10 20:55:37
WebGL 百万线段高性能 Demo(批量绘制,无循环绘制) WebGL 百万线段高性能 Demo批量绘制无循环绘制核心优化关键点百万级必备单缓冲区存放所有线段顶点一次上传 GPU不频繁bufferData使用gl.LINES每 2 个顶点一条线段100 万条 200 万个顶点着色器极简逻辑CPU 只生成一次数据渲染仅一次drawArrays关闭不必要状态降低管线开销浮点数组一次性分配内存减少 GC 卡顿完整可运行代码!DOCTYPE html html langzh-CN head meta charsetUTF-8 titleWebGL 100万条线段批量渲染/title style canvas { border: 1px solid #333; background: #000; } /style /head body canvas idwebglCanvas width1200 height700/canvas script const canvas document.getElementById(webglCanvas); const gl canvas.getContext(webgl, { antialias: false, // 关闭抗锯齿提升性能 preserveDrawingBuffer: false }); if (!gl) alert(浏览器不支持WebGL); // 1. 着色器 const vertexShaderSource attribute vec2 aPos; void main() { gl_Position vec4(aPos, 0.0, 1.0); } ; const fragmentShaderSource precision mediump float; uniform vec3 uLineColor; void main() { gl_FragColor vec4(uLineColor, 1.0); } ; // 编译着色器工具 function createShader(type, source) { const shader gl.createShader(type); gl.shaderSource(shader, source); gl.compileShader(shader); return shader; } function createProgram(vs, fs) { const program gl.createProgram(); gl.attachShader(program, vs); gl.attachShader(program, fs); gl.linkProgram(program); gl.useProgram(program); return program; } const vs createShader(gl.VERTEX_SHADER, vertexShaderSource); const fs createShader(gl.FRAGMENT_SHADER, fragmentShaderSource); const program createProgram(vs, fs); // 获取属性/Uniform位置 const aPosLoc gl.getAttribLocation(program, aPos); const uColorLoc gl.getUniformLocation(program, uLineColor); // 2. 生成100万条线段顶点数据 const LINE_COUNT 1000000; // 100万条线 const VERTEX_COUNT LINE_COUNT * 2; // 每条线2个顶点 const vertexData new Float32Array(VERTEX_COUNT * 2); // 每个顶点 x,y // 随机生成 [-1,1] 范围内线段模拟随机分布线条 let offset 0; for (let i 0; i LINE_COUNT; i) { // 起点 const x1 Math.random() * 2 - 1; const y1 Math.random() * 2 - 1; // 终点 const x2 Math.random() * 2 - 1; const y2 Math.random() * 2 - 1; vertexData[offset] x1; vertexData[offset] y1; vertexData[offset] x2; vertexData[offset] y2; } // 3. 创建缓冲区一次性上传GPU const buffer gl.createBuffer(); gl.bindBuffer(gl.ARRAY_BUFFER, buffer); // STATIC_DRAW数据几乎不修改GPU优化显存 gl.bufferData(gl.ARRAY_BUFFER, vertexData, gl.STATIC_DRAW); // 绑定顶点属性 gl.vertexAttribPointer(aPosLoc, 2, gl.FLOAT, false, 0, 0); gl.enableVertexAttribArray(aPosLoc); // 4. 渲染配置 gl.viewport(0, 0, canvas.width, canvas.height); gl.clearColor(0, 0, 0, 1); gl.clear(gl.COLOR_BUFFER_BIT); // 设置线条白色 gl.uniform3f(uColorLoc, 1, 1, 1); // 关键一次调用绘制全部100万条线 console.time(drawAllLines); gl.drawArrays(gl.LINES, 0, VERTEX_COUNT); console.timeEnd(drawAllLines); /script /body /html关键流程拆解百万线渲染标准流程1. 上下文创建优化关闭抗锯齿antialias:false百万线段开启 AA 会严重掉帧。2. 数据存储逻辑100 万条线段 2000000 个顶点每个顶点vec2(x,y) 2 个浮点数总浮点数量2000000 * 2 4000000Float32Array一次性预分配内存避免循环 push 造成频繁扩容卡顿3. 缓冲区上传策略只用一次gl.bufferData把全部顶点送入 GPU绝对不要循环多次上传数据这是大批量渲染最大性能瓶颈。4. 绘制调用gl.drawArrays(gl.LINES, 0, VERTEX_COUNT);gl.LINES规则顶点 01 一条线、23 一条线…… 完美匹配我们的数据结构。 整批只执行一次绘制指令CPU-GPU 通信开销极低。性能说明显存占用粗略计算单个 Float32 占 4 字节4000000 × 4 16MB现代显卡毫无压力。浏览器限制 部分低端笔记本 / 集成显卡渲染百万线条会帧率下降属于显卡光栅化性能限制代码本身无性能浪费。进阶提速方案如果需要更高帧率使用索引缓冲ELEMENT_ARRAY_BUFFER重复顶点复用适合网格线分批次多 Buffer 分段渲染动态更新部分线条时用使用 WebGL2 实例化渲染instanced批量生成重复线条降低画布分辨率缩小width/height减少像素填充常见问题页面加载卡住几秒生成 400 万浮点数需要少量 CPU 计算属于正常现象可把生成数据逻辑放 Web Worker 避免阻塞页面。线条看不见WebGL 坐标范围[-1,1]代码已全部随机在该区间内背景黑色、线条白色对比明显。线条粗细统一原生 WebGLgl.LINES不支持自定义线宽多数浏览器忽略lineWidth如需粗线条要用三角带模拟线段。

相关新闻

2026/7/10 20:55:37

WhatsApp 消息定时发送与任务调度系统的设计实践

WhatsApp 消息定时发送与任务调度系统的设计实践 在 WhatsApp 多账号运营场景中,定时发送、错峰触达和失败重试是常见需求。本文从工程实现角度,拆解一套高可用的消息定时调度系统。 目录 一、业务场景与技术挑战二、整体架构设计三、定时任务存储模型四…

2026/7/10 20:55:37

如何用 ElevenLabs 给自己的视频配专业 AI 旁白?

一、ElevenLabs 适合给哪些视频配旁白? ElevenLabs 的强项是自然、稳定、商业感强的 AI 语音。官方文档显示,ElevenLabs 提供 Text to Speech、Voice Cloning、Dubbing、Voiceover Studio、API、SDK 和语音智能体等能力,是一个面向创作者和开发者的 AI voice infrastructur…

2026/7/10 21:46:48

LangChain 1.0小型Agent项目:从可跑通到可维护的工程实践

1. 项目概述:为什么一个“小型agent项目”是LangChain 1.0时代最值得动手的第一课你点开这个标题,大概率正站在AI工程化的门槛上——不是想当理论派,而是想亲手把“大模型能干啥”变成“我写的代码真能跑起来”。这正是“小型agent项目&#…

2026/7/10 21:46:48

STM32与TLA2518构建高精度多通道ADC系统

1. 项目背景与核心需求解析在工业自动化、医疗设备和消费电子等领域,模拟信号到数字信号的可靠转换一直是嵌入式系统设计的关键环节。TLA2518作为德州仪器推出的12位精度、1MSPS采样率的8通道ADC芯片,配合STM32F101ZG这类主流ARM Cortex-M3微控制器&…

2026/7/10 21:46:48

从个体户到企业主:福州商户数字化转型全流程实战指南

很多个体工商户在生意做大后,都会面临一个共同的痛点:想要转型为企业,却对繁琐的流程望而却步。从核名到注销旧执照,再到税务登记和银行开户,每一个环节都充满了不确定性,尤其是财税数据的衔接,…

2026/7/10 21:46:48

2026 上半年 AI 滥用威胁演化与恶意 AI 组件全域检测防御研究

摘要 依托 HelpNetSecurity 发布的 ESET 2026 年上半年威胁趋势报告核心情报,针对攻击者大规模滥用 AI 组件、生成式 AI 植入恶意代码、AI 赋能社会工程欺诈三大新型威胁,系统梳理恶意 AI Skills、PromptSpy 安卓 AI 间谍软件、ClickFix 虚假验证钓鱼、E…

2026/7/10 21:41:48

Git版本控制常用命令

ai生成&#xff0c;仅记录⚙️ Git 常用命令以下是一些日常使用中最常用和最核心的 Git 命令&#xff1a;1. 初始化与克隆 (Setup)命令作用git init在当前目录创建一个新的 Git 仓库&#xff08;初始化&#xff09;。git clone <url>克隆远程仓库到本地。2. 查看状态与历…

2026/7/10 5:21:51

国内大模型选型与企业级落地实战指南

我不能提供任何关于访问境外网络信息的技术方案或变通方法。根据中国法律法规和网络管理要求&#xff0c;所有互联网服务必须遵守国家关于网络安全、数据安全和内容安全的规定。ChatGPT及其后续版本&#xff08;如所谓“GPT-5”&#xff09;是由境外机构研发的大语言模型&#…

2026/7/10 2:34:05

三步实战方案:高效获取智慧教育平台电子课本PDF的完整流程

三步实战方案&#xff1a;高效获取智慧教育平台电子课本PDF的完整流程 【免费下载链接】tchMaterial-parser 国家中小学智慧教育平台 电子课本下载工具&#xff0c;帮助您从智慧教育平台中获取电子课本的 PDF 文件网址并进行下载&#xff0c;让您更方便地获取课本内容。 项目…

2026/7/10 0:02:49

5大实战技巧:用ExifToolGUI轻松解决照片元数据管理难题

5大实战技巧&#xff1a;用ExifToolGUI轻松解决照片元数据管理难题 【免费下载链接】ExifToolGui A GUI for ExifTool 项目地址: https://gitcode.com/gh_mirrors/ex/ExifToolGui 你是否曾为整理旅行照片时发现拍摄时间错乱而头疼&#xff1f;是否需要在数百张照片中批量…

2026/7/10 6:36:15

3个高效策略:快速掌握Axure中文界面配置

3个高效策略&#xff1a;快速掌握Axure中文界面配置 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure RP的英文界面感…