城市级海量数据流畅调度方案(初稿)

2023-11-10

城市级海量数据流畅调度方案(初稿)

一.系统约束

1. 硬件限制 (CPU, 显卡,内存,硬盘)

最耗费CPU时间的是 视锥体和boundSphere/boundBox的求交计算。

显卡现在最大的瓶颈是 当渲染批次多时(2000个primitivesets,20万三角面片),渲染时间(Draw和GPU)都达到了30多毫秒。

测试机型硬件配置(本机):

 

CPU为4核处理器

显卡:  NVIDIA GForce GT 630  1024MB显存

 

硬盘:  500GB

 

2. 软件限制(OpensceneGraph原理限制)

2.1 操作系统OS    

 

2.2 底层OpensceneGraph 3.2.1

目前版本的Osg在windows系统下多线程渲染sharecontext的支持是有问题的,不能实现后台加载线程编译显示列表和纹理对象,只能在渲染线程中编译显示列表和纹理对象加重了渲染的压力。

Osg采用的是场景树管理机制,update,cull,draw三个流程中cull流程由于需要遍历整个场景树生成渲染叶子和状态树,所以耗费的时间与场景树中的节点数量成正比。测试发现当有2000个点状地物时帧速大概是16帧/秒,cull耗时约32ms。4000个点状地物时帧速降到5.5帧/秒,cull耗时66ms,draw耗时80ms,GPU耗时75ms(update时间基本稳定在3-6ms可以忽略不计)。

3.  网上相关资料

 

 

 

 

 

 

猜测:

Citymaker在制作城市建筑时是不是做了内部合并输出成一定格式的文件?但是从操作上看似乎它也能选择单个建筑物进行编辑,那么它在高空能看到的建筑物数量应该也是要受限的,否则光是一次渲染遍历一遍的时间就难以让人接受,但从“数字澳门”的软件截图上看,似乎渲染的建筑物数量是很多的? 

难道我们将一定高度(比如5米高度一下的)的建筑物的高程信息合成到地形部分?这样就不用单独渲染建筑物了,顶面和侧面的纹理就用地形纹理就行,地形网格肯定要加密一些,最好用shader辅助,但是这样做建筑物一开始的形状就会比较奇怪(skyline的发布会上倾斜摄影测量构建的上海浦东外滩),不够美观,查询时就需要直接从数据库来查询了。

4. 总结

加快场景渲染速度的方式有以下几种途径。【更新硬件和操作系统不在此考虑】

A. 合并地物以缩短cull的时间。将几个临近的建筑物作为一个地物进行装载和渲染,这样就减少了场景树上的节点数量,从而减少cull的时间?(视锥和外包box的求交计算没有减少呀。)也不能将太多的建筑物合并,否则加载是会出现帧冲击,选择编辑单个对象也会遇到问题,系统的灵活性会降低。这种途径可行性太差。

B. 减少渲染批次缩短渲染时间。 原理:显卡一次渲染10万个三角形和100次各渲染1000个三角形虽然渲染的三角形总数量相同但花费的时间明显是前者要快很多。

减少渲染批次的方法主要是尽量减少单独三角形,三角形条带化或使用三角形索引加速渲染,最终目标是尽可能的将多个primitiveset合并成少量的primitiveset。

C. 集群渲染。单机的渲染能力有限,采用集群的方式,每台渲染服务器只负责渲染很小的一部分区域,交界位置同时需要绘制的对象需要特殊对待防止出现只有一半显示的情况。

D. 始终控制场景内的对象渲染数量。预先将场景中的建筑物根据投影面积和高度分配等级及可见范围,越小的建筑物可见距离越近,越大的可见距离越远,同时使用LOD简化从远处看到的建筑物的复杂度。

