《Cesium性能优化:高效加载大量多边形的技巧与方法》加载大量的polygon导致页面卡顿、卡死

在cesium中加载矢量白模通常是使用的geojson数据,通过GeoJsonDataSource来加载。
这个方式加载的模型是通过polygon的方式呈现的,几百栋建筑数据对性能的影响不大,但是当数据量到几万的时候影响就非常大了,通常浏览器会直接卡死。
cesium有一种性能更强的加载方式,Primitive
Primitive是直接在WebGL中绘制几何图形,而Entity是在Cesium的实体系统中进行管理的高级对象。
Primitive可以更高效地利用底层图形硬件和API,从而在大规模场景中呈现大量的几何图形。

使用primitive代替entity的好处:

  1. 更高的性能:Primitive直接在WebGL中绘制几何图形,可以更高效地利用底层图形硬件和API。相比之下,Entity是在Cesium的实体系统中进行管理的高级对象,可能会带来一些性能开销。因此,使用Primitive可以在大规模场景中呈现大量的几何图形,并获得更好的性能。
  2. 更少的内存占用:Primitive只需要存储几何数据和一些简单的属性,而Entity可能需要存储更复杂的属性和行为。这意味着使用Primitive可以减少内存占用,特别是当需要绘制大量的几何图形时。
  3. 更灵活的控制:使用Primitive可以更直接地控制几何图形的属性和样式。你可以自定义几何图形的顶点位置、颜色、纹理坐标等属性,以及应用自定义的着色器程序。这样可以实现更精细的几何图形渲染效果,并且可以根据具体需求进行优化。

接下来是Primitive的加载示例

// 假设geojson中有一万条数据,先创建一个instances数组,用于存放GeometryInstance
let instances = []
for(let i = 0; i < 10000; i++) {
	// 创建几何实例
	let geometry = new Cesium.PolygonGeometry({
		polygonHierarchy: new Cesium.PolygonHierarchy(new Cesium.Cartesian3.fromDegreesArray([...坐标])),
		height: 0,
		extrudedHeight: 100
	})
	// 创建GeometryInstance,将几何实例赋值给geometry
	let instance = new Cesium.GeometryInstance({
		geometry,
	})
	// 存入instances数组
	instances.push(instance)
}
// 加载primitive,通过geometryInstances可以将多个PolygonGeometry一次性加载出来
let primitive = new Cesium.Primitive({
	geometryInstances: instances,
	// 使用MaterialAppearance自定义材质,缺点不能单独设置某一个geometry
	// 想要通过MaterialAppearance给每个几何实例都设置单独的外观也是可以实现的
	// 可以给每个GeometryInstance都实例化一个Primitive,在将所有的primitive放入viewer.scene.primitives
	// 但是这样也会造成卡顿,primitive的性能优势就不能体现出来了
	appearance: new Cesium.MaterialAppearance({ 
		material: new Cesium.Material({
			fabric : {
				type : 'Color',
                uniforms : {
                	color : new Cesium.Color(1.0, 1.0, 0.0, 1.0)
                }
			}
		})
	})
})
viewer.scene.primitives.add(primitive)

如果要单独给几何对象加外观的话可以使用PerInstanceColorAppearance
PerInstanceColorAppearance中文网解释:这允许使用相同的 Primitive 绘制多个几何实例,每个实例具有不同的颜色
以上代码可以修改为

// 在GeometryInstance中添加attributes,使用color属性可以设置颜色
let instance = new Cesium.GeometryInstance({
	geometry,
	attributes: {
		// 设置单独的color可以使每个几何实例的外观都不一样
		color: Cesium.ColorGeometryInstanceAttribute.fromColor(Cesium.Color.AQUA)
	}
})
// 同时primitive也需要调整
let primitive = new Cesium.Primitive({
	geometryInstances: instances,
	// PerInstanceColorAppearance中可以设置参数,具体可以参考官方文档
	appearance: new Cesium.PerInstanceColorAppearance({})
})

以上就是关于primitive的优化示例,关于appearance外观又是另一个话题,这个在下一篇再讨论。

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Cesium是一个用于创建高性能3D地球和地理应用程序的JavaScript库。它提供了强大的功能和灵活性,可以加载和显示大量的树模型。 当加载大量的树模型时,我们可以使用Cesium的基于瓦片的3D绘图系统来优化性能。首先,我们可以将树模型制作成瓦片,并将其分成多个层级。这样,当用户缩放地图时,Cesium只会加载可见层级的树模型,而不会加载所有的模型,从而提高性能。 其次,Cesium提供了空间索引技术,如四叉树和八叉树,可以有效地管理和搜索大量的3D对象。通过将树模型添加到空间索引数据结构中,我们可以在加载和渲染时只处理可见的对象,而忽略不可见的对象,从而提高加载速度和渲染性能。 此外,Cesium还支持级联LOD(细节层次)技术。这意味着当用户缩放地图时,Cesium会根据用户的视角和距离自动切换树模型的详细程度。在远离地图时,Cesium只会加载粗糙的模型,而在靠近地图时,Cesium加载更详细的模型,以实现更好的性能和视觉效果平衡。 另外,对于特别大的树模型数据集,Cesium还支持基于服务端的数据流技术。这种技术将树模型数据集分成多个数据块,并在需要时按需加载,以减少内存使用和提高加载性能。 综上所述,Cesium提供了多种优化性能的方法加载大量的树模型。通过使用瓦片制作、空间索引、级联LOD和服务端数据流等技术,我们可以实现高效的树模型加载和渲染,提供流畅的用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值