全局实例化的大规模数字孪生场景对象高效绘制方法

2023-11-28 01:53郭德全罗德宁谭敏尧
工程科学与技术 2023年6期
关键词:管理器样条实例

郭德全,罗德宁,杨 强,谭敏尧,杨 莉

(成都信息工程大学 自动化学院,四川 成都 610225)

在数字孪生城市场景[1]中,需要构建大量的建筑、植被、道路、路灯等静态绘制对象,以及行驶在道路上的车辆等动态绘制对象。路灯、车辆等对象具有重复性和空间位置规律性等特点,当绘制规模较小时,可以使用传统方法[1]在样条线上生成每个对象,这样的场景中每个对象都是一个独立的网格体。在绘制过程中,由CPU发送指令,GPU执行指定的渲染任务,即为一次绘制调用[2]。使用传统方法的每个网格体需要执行至少一次绘制调用。然而,当大规模对象的绘制采用上述方法时,在网格体数量过多的情况下绘制调用会非常高,将造成网格帧率低下,以致无法在数字孪生场景中准确表达大规模对象的绘制效果。实例化技术[3]能解决绘制调用高的问题,但任意样条线上实现大规模静态或动态对象的实例化技术研究还非常少。

实例化技术目前已内置于一些图形绘制引擎中,如Unreal Engine、Unity中常用的实例化静态网格体和层级实例化静态网格体方法[4]等,但在大规模对象实时绘制上还缺少更多的理论研究。前期已经开展了实时生成技术研究[5],实例技术目前的研究方向主要在群体动画[6]、网格简化[7]等方面,常结合一些实际应用展开。在GPU Gems 几何体实例[8]中提到渲染由几个多边形组成的大量小对象,会给GPU带来很大的绘制压力,并且目前Direct3D和OpenGL等图形API设计的目的不是每帧高效地渲染数千次少量多边形,要解决这个问题的方法就是渲染相同几何体的许多唯一实例。NVIDIA研究人员Bryan[9]使用实例化技术减少绘制调用,通过状态更改和缓冲区更新的数量来降低CPU开销,提高大量动态绘制对象的渲染效率。一些学者开展了大规模虚拟人群[10-11]实时绘制研究与应用,半透明材质渲染[12]与超越模糊的凹坑渲染[13]研究也得到发展。但是基于实例化的群体动画实时渲染[14]方面的研究仍然较少。

在网格简化方面,Azim等[15]在压缩实例化文件过程中,提出实例化感知简化(IAS)算法可有效地简化实例化3D网格,从而减小传输文件大小,保留更高的视觉质量。在实际应用研究上[16],采用实例化技术能够显著减少对建筑物、植物、道路等场景对象[17-19]的渲染批次,实现一次GPU绘制调用,渲染一大批物体。Ding等[20]建立了实时可视的城市道路网络中的车辆排放,Jung等[21]对树与植被进行了3D实例化研究,这些方法对于本文采用全局实例化方法提供了研究依据。

近年来,面向智慧城市的数字孪生城市是国家提倡数字化改革的重要应用领域。潘志庚等[22]提出了面向实物交互的空间增强现实数字孪生法配准技术,在数字空间建立与物理空间一致的对象数字模型。陶飞等[23]提出的数字孪生5维模型为相关领域践行数字孪生理念与技术提供了参考。同时,样条线在建模方面优势突出,既能创造出复杂的模型,又能提高效率和质量[24-25]。例如,混合整数二次规划的多元自适应回归样条[26],Cao等[27]提出了V-Spline方法,可进行平滑样条的轨迹重建。

大规模对象绘制会占用较多的内存、CPU、GPU等计算资源,如果处理不好就难以表达真实的效果。通常绘制开销并不取决于场景中的多边形数量,而是取决于绘制调用次数。因此,在数字孪生城市的实例,常用空间相邻、材质相同、渲染状态相同的小模型合并成一个大模型,或者采用实例化技术。因此,本文利用全局实例化方法研究大规模静态和动态对象的绘制,通过全局实例化管理器维护所有大规模场景对象的绘制,降低DC数量,提高绘制性能。

1 全局实例化绘制方法

全局实例化绘制方法不仅适用于静态对象的绘制,也适用于动态对象的绘制。动态对象的绘制主要增加了实例对象位置的更新过程,因此,在介绍全局实例化绘制方法时,对动态对象的绘制进行整体阐释,其过程涵盖了静态对象的绘制。

1.1 方法概述