E. 采用LOD方式划分建筑物等级及可见范围平衡渲染总量。在数据库部分将城市建筑物按照LOD四叉树方式进行区块划分,只有面积占本等级区域1/4及以上面积时建筑物作为本等级,依次按照此规则进行划分,直至达到最高等级或者所有建筑物都划分完毕。然后根据等级分别设置相应的可见距离,理论上等级越小(初始为0级)可见距离越远,下一等级是上一等级可见距离的1/2,如0级可见范围为0-100000米,1级默认为0-50000米,....。这样划分完毕后能够对渲染总量做一些平衡,大部分小建筑物都要到近处才能显示看到。另外对于一些特殊关注的标志性建筑物可以在lod划分完成后单独修改其lod等级及可见范围以满足用户需求。缺陷是当大量的小建筑集中到某个区域时,渲染速度仍然会因为数量的剧增而极速下降。

二. 方案

方案一: LOD方式 【推荐】

第一步,采用LOD四叉树算法在数据库级对城市区域内所有建筑物进行划分,划分方法为首先获取建筑物图层的外包范围(只考虑平面,忽略高度),将外包平面作为0级,根据松散四叉树的划分规则逐级分裂将所有的建筑物分配到合适的等级和区域内(如下图所示)

 

 

第二步,根据等级设置建筑物可见距离,一般将相邻等级的对象的可见距离相差1倍,最高等级(0级)一般不会有建筑物的(占整个城市1/4以上的东东怎么可能会有!),这一级的最远可见范围决定着下面所有等级的建筑物的可见距离,它的默认值应该怎样计算?

是不是有一个比较统一的观点,比如在高空多少米的地方能够看清楚的地面建筑物的占地面积,然后根据这个数值推算出最高等级是的可见范围(线型变化)。

 

 

 

第三步,对于一些用户特殊关注的建筑物可以在lod划分完成后单独修改其lod等级及可见范围以满足用户需求。

 

第四步,调度相关的一些配合流程。

当feature图层查询一个可见区域的所有地物时,数据库收到查询命令(参数是可见区域),它的查询是不是要遵循下面的那种规则:

a.从高等级到低等级排列的顺序返回查询结果【先大后小】,

b.还是直接按照与相机的距离来返回查询结果【先近后远】,

c.还是完全没有规则【不管建筑物大小,完全由调度线程可见距离来控制显示顺序】。

 

方案二 建筑物分块打包存储显示方式

就是将建筑物分成一块块的整体加载、渲染和调度,这种方式减少了渲染批次,可以加快渲染速度,但是由于建筑物数据长度的不确定性,打包文件读写和内部某个建筑的快速定位问题将会很麻烦,选择和编辑的逻辑将受打包规则的影响,而且新加一批数据时,可能需要导致所有的数据重新生成一遍才能达到优化渲染的效果。

这种方式最大的问题是我们使用的osg对后台线程生成显示列表和纹理对象是不支持的,所以只能在渲染线程生成显示列表和纹理对象,如果单个调度对象的数据量过大就会导致“帧冲击”,所以怎样将建筑物分成合适而规则的块就成了大问题了,基本无解!!!

 

方案三 倾斜摄影测量数据+建筑物单体化

三. 其它

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

