2015/11/17 16:00:26 汽车虚拟仿真软件总体优化策略与方法描述

本文工作是针对项目组在“核高基”重大专项支持下研发的汽车三维虚拟仿真软件系统。本章主要以汽车虚拟仿真软件在整体操控和实施设计等方面的具体优化。偏重于技术本身。可以作为汽车虚拟仿真软件教学方面研究的重要依据。这也是益教教育汽车虚拟仿真软件在中职院校中受欢迎的原因之一。

该汽车虚拟仿真软件系统基于OGRE 渲染引擎开发,主要模拟不同汽车在不同环境、不同路面条件下的 ABS 功能、平顺性、稳定性测试,并真实反映制动过程中车体的运动状态。由于该系统的结构复杂,而目前基于多核平台的并行渲染系统还处于探索阶段,现有多线程并行优化方法不能全面地体现仿真系统的优化效果。

 现有的多帧渲染并行优化方法在渲染阶段并没有对渲染层面进行过多的并行处理,这导致渲染状态的频繁切换,对复杂场景无明显的优化。渲染帧的线程级并行优化方法在逻辑帧的迭代运算处理时,并没运用策略调度和线程数量的控制,对于场景组织简单的实例,Direct X API 延迟线程的创建以及事件信号的发送和等待的时间开销占据绝大部分,使得优化后效果并不理想,甚至下降。基于核数的线程设置方法得到的并非最优线程数,在并行优化时没有提出相应的策略调度来保证负载平衡。

由于汽车虚拟仿真软件系统这类复杂的图形应用程序对渲染引擎各方面性能有较高要求,上述方法不能全面体现仿真系统渲染的优化效果。

汽车虚拟仿真软件系统运行过程中,场景与资源的加载、车体信息与视口的更新、汽车运行状态的渲染,分别对应引擎渲染过程中的初始化阶段、逻辑运算阶段和渲染阶段。根据系统运行过程以及渲染引擎绘制过程,本文的总体优化方案如图。

汽车虚拟仿真软件总体优化图

主要的优化策略和方法包括: ①针对在初始化阶段实体结点依赖性最小,无依赖函数之间不存在线程同步与数据竞争的特点,采用 Open MP 中的sections 方法,对无依赖函数并行处理,完成场景组织和资源加载的优化。同时,采用动态设置最优线程数量的方法来提升渲染效率;

②针对车体各部分信息与视口更新时的大量迭代计算,在逻辑运算阶段,采用策略调度使迭代计算的线程达到负载均衡,以便获得更高的执行效率;

③针对多帧渲染和渲染帧线程级并行优化对不同场景渲染优化片面性的缺陷,在渲染阶段采用渲染帧并行绘制的方法来保证对具有不同复杂度的场景的绘制效率。

汽车虚拟仿真软件优化方法设计与实施

1:初始化阶段的并行优化

在汽车虚拟仿真软件中,通常使用加速比Sp( n) = ts( n) /tp( n) 评估并行性能,其中,ts( n) 为串行算法的运行时间; tp( n) 为并行算法的运行时间。

该指标反映了并行性对运行时间的改进程度。

多线程并行优化时,并发执行的线程可能发生数据竞争,性能的提升取决于系统中并行任务数量的多少以及任务的规模变化情况。假设有锁保护的串行化时间为 1,可并行化部分在单核 CPU 上的运行时间为 t,CPU 的个数为 n,那么在 n 个对等任务同时运行情况下,总等待时间为 1 + 2 + … + n =n·( n - 1) /2,耗时最多的一个任务所用时间为 n +t / n,加速比为Sp( n) = ( t + 1) /( n + t/n) = n( t + 1) /( n2+ t)( 1)从公式( 1) 看出,随着线程数量增加,若线程开销超过一定范围,会使系统性能下降。

在设置线程数量时,需要根据系统能力、应用程序的并行需求选择合适的线程数量,达到性能最优。因此,在仿真系统首次运行之前,要计算出最优线程数。

具体算法步骤描述如下。

步骤 1 定义 Thead Flag,表示是否得到最优线程数量; 定义 nthreads,表示最优线程数;步骤 2 若 Thead Flag = True,读取 nthreads 覆盖环境变量 OMP_NUM_THREADS 的值,转步骤 7;

步骤 3 若 Thead Flag = False,获取 CPU 核数 p,p × 2n为当前线程数量;

步骤 4 计算 n = 0 时,模拟粒子势能计算,的时间 tn;

步骤 5  n = n + 1 计算此时 tn + 1;

步骤 6 若 tn + 1> tn,取 p × 2n为最优线程数量;否则,重复步骤 5;步骤 7

