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

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 恭喜你 如果没
  • 第36.4节 动画-路径动画中的角度控制问题

    目录 本节功能 关键点 所有代码 本节功能 本节创建了一个高高低低的三维的路径 在楼顶和地面之间穿梭 一个飞机沿着这个路径进行飞行 如下图所示 请使用浏览器打开 平时遇到问题或加群也可以加我微信 13324598743 击此打开网盘资源链接
  • osg fbo(一),生成颜色缓冲区图片

    由于工作需要 重新捡了下shader 很明显 fbo是重中之重 好记性不如烂笔头 先记录下 1 生成一个颜色纹理 为了省事 可以将纹理宽高 屏幕宽高 osg ref ptr
  • osg fbo(三),将颜色缓冲区图片通过shader变绿

    这个其实很简单 一 写顶点着色器和片元着色器 static const char vertexShader void main void n n gl Position ftransform n n static const char ps
  • osg学习(七十四)Type mismatch in arithmetic operation between ‘vec2‘ and ‘int‘

    可能是手机端语法检查更严格 glsl语句是这样的 再桌面端执行没有问题 在手机端执行会提示上述错误 vec3 tmpNormal osg NormalMatrix osg Normal tmpNormal normalize tmpNorm
  • osgEarth的Rex引擎原理分析(三十八)MapFram和MapInfo的关系

    目标 三十 中的问题89 osgEarth MapInfo主要用于记录Map的参数配置信息 投影信息 大地 正交 立方体 和高程插值信息 一般从Map生成MapInfo mapInfo context gt getMap osgEarth
  • osg打开.osg格式文件报错:DynamicLibrary::failed loading “osgPlugins-3.4.1/osgdb_osgd.dll“

    前言 osg打开 osg格式文件报错 DynamicLibrary failed loading osgPlugins 3 4 1 osgdb osgd dll osgPlugins 3 4 1 osgdb osgd dll 解决 需要用到
  • osgcuda

    osgcuda 转 原文 http blog sina com cn s blog df1b276a0101inbi html osgCompute是对代码的并行流处理器执行的抽象基库 库连接到OSG的 OSG 因此它可以被包括在场景图 它
  • osgFBO(九)多pass---2,pass2,shader将背景从红色变为绿色

    二 pass2是比较完整的 同时有输入纹理和输出纹理 与pass1类似 这里只列出不同的地方 1 pass2摄像机输入tex1 osg ref ptr
  • STK的2D二维采用的投影方式及osgEarth实现

    Spherical or Equirectangular projection 等距圆柱投影 球面投影 The equirectangular projection also called the equidistant cylindric
  • ViewerBase::renderingTraversals()的简易理解

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

    目录 本节内容 实现要点 点选 性能 绘制球 本节内容 结合上一节 我们把框选这个功能给完善了 如下 白色的是我点击左CTRL 用鼠标左键在场景中拉的框 拉框的教程在第37 1节 框选 绘制框选框 拉完框后能够将场景中选择的物体置红 本节代
  • 14款开源或免费的GIS软件

    1 QGIS 原称Quantum GIS QGIS 原称Quantum GIS 是一个跨平台的桌面GIS软件 它提供数据的显示 编辑和分析功能 可以自动生成地图 并且能够处理地理空间数据 最后形成你期待的地图数据 它于2004年成为地理空间
  • VS2010+Qt5+OSG3.0开发环境搭建

    一 VS2010 VS2010的安装网上教程很多 不再叙述 二 Qt 在VS中开发程序 需要下载Qt安装包和Qt的VS插件 我用的版本是Qt5 1 1 for Windows VS2010 OpenGL VisualStudio Add i
  • osgfbo(六)从pass的角度考虑,改写fbo(二)

    什么是pass 这个问题 看似简单 也让我头疼 看了osgdefered pass定义为osg Camera 杨石兴的osg视频教程定义为osg Group 我认为一个passRoot可以定义为一个Group 包含三部分 到目前pass为止
  • 开源GIS浅谈

    开源GIS浅谈 转 http blog csdn net happyduoduo1 article details 51773850 谈到GIS软件 首先让我们想到的是GIS界的龙头大哥ESRI公司旗下的ArcGIS产品 从最初接触的ver
  • OSG for Android新手教程系列(二)——项目配置

    在上一篇教程中 主要介绍了如何把OSG源代码编译成为能够在Android项目下使用的函数库 在这一篇教程中 我将针对如何在自己的Android项目中配置OSG函数库进行详细讲解 现阶段网上关于OSGfor Android的配置方式教程有很多
  • AABB和OBB包围盒简介

    一 AABB立方体边界框检测 用球体去近似地代表物体运算量很小 但在游戏中的大多数物体是方的或者长条形的 应该用方盒来代表物体 另一种常见的检测模型是立方体边界框 如图10 31展示了一个AABB检测盒和它里面的物体 坐标轴平行 Axial
  • osgFBO(十二)深度纹理与颜色纹理混合

    前面涉及到了深度纹理和颜色纹理 由于qedl中 也要两者混合 所以 要考虑到两者混合 这里只是简单将其相加 一 设置纹理 采样颜色纹理 osg ref ptrosg Texture2D texColor createFloatRectang
  • 分页节点

    动态调度技术 分页数据库 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