Javascript 在铯中实现渐进渲染层

Javascript 在铯中实现渐进渲染层,javascript,3d,webgl,jpeg2000,cesium,Javascript,3d,Webgl,Jpeg2000,Cesium,我试图实现一个显示服务器发送的光栅数据的层。 服务器协议发送的数据在广泛使用的浏览器中没有内置支持(这是jpeg2000数据)。 因此,我自己解码数据,并让它到铯显示 是什么让事情变得有点复杂: 服务器是有状态的,因此客户端和服务器都应该维护一个通道。通道与单个感兴趣区域相关联。区域可能会随着时间的推移而变化,但在每个时间点中,只有一个区域是服务器在通道上发送数据的。 我可以在会话中使用一些通道,但服务器在使用非常少量的通道时表现不佳 感兴趣的区域具有统一的分辨率(因此对于3D来说是有问题的)

我试图实现一个显示服务器发送的光栅数据的层。 服务器协议发送的数据在广泛使用的浏览器中没有内置支持(这是jpeg2000数据)。 因此,我自己解码数据,并让它到铯显示

是什么让事情变得有点复杂:

  • 服务器是有状态的,因此客户端和服务器都应该维护一个通道。通道与单个感兴趣区域相关联。区域可能会随着时间的推移而变化,但在每个时间点中,只有一个区域是服务器在通道上发送数据的。 我可以在会话中使用一些通道,但服务器在使用非常少量的通道时表现不佳

  • 感兴趣的区域具有统一的分辨率(因此对于3D来说是有问题的)

  • 服务器支持渐进式发送数据,以逐步提高质量(“jpeg2000中的质量层”),由于可用网络资源非常少,我希望使用该属性

  • 就CPU时间而言,解码非常繁重

  • 作为第一个阶段,我实现了一个ImageryProvider,它只为渲染引擎请求的每个磁贴创建一个通道。它工作了,但是创建了太多的连接,我不喜欢渐进式渲染。此外,性能很差,这一问题几乎可以通过实现优先级机制来解决,该机制首先在铯查看器的视图区域解码瓷砖

    接下来,我实现了一个自渲染光栅“层”,它根据视图区域更改通道的感兴趣区域。然后解决了多通道问题,我喜欢渐进式渲染。但是,我遇到了以下问题:

    a。我用来显示解码像素的方法是实现一个图像提供者,它显示一个带有解码像素的画布。每次图像更新(重新定位或逐步解码)时,我都必须删除旧的图像提供程序,并用新的图像提供程序替换它。我想这不是做这些事情的正确方法,它可能会导致一些不好的行为,比如用新的提供者替换旧的提供者时错误的z排序,等等。其中一些问题可以通过使用原语和图像材料来解决,但是我必须使用图像的数据URL形式。这样做会降低性能,因为它会导致大量从画布到数据URL的转换

    b。我必须编写特殊代码来理解视图区域,以便将其发送到服务器(使用Pick椭球体和类似功能)。我猜这段代码是铯引擎的复制品。此外,我在一些讨论中看到,在2D中不支持拾取椭球体。总的来说,我很高兴有一个为我计算视图区域的函数,而不是自己实现代码

    c。我实现它的方式引发了一个API问题:与Cesium添加和删除图像提供程序(addImageryProvider()方法和removeLayer()的良好API不同,在我的实现中,用户只需要使用我向他公开的方法(例如接受查看器作为参数的方法add())

    d。在3D模式下,当分辨率不一致时,图像在闭合区域不清晰。我知道这是一个固有的问题,因为我的服务器的工作方式,只是指出它

    我认为我真正缺少的是一种实现比ImageryProvider接口更强大的插件的方法:实现一个自渲染光栅层,它从渲染引擎接收视图区域更改事件,并可以决定何时以及如何刷新其分幅。 另一种选择(对我来说更好,但我想其他人不太容易重用)是向ImageryProvider实现公开视图区域中的平铺列表

    应对这种情况的正确方法是什么