实例化网格体可高效渲染同一个网格体的多个实例,尤其适用于程序化创建的场景,不必在场景中放置成百上千个网格体,只需放置一个实例化网格体,就能添加该网格体的多个实例,大幅降低性能开销。本文曾对金字塔模型(868个三角形)在20 m范围内随机生成200个实例后的nDC进行测试,从未实例化的436次DC减少为实例化的233次。实例化技术已有较成熟的实现过程[3,8,15],因此本文对增加、删除、清除、移动实例的底层实现过程不再赘述。

图1为全局实例化绘制流程图。首先,全局实例化场景所布设样条线上相同的绘制对象,即场景中相同绘制对象共享同一网格体;其次,在每条样条线上以一定规则分配全局实例化对象实例; 最后,根据唯一标识符对更新样条线上的动态实例,如实现车辆的移动。

图1 全局实例化绘制流程图Fig.1 Global instance rendering flowchart

本文提出的全局实例化方法采用全局实例化管理器维护大规模场景对象的绘制,因为存在不同样条线上不同的实例绘制对象,因此面临大量不同实例化对象管理上的挑战。首先,全局实例化整个场景中所布设样条线上相同的绘制对象;其次,在每条样条线上以一定规则分配全局实例化绘制对象的实例;最后,根据唯一标识符对样条线上的动态实例进行更新。下面分别从布设样条线、全局实例化绘制对象、更新动态实例3个关键过程进行阐释。

1.2 布设样条线

样条线是经过一系列给定点的光滑曲线,因此,通过样条线能够程序化创建场景中重复和有规律的对象,如路灯、移动车辆等。因此,全局实例化绘制方法首先在场景中生成多个样条线对象,每条样条线能够灵活地表达和管理场景对象;其次,在样条线对象上设置多个样条点(特别是转弯、上坡、下坡等环境下便于更准确地构建光滑曲线);再次,设置样条点上切线进入方向和离开方向,从而控制每个样条点处的曲线;最后,根据绘制对象所占长度和样条线总长度计算样条线需要绘制的对象数量。

1.3 全局实例化绘制对象

全局实例化绘制对象过程包括全局实例化绘制对象和分配实例。在场景中生成一个全局实例化管理器对象,全局实例化管理器将维护实例化静态网格体组件数组,在系统开始运行的时候就会执行实例化功能,根据指定的静态网格体数量,生成相同数量的实例化静态网格体组件,每一个静态网格体对应一个实例化静态网格体组件。

全局实例化管理器还会维护绘制对象样条线数组,用于保存在场景中生成的所有样条线对象,在系统开始运行的时候会遍历该样条线数组,根据每条样条线计算得出当前样条线所需绘制对象的数量来生成相同数量的实例。每生成一个实例,全局实例化管理器都会将这个实例的唯一标识符对传递给样条线对象,以便保存样条线的实例信息数组。每一个实例都是由实例化静态网格体组件生成,而每一个实例化静态网格体组件都是在全局实例化管理器内的实例化静态网格体组件数组中随机选取,因此只需要将实例化静态网格体组件的序号以及由该组件生成的实例的序号赋值给样条线对象的实例信息数组,依据样条线对象里保存的唯一标识符对在全局实例化管理器里可查找到每一个实例,从而方便于后续的动态实例更新。

1.4 更新动态实例

对于动态对象的绘制,样条线对象会逐帧遍历所维护的实例信息数组,从中获取唯一标识符对,再在全局实例化管理器里查询对应实例,然后通过预先设定的移动方式计算下一帧新位置完成实例更新。对于静态对象的绘制,全局实例化的绘制方法也将在实验中进行展现和分析。

2 全局实例化车流与车辆绘制方法

全局实例化的移动车辆绘制主要以布设车流线、全局实例化移动车辆、更新实例车辆位置3个方面展开。布设车流线车辆需要经过的指定路线、计算需要生成的车辆数量以及更新车辆位置,全局实例化不同移动车辆并分配车辆实例到车流线上,并根据车辆运动规律更新实例车辆位置。

2.1 布设车流线

为了更灵活地布设车流线,场景由多个车流线对象组成。每个车流线对象维护一个样条线组件、一个车辆信息数组、一个车辆速度值、一个全局实例化管理器引用对象。样条线组件通过设置多个样条点,并在样条点上设置切线进入方向和离开方向,连接所有的样条点即可形成一条自定义曲线,该曲线上所有位置都可以通过样条线组件的参数计算得到,因此能够模拟车辆运动过程。