利用 omp_set_num_threads( nthreads)函数自动设置线程数量。算法结束。根据最优线程数量,以汽车虚拟仿真软件平台中初始化为例,利用 Open MP的 sections 命令定义一个区块,用 section 命令将此区块划分为不同的并行段。

  逻辑阶段的并行优化

系统渲染过程中,逻辑帧的生成将消耗大量的时间来完成大量的循环迭代运算。因此,逻辑帧的生成速度是影响渲染系统效率的重要因子。

通过对循环迭代运算的并行优化,在保证帧之间相关性的前提下,对逻辑帧“并行”生成,则逻辑帧的生成速率会大大提高,可以提升 CPU 利用率并减少渲染帧的等待时间,提高渲染效率。在多线程并行优化设计时,线程的负载平衡对整体性能影响很大,对循环迭代做有效的调度策略来确保负载平衡,能保证多个处理器内核大部分时间里都保持工作状态。逻辑帧的生成过程中,每一帧的循环体大小以及循环迭代的规模并不确定,线程数定义为 p,在动态调度的实现过程中,对于循环迭代数为 I 的循环结构,第 i 次调度的任务块大小定义为 Ci,剩下的循环迭代数为 Ri。R0= I,Ci= f( Ri -1,p) ,Ri= Ri -1- Ci( 2)公式( 2) 中函数 f 中的参数依据具体的问题场景可能有所不同。

此时的负载不均衡依赖于各个线程执行时间 tj( j = 1,…,p) 之间的最大差距。因此,在对系统渲染过程中的迭代循环进行优化时,要遵循如下的选取原则。

1) 设置数据保护,避免与渲染线程的同步

2) 采用适当的线程调度策略,以保证线程负载平衡;

3) 要尽量选择迭代次数较多内部结构简单的循环,减少时间开销;

4) 要尽量选取最外层循环,以便实现最大程度的多线程优化,提高优化效率;

渲染阶段的并行优化

在渲染过程中,场景管理器通过计算当前帧中所有可见实体对象,并将其按顺序排列,由此组成渲染队列。

渲染队列是渲染阶段确保绘制流程和提高绘制效率的关键。在渲染队列中,根据传入的对象和自身的配置按照一定规则将可视实体划分为多个优先级,优先级高的实体先于优先级低的实体绘制,通过各个实体的优先级序列,确保正确的渲染流程。

具有相同优先级的实体则依照渲染对象与摄像机的距离或者通路( pass) ,再次细分绘制顺序。

将可视距离相同的实体和具有相同通路的物体放在一起进行绘制,可保证绘制的连续性,减少渲染状态的切换。

场景管理器为渲染队列中的对象分配索引编号,根据索引编号的不同,将背景、场景和界面划分开,再对渲染队列中物体逐个进行渲染。

根据渲染队列的绘制特点,为有效解决多帧渲染导致的数据竞争和同步问题,本文对所有可见对象进行多线程同步并行渲染。在多帧渲染优化方案的基础上,将渲染循环分成信息获取和执行绘制 2个阶段。

在信息获取阶段通过统计所有可见的静态几何体、场景实体以及通路的个数。

若场景实体数大于最大通路数,将天空体、用户界面和场景实体放入不同的子线程中并行获取绘制信息。

在执行绘制阶段,则通过主线程的调用,最后,执行所有通路相同线程的并行绘制; 否则,按通路排序和可视距离直接绘制实体。

这样可实现渲染帧的多线程同步执行,解决复杂场景和简单场景的优化效率。实现原理如图 2 所示。

汽车虚拟仿真软件渲染图

汽车虚拟仿真软件系统优化结果

根据本系统对于汽车侧滑、翻滚、甩尾等动作体现力较强的需求,要同时对车体的正面、侧面、各轮子进行观察,记录其运动状态以及参数。由此,采用多视口窗体,将每个视口对应车体各个需要观察运动状态的部分,每个部分在一个独立的线程上完成。

多线程并行渲染的方式能大大提高图形应用程序的性能。本文采用了一种基于 Open MP 多线程并行渲染优化方案,对基于 OGRE 渲染引擎的汽车三维虚拟仿真系统进行并行渲染优化。该方案能有效提高 OGRE 渲染引擎的性能、汽车虚拟仿真软件系统的渲染效率和 CPU 利用率,对于线程级并行方法在图形渲染系统中的研究具有一定参考价值。

更多关于数字化校园虚拟仿真软件系统的内容请你关注http://www.yijiaoedu.com


 
QQ在线咨询
销售热线
0371-53302651