城市级海量数据流畅调度方案(初稿) 的相关文章

  • 3ds max文件导出osg或者ive格式

    osg osgEarth系列文章目录 文章目录 osg osgEarth系列文章目录 前言 参考 前言 首先下载插件osgexp Osgexp的下载地址 安装上之后 如果3ds max导出里面已经可以选择导出ive或者osg 恭喜你 如果没
  • win10下qt 中没有代码提示框了怎么办?

    在这里我也找了好久 发现是跟你装的输入法有冲突了 所以代码提示没有了 请你切换到英文的输入下 把你的输入法换成标准的英文输入输入状态 图片如下 换成这样就可以提示了 如图所示完美解决不能提示的问题 好了完美解决问题 在这里我放上我讲的几个课
  • 第36.4节 动画-路径动画中的角度控制问题

    目录 本节功能 关键点 所有代码 本节功能 本节创建了一个高高低低的三维的路径 在楼顶和地面之间穿梭 一个飞机沿着这个路径进行飞行 如下图所示 请使用浏览器打开 平时遇到问题或加群也可以加我微信 13324598743 击此打开网盘资源链接
  • osgFBO(十)多pass-3,pass3,shader将背景从绿色变为蓝色

    pass3和pass2类似 只是再熟悉下 这个Pass设定为最后一步 可以不再输出纹理 即 1 pass3摄像机输入tex2 osg ref ptr
  • 【OSG】OSG环境部署 OSG3.6.5+vs2017+win10_x64(超详细)

    最近开始了OSG的学习 开始搭建OSG开发环境 期间遇到了很多问题 也查阅了很多资料 最终搭建成功 OSG本来就是开源的 不应该敝帚自珍 应该多交流多分享 所以在此记录一下环境搭建的过程 方便以后查阅和交流 1 下载文件 1 1 OSG源码
  • 使用Qt构建osgQt静态库在osg3.6.4中使用(附osgQt源码下载地址)

    osgQt库在osg3 4以后就给取消了 现在一般使用osgQOpenGL库替代 但是网上能搜到的教程里 常见的使用方法 还是以osgQt居多 因此 逼得我只能自己去编译一套osgQt的库文件 有如下几个注意点 首先是下载osgQt的地址
  • osg学习(七十四)Type mismatch in arithmetic operation between ‘vec2‘ and ‘int‘

    可能是手机端语法检查更严格 glsl语句是这样的 再桌面端执行没有问题 在手机端执行会提示上述错误 vec3 tmpNormal osg NormalMatrix osg Normal tmpNormal normalize tmpNorm
  • osgcuda

    osgcuda 转 原文 http blog sina com cn s blog df1b276a0101inbi html osgCompute是对代码的并行流处理器执行的抽象基库 库连接到OSG的 OSG 因此它可以被包括在场景图 它
  • osgearth消除近裁剪平面离物体太近时的裁剪问题

    This will mitigate near clip plane issues if you zoom in close to the ground LogarithmicDepthBuffer buf buf install view
  • osgEarth的Rex引擎原理分析(四十六)如何定制椭球体并进行椭球体间坐标转换

    目标 目标 四十五 中的108 可以用于CGCS2000和WGS84的坐标转换 osg EllipsoidModel默认创建wgs84椭球体 将CGCS2000和WGS84的经纬高坐标分别转换为XYZ 然后比较其差值 osg Coordin
  • ViewerBase::renderingTraversals()的简易理解

    前两篇说到了camera用来剔除 context用来渲染 多线程渲染就是把cpu尽可能的分配给context 如果土豪的话 在剔除过程也分配cpu 另外 也要注意到过期请求数据不处理 当然 首先要获取场景 摄像机和上下文 现在看下摄像机剔除
  • qt5+osg多线程的解决方案

    问题描述 Cannot make QOpenGLContext current in a different thread 解决思路 在主线程中将qt窗体中的QOpenglContext moveToThread到窗体线程中 这样窗体线程在
  • osgfbo(六)从pass的角度考虑,改写fbo(二)

    什么是pass 这个问题 看似简单 也让我头疼 看了osgdefered pass定义为osg Camera 杨石兴的osg视频教程定义为osg Group 我认为一个passRoot可以定义为一个Group 包含三部分 到目前pass为止
  • osgEarth的Rex引擎原理分析(二十)osgEarth::TerrainEngineNode中setMap方法作用

    目标 十二 中的问题12 不同于派生类RexTerrainEngineNode中setMap的内容 详见 十二 在RexTerrainEngineNode执行setMap时会首先调用TerrainEngineNode的setMap 这里主要
  • 第36.1节 动画-刚体动画控制

    目录 本节功能 具体实现 存放动画 寻找动画 播放 暂停 复位 加速 减速 最后用一个事件响应来联接这一切 所有代码 本节功能 本节后几个章节会介绍和动画有关的课程 本节实现一个从3DMAX导出的地板破碎的动画的控制 这类动画叫做刚体动画
  • OSG for Android新手教程系列(二)——项目配置

    在上一篇教程中 主要介绍了如何把OSG源代码编译成为能够在Android项目下使用的函数库 在这一篇教程中 我将针对如何在自己的Android项目中配置OSG函数库进行详细讲解 现阶段网上关于OSGfor Android的配置方式教程有很多
  • osgEarth的Rex引擎原理分析(十五)分页瓦片加载器在更新遍历时对请求处理过程

    目标 十四 中的34 osgEarthDrivers engine rex Loader cpp void PagerLoader traverse osg NodeVisitor nv for count 0 count lt merge
  • osg fbo(四),将颜色缓冲区图片中的牛通过shader变绿

    osg fbo 三 中 把整个屏幕变绿了 因为是把shader添加到了颜色缓冲区图片上了 如果只想把牛变绿 就需要把shader添加到原始场景根中 即 osg ref ptr
  • osg漫游器

    在三维中常见的就是漫游整个场景 所谓漫游就是 观察者的视线从一个位置移动到另外一个位置或者在希望的方向上移动 在OSG中漫游可以通过改变观察者 相机 的位置和姿态来实现 三维世界中的模型的相对位置和形态不会发生变化 只是观察者的角度和位置发
  • 分页节点

    动态调度技术 分页数据库 osg PageLOD 动态调度技术 如果数据庞大 那么是不可能一次性全部载入内存的 因此需要动态调度技术 动态调度技术 在显示当前视域中的场景元素的同时 预判下一步可能载入的数据 以及那些短时间内不会被看到的数据

随机推荐

  • JavaScript 输入内容表单规则验证

    1 电子邮箱格式 function emailCheck data let str a zA Z0 9 a zA Z0 9 a zA Z0 9 0 61 a zA Z0 9 a zA Z0 9 a zA Z0 9 0 61 a zA Z0
  • Mybatis框架全面详解

    MyBatis的基本使用 第一章 MyBatis的概念 第二章 MyBtais的基本使用 2 1 环境的搭建 2 1 1 物理建模 2 1 2 逻辑建模 2 1 3 搭建框架开发环境 2 1 3 1 junit框架 2 1 3 2 log4
  • 前端笔记之JavaScript(三)关于条件判断语句、循环语句那点事

    一 条件分支语句 条件分支语句 也叫作条件判断语句 就是根据某种条件执行某些语句 不执行某些语句 JS中有三种语法是可以表示条件分支的 1 1 if else 条件分支的主力语法 这个主力语法能够书写所有的条件分支语句 也就是说 一会儿学s
  • DFS 显示n个数中选取i(0~n)个数的情况

    include
  • 面试之JVM的储存空间

    Java8之后 取消了整个永久代区域 取而代之的是元空间 运行时常量池和静态常量池存放在元空间中 而字符串常量池依然存放在堆中 JVM允许时数据区 程序计数器的特点以及作用 1 程序计数器 是一块较小的内存空间 2 是当前线程所指向的字节码
  • Maven 快照(SNAPSHOT)

    一个大型的软件应用通常包含多个模块 并且通常的场景是多个团队开发同一应用的不同模块 举个例子 设想一个团队开发应用的前端 项目为 app ui app ui jar 1 0 而另一个团队开发应用的后台 使用的项目是 data service
  • 【异常】java: 警告: 源发行版 11 需要目标发行版 11

    写在前面 笔者遇到的问题比较极端 在阅读之前建议检查是否是项目结构中语言级别和jdk版本不匹配的问题 确认并非语言级别级别问题再阅读以下 先说结论 idea 的 配置文件iml 与项目中 配置 的jdk版本不一致 排查 iml 文件 检查L
  • CSS3设置flex,图片的高度被自适应了

    如图所示 因为给最内存的图片宽度设置了width 100 会寻找上一级的高度 上一级没设置会自动寻找父元素 父元素的宽度为整个页面 所以img宽度为父元素宽度的6分之一 自然高度也会自适应变小了 设置width 600自然就能恢复高度了
  • PHP+JavaScript+HTML实现上传PDF和浏览PDF课件

    在寒假简单制作PHP网站时 需要实现在线浏览PDF和上传PDF的简单功能 下面就简单介绍下该功能 实现效果如下图所示 1 当用户登录后 点击 上传课件 超链接可以实现隐藏和显示上传table的功能 2 当用户选择上传的课件后 PDF上传至本
  • Mybatis -maven插件方式自动生成pojo,mapper文件代码(generatorConfig.xml)

    1 新建springboot工程 添加maven依赖
  • python为字体添加上下标

    添加上标 添加下标 举例 import numpy as np import matplotlib pyplot as plt t np linspace 0 10 1000 y np sin t plt plot t y plt xlab
  • 基于线性表的图书管理系统(java)

    目录 1 简介 2 代码 1 ManageSystem类 2 book类 3 测试程序运行结果截图 1 登录和创建 2 输出 3 查找 4 插入 5 删除 6 修改 7 排序 8 计数 9 导出 10 读入 11 菜单 4 存在的问题与思考
  • 零阶矩、一阶矩、二阶矩、三阶矩

    参考 Moment mathematics Wikipedia 此处截取其中的一段 In mathematics a moment is a specific quantitative measure used in both mechan
  • 记一次从web到内网的渗透

    记一次从web到内网的渗透 拓扑图 环境介绍 现在有三台机器 分别为target1 target2 target3 里面分别有三个flag 每个flag的分值不同 需要通过拿下一个已知IP target1 进而向内网里面进行渗透 最终要成功
  • 字符设备驱动程序

    字符设备驱动程序 下面以一个简单的例子来讲解下字符设备驱动程序 首先需要有内核环境 Linux下的设备驱动程序被组织为一组完成不同任务的函数的集合 通过这些函数使得Windows的设备操作犹如文件一般 在应用程序看来 硬件设备只 是一个设备
  • 淘宝客app源码如何选择技术栈?

    选择技术栈是开发淘宝客App的重要决策 它将直接影响到开发效率和产品质量 首先 选择技术栈的时候需要考虑淘宝客App的功能和需求 淘宝客App作为一个电商平台 涉及到用户登录 商品展示 下单支付 优惠券等功能 因此选择的技术栈需要支持这些功
  • linux篇【12】:网络套接字<中序>——tcp

    目录 查看TCP网络服务器情况和端口使用情况 netstat nltp 一 TCP套接字接口 1 inet aton 和inet addr一样 换一种方式而已 2 listen 把套接字设置为监听状态 3 服务器获取客户端的连接 accep
  • c++中整形输入逗号_很重要的收集 --- 关于c++的各种输入(包括istream_iterator结合逗号分隔)...

    最近又开始刷题了 在这个过程中 我不断地发现一个问题 就是不同的题目会有不同的输入要求 而如果用c 这么繁复的语言在刷题的时候 有时候光是一个输入就会把所有的时间都消耗得一干二净 因此我在这里设立一篇文章用来记录不同的输入方式 本篇文章采取
  • SpringBoot基本操作(七)——SpringBoot整合Shiro权限管理(完整demo+界面)

    SpringBoot2 0笔记 一 SpringBoot基本操作 环境搭建及项目创建 有demo 二 SpringBoot基本操作 使用IDEA打war包发布及测试 三 SpringBoot基本操作 SpringBoot整合SpringDa
  • 城市级海量数据流畅调度方案(初稿)

    城市级海量数据流畅调度方案 初稿 一 系统约束 1 硬件限制 CPU 显卡 内存 硬盘 最耗费CPU时间的是 视锥体和boundSphere boundBox的求交计算 显卡现在最大的瓶颈是 当渲染批次多时 2000个primitivese