首先,在场景中生成多个车流线对象;其次,根据每条道路特点,在样条线组件上设置多个样条点,便于模拟车辆运动路径;再次,设置样条点上切线进入和离开方向,更好地表达转弯、上坡、下坡等道路;最后,计算需要生成车辆数量及初始化车辆信息数组,根据车辆模型所占长度及样条线总长度计算出共需要多少车辆才能将车流线占满。每一辆车最初在车流线上的位置和世界位置会被保存到车辆信息数组中。从而完成车流线的布设。

车辆信息数组保存每一辆车的唯一标识符对、在样条线上的位置和世界位置。唯一标识符对由车辆类型实例ID及实例ID组成,车辆类型实例ID是不同车辆类型的实例化组件,实例ID是对应实例化组件具体实例索引。在样条线上的位置便于计算移动车辆下一个世界位置。

2.2 全局实例化移动车辆

根据全局实例化管理器配置的不同车辆类型总数进行实例化,每一车辆类型生成实例化组件,同时指定相应车辆模型,即场景中相同的移动车辆共享同一个网格体,从而降低nDC,提高绘制性能。

全局实例化移动车辆流程如图2所示。在场景中生成一个全局实例化管理器对象,全局实例化管理器维护一个实例化静态网格体组件数组,在系统开始运行的时候就会执行实例化的功能,根据指定的车辆静态网格体个数,全局实例化会生成相同个数的实例化静态网格体组件,每一个车辆静态网格体对应一个实例化静态网格体组件。全局实例化管理器还会维护一个车流线数组,用于保存所有在场景中生成的车流线对象,全局实例化管理器在系统开始运行的时候会遍历该车流线数组,根据每条车流线计算得出当前车流线所需车辆数量来生成相同数量的实例。

图2 全局实例化移动车辆流程图Fig.2 Global instance moving vehicle flowchart

每生成一个实例,全局实例化管理器都会将这个实例的唯一标识符对传递给车流线对象,供车辆信息数组保存。每一个车辆实例由实例化静态网格体组件生成,而该组件都是在全局实例化管理器内的实例化静态网格体组件数组中随机选取,因此只需要将实例化静态网格体组件的序号(车辆类型实例ID)以及由该组件生成的实例序号(实例ID)赋值车流线对象的车辆信息数组,即可通过车流线对象里保存的唯一标识符对在全局实例化管理器里查找到每一个车辆实例。

2.3 更新实例车辆位置

图3为更新实例车辆位置流程图。车流线对象会逐帧遍历所维护的车辆信息数组,从每个车辆信息数组里获取唯一标识符对,再用唯一标识符对在全局实例化管理器里查询到对应的车辆实例,然后从车辆信息里获取到车辆实例在车流线上距起始点的距离,再获取预先设定好的车辆速度,通过在车辆当前距原点的距离上增加车辆行驶路程,即可计算得到车辆下一帧距离车流线原点的距离,即车辆实例新位置,新位置计算方法如式(1)所示:

图3 车辆实例位置更新流程图Fig.3 Flowchart of vehicle instance location update

式中, Δt表示一帧的时间,r(t)表示车辆的当前位置,v表示车辆的速度, Δr表示路程, Δr′表示样条线上的路程,r(t+Δt)表示车辆下一帧位置。

全局实例化管理器提供了更新车辆实例所在位置的方法,最后利用唯一标识符对、车辆实例新位置即可持续更新车辆实例在场景里的位置。

3 实验结果与分析

本文实验数据处理及车流线绘制效果对比图都是在同一配置环境下进行。实验平台采用AMD Ryzen 9 12-Core 3.80 GHz处理器,N Nvidia GeForce RTX 2070 SUPER 8 GB图形显卡及3 200 MHz 32 GB内存,实验中测试分辨率均为1 920×1 080。在全局实例化移动车辆绘制实验,场景中布设了29条样条线,如图4(a)所示,其中4条带转弯曲线。选取6类车辆在样条线上生成车辆,各车辆三角形数量见表1。表1中,ntris为视口中三角形绘制个数,即绘制的三角形总数量(绘制图元次数)。根据车辆长度和样条线长度随机在29条样条线上各方法生成605辆车辆,如图4(b)所示。

表1 样条线上6类车辆信息Tab.1 Vehicles information of six types on the spline line

图4 布设样条线和车流线绘制结果Fig.4 Rendering results of layout splines and traffic lines

