三维模型的渲染性能由两个因素决定,第一是数据结构与算法,第二是硬件。
在数据算法层面,由于可见性问题,并不需要将所有的实体网格渲染出来,用户能看到的还是以三角面片构成的空间多边形对实际模型表面的近似,我们需要频繁的去访问这些数据;但另一方面,在需要查看模型内部状况的场合,我们仍然需要处理所有网格以计算出正确的截面数据,在超大规模模型中,低效的内存组织方式会会导致很低的缓存命中率,这对性能有较大的影响。为了解决这些问题,XT平台在导入结果模型之后会将节点与单元数据重新排序,使得表面的数据排在前面,实体内部的数据排在后面,导入的结果数据更加模型节点和单元的顺序存为一个数组,在大多数情况下,我们只需要读入表面的数据,这样既可以减少内存的使用又能提高缓存命中率;在查看内部时,读入实体全部数据,由于结果数据存放的有序性,我们可以在线性时间内访问到任意节点或单元的数据;另外,XT平台也深度优化了网格拓扑的数据结构,由于非结构网格的特点,一般来说节点与网格单元的拓扑关系会通过链表表达,它有足够的弹性去适应不同维度的单元节点连接关系,但是链表的访问是相对低效的,前面提到的缓存命中率问题会有显著的影响,XT平台对此创造性的采用结合内存池管理的变长数组方案,既能任意扩展拓扑关系,又能快速的访问,同时也避免了内存碎片化问题,在实测案例中有数倍性能的提升。
由于后处理需要处理很多结果数据,尤其是在瞬态分析中不同时间步不同类型的结果往往会占用数百G的空间,如果要将这些数据全部载入内存中是不现实的也是不必要的,为解决这样的问题,我们引入了懒惰模式,即结果导入的时候仅仅读取模型数据和结果大纲,在用户需要查看某个结果数据时才真正的去读取相应的结果数据,而已经读取的结果并不会一直保存在内存中,一旦用户查看其它数据,已有的数据直接以组织好的内存块写到硬盘上,这样在下次需要访问这些数据的时候,就只需要一次性从硬盘中读取内存块,不需要再到原始结果中去逐个解析数据。在动画场景中,需要按一定顺序渲染若干步结果,应用这一机制,我们可以用最小的内存代价去实现满意的实时渲染效果。
数据和算法是代码级别的优化,在实际工业应用中,要想得到最大程度的性能优化,更重要的是对硬件性能的挖掘。
在硬件层面,显卡是对渲染性能影响至关重要的设备,显卡对渲染性能的支持通过某种图形引擎来实现。XT平台高度依赖于OpenGL图形引擎这一业界标准,OpenGL图形引擎是一种图形与硬件的接口, 它包括了一百多个图形函数接口, 开发者可以用这些函数来建立三维模型和进行三维实时交互。OpenGL的管线工作流在空间矩阵变换、光线处理、色彩处理方面充分利用了GPU高并行的优点,在硬件层面为高性能渲染提供了强大支持。GLSL是对OpenGL管线流的扩展,使用户可以通过软件编程将很多本来在CPU中完成的计算转移到高并行的GPU硬件中完成,这在超大规模应用场景中,在任务级别能带来极大的性能改进。事实上,XT平台对云图、变形的渲染就是利用GLSL在GPU中直接处理结果数据,尤其是在用户动态修改云图变形的设定时,我们不需要去重新计算云图的分布以及变形之后的模型位置与尺寸,不仅节约了大量的CPU计算资源和内存资源,而且在实时渲染性能上能得到显著的提升。
| 更新标识 | 值 | 备注 |
|---|---|---|
| Update_Vertex | 1 | 当增加/修改/删除/隐藏/显示面时,更新面的视图数据 |
| Update_Edge | 2 | 当增加/修改/删除/隐藏/显示边时,更新边的视图数据 |
| Update_Face | 4 | 当增加/修改/删除/隐藏/显示面时,更新面的视图数据 |
| Update_Solid | 8 | 当显示体网格细节时,更新体网格的视图数据 |
| Update_MeshElement | 16 | 当选择的单元发生变化时,更新被选单元的视图数据 |
| Update_MeshNode | 32 | 当选择的顶点/节点或者自由节点变化时,更新相关点的视图数据 |
| Update_Contour | 64 | 当云图值激活或者变化时,更新云图值的视图数据 |
| Update_Deform | 128 | 当变形值激活或者变化时,更新变形值的视图数据 |
| Update_Slide | 256 | 当切面激活或者变化时,更新切片上的视图数据 |
XT图形模块支持普通渲染、实体网格渲染、切片渲染、云图渲染、变形渲染、动画渲染几种模式,其中前两种是基本渲染模式,任何时刻只能激活其中一种,而后面的模式可以分别和基本模式叠加。
| 模式标识 | 值 | 备注 |
|---|---|---|
| ViewModel | 1 | 普通渲染模式,只显示面相关的线框/表面/表面网格线,使用VBO |
| ViewSolid | 2 | 实体网格渲染模式,显示可见的实体网格表面/网格线,不使用VBO |
| ViewClip | 4 | 切片渲染,只显示截面表面,不使用VBO |
| ViewContour | 8 | 云图渲染模式,使用GLSL、VBO、VAO |
| ViewDeform | 16 | 矢量变形渲染模式,使用GLSL、VBO、VAO |
| ViewVector | 16 | 矢量箭头渲染模式,使用GLSL、VBO、VAO |
| ViewIsoline | 16 | 等值线渲染模式,不使用VBO |
| ViewPreview | 16 | 预览渲染模式,不使用VBO,仅供命令使用 |
| ViewStreamline | 16 | 流线渲染模式,不使用VBO |
| ViewAnimation | 32 | 动画渲染模式 |
XT平台支持线框、网格线、表面、坐标系、边界约束符号的显示与隐藏。
XT按照帧的结构组织动画的渲染,在启动动画之前,需要将所有帧的数据通过prepareAnimationData准备好。特别的,对于结果的动画渲染,每帧对应一个结果和一个位移结果(如果激活变形渲染),但是结果(或者位移结果)并不能直接用于显示,需要调用XFace或者XEdge的updateViewData接口组装成glDrawArray能直接渲染的视图数据。后处理的动画渲染,一般而言,往往用于显示多个子步同类型结果的云图(可能包含变形)的变化,在这个过程中,模型的几何数据本身不会发生变化,它与非动画模式下的数据基本上一致,所以动画数据的准备在大多数情况下只需要准备变化的数据(即关心的结果变量或变形数据),为了提高显示性能,XT平台将每帧数据组装好之后直接保存为二进制文件,在显示时以二进制形式整块读取动画数据,这样能避免每次切换结果数据并组装视图数据所带来的延迟。