WebGL 百万线段高性能 Demo(批量绘制,无循环绘制)
📅 2026/7/10 20:55:36
👁️ 次浏览
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如需粗线条要用三角带模拟线段。
Light-Weight RefineNet项目概览:理解轻量级实时语义分割架构 【免费下载链接】light-weight-refinenet Light-Weight RefineNet for Real-Time Semantic Segmentation 项目地址: https://gitcode.com/gh_mirrors/li/light-weight-refinenet
🚀 快…
📅 2026/7/10 20:55:36
WhatsApp 消息定时发送与任务调度系统的设计实践 在 WhatsApp 多账号运营场景中,定时发送、错峰触达和失败重试是常见需求。本文从工程实现角度,拆解一套高可用的消息定时调度系统。 目录
一、业务场景与技术挑战二、整体架构设计三、定时任务存储模型四…
📅 2026/7/10 20:55:36
一、ElevenLabs 适合给哪些视频配旁白?
ElevenLabs 的强项是自然、稳定、商业感强的 AI 语音。官方文档显示,ElevenLabs 提供 Text to Speech、Voice Cloning、Dubbing、Voiceover Studio、API、SDK 和语音智能体等能力,是一个面向创作者和开发者的 AI voice infrastructur…
📅 2026/7/10 20:55:36
终极指南:如何在Android应用中快速实现液态玻璃光影效果 【免费下载链接】AndroidLiquidGlass Compose Multiplatform Liquid Glass effect 项目地址: https://gitcode.com/gh_mirrors/an/AndroidLiquidGlass
想要为你的Android应用添加令人惊艳的玻璃质感效…
📅 2026/7/10 22:07:59
ThingsBoard多租户备份终极指南:5分钟搞定自动化定时任务与数据安全验证 【免费下载链接】thingsboard Open-source IoT Platform - Device management, data collection, processing and visualization. 项目地址: https://gitcode.com/GitHub_Trending/th/thing…
📅 2026/7/10 22:07:59
解密微信QQ防撤回:告别消息消失的终极方案 【免费下载链接】RevokeMsgPatcher :trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁(我已经看到了,撤回也没用了) 项目地址: https://gitcode.com/GitHub_Tr…
📅 2026/7/10 22:07:59
精准求职新武器:5分钟学会用Boss Show Time插件掌握招聘时效性 【免费下载链接】boss-show-time 展示boss直聘岗位的发布时间 项目地址: https://gitcode.com/GitHub_Trending/bo/boss-show-time
还在为招聘网站上模糊的时间标签而烦恼吗?Boss Sh…
📅 2026/7/10 22:07:59
系列「企业级 AI Agent 实现拆解」E33 篇,Part 9 起步篇第三章。E31 的 Agent 能跑了,E32,但 system prompt 是硬编码在 main.go 里的字符串。这篇讲怎么用 Eino 的 ChatTemplate 管理 prompt,从硬编码走向可维护。 读完这篇你会知…
📅 2026/7/10 22:07:59
你是一个小有名气的博主,某天朋友发来一个链接:一篇AI生成的文章详细指控你“学术造假”“剽窃他人成果”,措辞之具体、细节之逼真,连你自己都差点信了。你气得发抖。文章已经被转发了上千次,评论区全是骂你的。你第一…
📅 2026/7/10 22:06:59
一、为什么接口自动化测试,适合用AI赋能?
大家可自行先思考一个问题:
AI赋能测试全流程,为什么优先推荐从接口自动化切入?
有三个典型原因:
接口输入结构化,AI最擅长"吃"
接口有OpenA…
📅 2026/7/10 0:00:53
终极原神FPS解锁器完整指南:轻松突破60帧限制 【免费下载链接】genshin-fps-unlock unlocks the 60 fps cap 项目地址: https://gitcode.com/gh_mirrors/ge/genshin-fps-unlock
原神FPS解锁器是一款专为《原神》玩家设计的开源工具,通过先进的Wri…
📅 2026/7/10 0:00:53
YesPlayMusic:如何用高颜值播放器重塑你的网易云音乐体验?🎵 【免费下载链接】YesPlayMusic 高颜值的第三方网易云播放器,支持 Windows / macOS / Linux :electron: 项目地址: https://gitcode.com/gh_mirrors/ye/YesPlayMusic…
📅 2026/7/10 0:00:53
1. 项目背景与核心需求 在嵌入式系统开发中,快速精确的数据检索是一个常见但极具挑战性的需求。特别是在工业控制、医疗设备和物联网终端等场景下,系统往往需要在毫秒级时间内完成关键参数的读取和写入操作。传统基于Flash存储的方案存在擦写次数有限、操…
📅 2026/7/9 15:10:35
1. 工业电流环信号传输的基础认知在工业自动化领域,4-20mA电流环传输技术已经持续服役超过半个世纪。这种看似简单的信号传输方式之所以能经久不衰,核心在于其独特的抗干扰能力——电流信号在长距离传输时几乎不受线路电阻和电压波动的影响。我曾在化工厂…
📅 2026/7/9 14:14:01
最近在项目里尝试用 YOLO 做目标检测,从环境搭建到模型训练,再到推理部署,整个过程踩了不少坑。网上的资料虽然多,但要么版本老旧,要么步骤零散不成体系,对于刚入门的新手来说,很容易卡在某个环…
📅 2026/7/9 15:10:36
目录
第一步:选对模板,省心一半
第二步:打开扫码点餐功能
开启功能按钮
桌台管理与桌码生成
第三步:个性化设计,打造品牌感
调整点餐页面
设置点餐规则 你还在让顾客站着排队点餐吗?2025年ÿ…
📅 2026/7/9 15:10:36
在业务中快速构建一个能理解私有文档、准确回答专业问题的智能助手,是很多开发团队面临的共同挑战。传统方案往往需要从零开始搭建复杂的 RAG(检索增强生成)系统,涉及文档解析、向量化、检索、大模型调用等多个环节,整…
📅 2026/7/9 15:10:36
FAE放射组学分析工具:医学影像特征探索的完整解决方案 【免费下载链接】FAE FeAture Explorer 项目地址: https://gitcode.com/gh_mirrors/fae/FAE
你是否曾经面对海量医学影像数据感到无从下手?想要从CT、MRI等影像中提取有价值的定量特征&#…
📅 2026/7/9 15:10:36