在每条样条的实例化,即局部实例化[28-29]中比较各方法的性能开销。传统方法[30]、局部实例化方法[31]、本文方法(全局实例化方法)和层级实例化方法[4]各指标对比见表2,所用车辆数为 605辆。每秒传输帧数(fFPS)表示每秒帧率,反映绘制流畅度,一般帧数越高绘制越流畅。表2中,tMS表示每帧绘制时间,时间越短,绘制效率越高;fFPS/tMS比值代表绘制性能。从表2中可知,前3类方法在统一视口下绘制的三角形次数基本相同,但绘制调用差异非常明显,全局实例化相比传统方法nDC减少了97.4%,因此性能提升了28.4%,显著减少了CPU在处理绘制调用上的时间花费。虽然局部实例化方法相比传统方法nDC减少了71.1%,但仅在每条样条线上进行实例化,会产生大量的实例化对象,频繁切换渲染状态,对CPU的消耗比DC还大,因此其性能反而降低。针对层级实例化在动态对象上的应用也作了对比实验,虽然三角形绘制数量和nDC减少,但性能并未提升,这是因为每帧需要更新层次实例化中管理实例数据的数据结构体,大量车辆在运动过程每帧对该结构体更新造成CPU开销很大,虽然nDC减少但性能降低。

表2 4种方法指标对比Tab.2 Indicators comparison of four methods

对于数字孪生城市场景中植被模型、交通设施模型、景观模型等重复静态对象的绘制,采用全局实例化方法能够极大减少nDC。图5为1 976个路灯实例化前后的nDC对比图,本文将DC数量进行了对比。从图5可知,实例化比未实例化减少了96%的绘制调用。这是因为未实例化前,路灯模型(646个三角形,2个材质通道),每次绘制调用时,CPU需要向GPU发送场景中每个路灯的数据、状态、命令等内容,每个路灯相互独立构成大量的绘制调用,会频繁地占用CPU和GPU绘制资源,存在较大的性能开销;实例化后,对于重复静态对象,能够共享网格体顶点数组,对于不同副本的静态对象,只改变顶点数组的变换矩阵(位置、旋转、缩放),从而减少nDC。

图5 实例化1 976个路灯的 nDC 对比Fig.5 DC comparison of instantiating 1 976 streetlights

图6为本方法应用于实际数字孪生城市的场景,包括商业、学校、居民楼等建筑,还有大量交通设施、水系、植被、地形地貌等实景3维场景。图7为采用全局实例化方法与传统方法在图6场景道路漫游过程中的帧率对比。在每条道路上都布设了大量移动车辆,采用全局实例化方法比传统方法帧率提升了18%~43%。特别是在复杂对象场景的绘制中,如果不采用降低DC数量的绘制方法,将难以支持大规模数字孪生城市场景的绘制。因此,采用本文的方法能够高效绘制大量移动车辆、静态路灯等场景,满足大规模静态、动态对象的实时绘制需求。

图6 全局实例化方法在数字孪生城市场景中的应用Fig.6 Global instance method applied in digital twin city scene

图7 传统方法与全局实例化方法漫游帧率对比Fig.7 Frame rate comparison between traditional method and global instance method

4 结论及展望

对于利用样条线绘制大量静态或动态对象的物体,采用全局实例化方法不仅能够大大减少绘制调用量,提高绘制效率。相比传统的绘制方法,通过全局实例化的绘制方法能够平均提升30%的绘制性能。因此,本文提出了一种全局实例化方法以一定规则在3维场景中布设的样条线上分配实例化对象,并构建全局实例化管理器进行所有场景对象的绘制管理。同时,本方法可用于动态对象绘制,根据唯一标识符对在样条线上实现动态实例更新。

然而,本方法对于动态对象的绘制,还存在每帧大量移动对象位置的计算过程,对性能开销影响较大,因此,在未来的工作,将引入多线程的方式对移动对象位置更新进行计算,减少主线程的绘制负载,提升整体绘制性能。

猜你喜欢
管理器样条实例
一元五次B样条拟插值研究
应急状态启动磁盘管理器
Windows文件缓冲处理技术概述
三次参数样条在机床高速高精加工中的应用
三次样条和二次删除相辅助的WASD神经网络与日本人口预测
基于样条函数的高精度电子秤设计
高集成度2.5A备份电源管理器简化锂离子电池备份系统
完形填空Ⅱ
完形填空Ⅰ
在Win 7下利用凭据管理器提高访问速度等