96SEO 2026-06-06 23:29 0
先聊聊网格渲染的痛点,别拽着不放
说实话,三维城镇地图里那几万座楼,光是渲染就Neng把帧率逼到低谷。
我之前也踩过坑,卡得像老牛拖车——那种“哎呀妈呀,我的鼠标还Neng动吗”的感觉。

哈哈,你要是还在用Raycaster逐个检测,那真是给自己挖了个坑。
不过别慌,咱们今天就来掰扯掰扯怎么把渲染和拾取dou提速到让你爽到飞起。
一、合并几何体——先把Draw Call砍掉先说Zui容易实现的招:把相邻的建筑几何体用mergeBufferGeometries合并。
合并后一个Mesh里装上千座楼,这样GPU只需要一次draw call。
对,你没听错,就是这么粗暴。
不过合并会让每栋楼失去独立的.material,所以我们得想办法保留“单体”信息——颜色编码拾取登场!
核心思路:给每栋楼分配一个唯一ID,然后把这个ID映射成RGB颜色,渲染进一张kan不见的离屏纹理。
鼠标点哪儿,就读那张纹理对应像素的RGB,再逆向算回ID——Boom!瞬间定位到哪栋楼被点了。
/**
* 整数 → RGB数组
* @param {Number} number ID
* @returns {}
*/
intToRgb {
const validBits = number & 0xffffff; // 只保留低24位
const r = & 0xff;
const g = & 0xff;
const b = validBits & 0xff;
return ;
}
/**
* RGB → 整数
*/
rgbToInt {
if ) throw new Error;
return ||b;
}
这段代码就是把ID和颜色互转的钥匙,记住它。
三、构造拾取场景——别忘了同步geng新我们要搞两个场景:
可视场景: 真正展示给用户kan的模型,使用真实材质。
拾取场景: 用纯色渲染,同样的几何体但材质是{vertexColors:true}。
每次相机或视角变化后dou要重新渲染一次离屏纹理,否则读像素会跑偏。
/** geng新离屏纹理 */
updatePickingTexture {
if return;
const pixelRatio = this.renderer.getPixelRatio;
this._pickingTexture.setSize(
this.container.clientWidth * pixelRatio,
this.container.clientHeight * pixelRatio
);
const curTarget = this.renderer.getRenderTarget;
this.renderer.setRenderTarget;
this.renderer.clear;
this.renderer.render;
this.renderer.setRenderTarget;
this._pickingTextureNeedsUpdate = false;
}
四、点击/悬停事件——从像素到建筑,一气呵成
下面这段代码负责读取鼠标所在位置的像素,并转成建筑ID。这里用了.readRenderTargetPixels。
/** 拾取建筑 */
pickBuilding {
if return null;
if this.updatePickingTexture;
const pixelRatio = this.renderer.getPixelRatio;
const x = event.clientX * pixelRatio;
const y = this._pickingTexture.height - event.clientY * pixelRatio - 1;
const pixelBuffer = new Uint8Array; // RGBA 四通道
this.renderer.readRenderTargetPixels(
this._pickingTexture,
x,
y,
1,
1,
pixelBuffer
);
const id = rgbToInt;
if { // 没有命中任何建筑
if {
this.highlightBuilding;
this._lastPickedBuilding=null;
}
return null;
}
const buildingData = this._buildingIdMap.get;
if ){
this.highlightBuilding;
this._lastPickedBuilding={id,data:buildingData};
}
return buildingData;
}
五、高亮盒子—给用户一个“我被选中了”的视觉反馈
C++里叫Bounding Box,这里我们直接用Three.js的.BoxGeometry,再根据建筑外形算出Zui小矩形底面把盒子拉伸到对应高度。
/** 高亮建筑 */
highlightBuilding{
if{
if this._highlightBox.visible=false;
return;
}
const {coordinates,type}=buildingData;
const height=buildingData.height||this._defaultHeight;
let minX=Infinity,minY=Infinity,maxX=-Infinity,maxY=-Infinity;
let points=;
if{ points=coordinates; }
else if{ points=coordinates; }
points.forEach=>{
minX=Math.min; minY=Math.min;
maxX=Math.max; maxY=Math.max;
});
const centerX=/2;
const centerY=/2;
const centerZ=height/2;
const sizeX=maxX-minX;
const sizeY=maxY-minY;
const sizeZ=height;
this._highlightBox.position.set;
this._highlightBox.scale.set;
this._highlightBox.visible=true;
}
*不对不对*,刚才漏写了.visible=true;, 好险差点忘了显示高亮盒子呢!哈哈。
数据准备:GeoJSON里每个Featuredou有唯一ID,同时记录坐标和高度属性。
Create Geometry:
遍历所有Feature,用THREE.ExtrudeGeometry生成立体模型;同时为每个顶点写入颜色属性。
Merging:
把所有几何体收进数组,用mergeBufferGeometries`一次性生成两套Mesh:可视Mesh + 拾取Mesh。
Add to Scenes: 可视Mesh放进主场景;拾取Mesh放进离屏场景;高亮盒子也挂在主场景。
Packing Pick Texture:
相机变化或数据geng新时调用.updatePickingTexture, 把离屏场景渲染进RTT。
User Interaction:
监听鼠标move/click → 调用.pickBuilding → 根据返回结果控制光标样式、派发业务事件、调用.highlightBuilding。
- **颜色冲突**:Ru果建筑数量超过16M,RGB会溢出。实际项目里基本不会碰到,但要留意上限。
- **透明度**:高亮盒子建议设{depthTest:false, depthWrite:false}, 不然遮挡会出现奇怪的闪烁。
- **性Neng监控**:打开Chrome DevTools 的 Performance,kan一下离屏渲染占多少ms,一般保持在5-10ms以内才算舒服。
- **刷新频率**:不要每帧dou强制geng新离屏纹理,只在相机或数据变动时标记 true.
AFAIK,现在市面上大多数三维 GIS 产品dou是这样玩儿的:合并几何 + 色彩编码拾取,两手抓齐,全程秒杀上万对象交互延迟。
#说实话# 我自己用了半年,帧率从30掉到了70+,而且点击响应时间直接降到了毫秒级。
*害*,Ru果你还有别的需求,比如边缘高光、动态贴图之类,Ke以再基于这套框架Zuo二次开发,完全没问题。
咱就是说,技术不是死板公式,一旦弄懂原理,你就Neng随心所欲地玩出花样来。以后再遇到卡顿,就想想这套方案吧,好好调教你的GPU,让它喝口咖啡继续跑起来!哈哈哈~
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback