一种面向大规模森林仿真的生长模型的调度方法

摘要:

一种面向大规模森林仿真的生长模型的调度方法,包括以下步骤:1)按照仿真目标获取大规模森林场景的仿真数据,对仿真数据的数据结构进行初始化,不包含树木信息的场景信息数据采用四叉树的方式进行存储;树木信息数据采用内存池技术进行存储;2)进行大规模森林场景进行树木生长模型计算时,以场景分块为单位,遍历所有场景分块,并对每个场景分块内的树木生长计算;3)根据大规模森林场景中树木生长模型计算结果,进行大规模森林场景的可视化,并保存大规模森林场景中树木生长模型的计算结果。本发明提供一种实时性良好、加速计算过程、场景可视化较流畅的面向大规模森林仿真的生长模型的调度方法。

申请号: CN201210111048.0 专利名称: 一种面向大规模森林仿真的生长模型的调度方法 申请(专利权)人: [浙江工业大学] 发明人: [范菁, 苏中原, 董天阳, 范允易] 其他信息:

1.一种面向大规模森林仿真的生长模型的调度方法,其特征在于:所 述调度方法包括以下步骤:

1)按照仿真目标获取大规模森林场景的仿真数据,对仿真数据的数据 结构进行初始化,不包含树木信息的场景信息数据采用四叉树的方式 进行存储;树木信息数据采用内存池技术进行存储;

2)对大规模森林场景进行树木生长模型计算时,以场景分块为单位, 遍历所有场景分块,并对每个场景分块内的树木生长计算,树木生长 计算的具体步骤如下:

A.在场景中确定当前要计算的树木,并根据当前计算树木的属性 计算树木的影响圈范围,然后,根据影响圈范围,计算相关的仿真参 数,并通过遍历整个场景树木寻找与当前计算树木相关的树木;

B.在得到相关树木之后,需要将这些树木的属性信息数据全部调 度到内存中,采用森林生长仿真的调度策略对生长计算过程中的内外 存数据进行调度;

C.生长模型求解:当前计算所需要的数据全部调入内存之后,对 生长方程求解,计算出最后的结果;

3)根据大规模森林场景中树木生长模型计算结果,进行大规模森林场 景的可视化,并保存大规模森林场景中树木生长模型的计算结果。

2.如权利要求1所述的面向大规模森林仿真的生长模型的调度方法, 其特征在于:所述步骤B中,所述森林生长仿真的调度策略包括利用 绘制线程和数据调度线程对内外存数据进行调度;

当用户视点发生变化时,绘制线程根据当前视点计算出当前的可 见区域,同时对内存中的场景数据进行判断,确认场景重新绘制所需 要的数据是否已经在内存中,如果是则直接进行场景的绘制并向数据 预取线程发送视点更新消息;如果当前需要绘制的场景不在内存中, 绘制线程则需要根据当前视点的位置、当前视点的方向视点信息对可 见区域内进行计算;在计算完成后,绘制线程挂起并向数据调度发送 数据请求消息,由数据调度线程从外存中调入场景数据后在继续进行 绘制;

数据调度线程负责从外存中调度数据,通过分析绘制线程传递过 来的消息,判断具体需要调度数据的内容,如当前场景绘制数据、场 景预取数据或场景计算数据,同时从内存中删除部分场景数据;

当数据调度线程接收到绘制线程发来的场景数据请求消息时,进 行直接调度,此时调度线程根据消息直接从外存中调度绘制线程所需 要的数据,此时的数据调度优先级最高;

当数据调度线程接收到绘制线程发来的新视点坐标信息时,说明 当前场景绘制的场景数据都已经在内存,绘制线程已经进入绘制操作; 这时,数据调度线程的主要工作则是根据新视点的数据来判断下一次 绘制可能用到的数据,并将这些数据调度到内存中;当接收到绘制线 程发出的视点的信息后,数据调度线程根据视点信息更新视点视域, 计算需要预取的区域并判断预取区域所对应的LOD层次;预取区域 场景块的编号根据可见区域的编号直接计算得出;在计算出所有预取 区域的场景块之后,由于数据预取时间必须小于场景绘制时间,所以 需要对这些场景块的调度优先级进行分类,判断的依据主要是前一刻 视点的前进方向;

根据场景块与视点运动方向的夹角大小将预取区域分为三个优先 级,场景块i优先级Ki如式(1):


其中,Ki表示场景块i的优先级;θi表示场景块与视点运动方向 的夹角;R表示预取区域场景块的集合;

在将预取数据调度到内存中时,需要从内存中删除相应大小的场 景数据,选择LRU策略来选择删除的场景块。

3.如权利要求1或2所述的面向大规模森林仿真的生长模型的调度方 法,其特征在于:所述步骤1)中,以场景链表为索引,树木信息存 储在MemoryBlock中,场景链表中的每个场景块可能拥有多个 MemoryData来存储块内的树木信息,同时对MemoryData中的树木进 行排序,以加快后面相关树木的搜索。

一种面向大规模森林仿真的生长模型的调度方法

技术领域

本发明涉及计算机虚拟仿真技术,尤其是一种大规模森林仿真的 生长模型的调度方法。

背景技术

计算机虚拟仿真技术改变了传统的林业经营管理模式,使人们能 够通过计算机来预测树木生长状况。根据特定的条件动态模拟森林场 景的变化,可以使林业管理决策者能够做出更科学的经营管理决策。 但是,对于大规模森林场景的模拟仿真,其场景数据量非常巨大(包 括树木信息数据,地形数据等)。例如对5km*5km区域内的树木进行 生长仿真,植物生长模型计算所需要的树木信息大概在1.6-2G的数 据量,场景绘制常使用LOD技术,对于距离视点较近的地方采用精 细的三维模型进行绘制,较远处采用简化模型或利用Billboard技术 使用纹理贴图,所需要的内存量大致为2G左右的数据量。如果直接 将这些数据调入计算机中进行生长模型计算和仿真绘制,以目前的硬 件性能将无法实现植物生长过程的快速仿真。因此,在进行森林场景 模拟仿真之前需要对原始的场景数据进行预先处理,在仿真过程中采 用合理的调度策略对生长模型计算进行调度和优化,从而使得大规模 森林场景的仿真能够更加快速。

发明内容

为了克服已有森林场景模拟仿真的实时性较差、计算过程较长、 场景可视化较不流畅的不足,本发明提供一种实时性良好、减少计算 过程的时间、场景可视化较流畅的面向大规模森林仿真的生长模型的 调度方法。

本发明解决其技术问题所采用的技术方案是:

一种面向大规模森林仿真的生长模型的调度方法,所述调度方法 包括以下步骤:

1)按照仿真目标获取大规模森林场景的仿真数据,对仿真数据的数据 结构进行初始化,不包含树木信息的场景信息数据采用四叉树的方式 进行存储;树木信息数据采用内存池技术进行存储;

2)进行大规模森林场景进行树木生长模型计算时,以场景分块为单位, 遍历所有场景分块,并对每个场景分块内的树木生长计算,树木生长 计算的具体步骤如下:

A.在场景中确定当前要计算树木,并根据当前计算树木的属性计 算树木的影响圈范围,然后,根据影响圈范围,计算相关的仿真参数, 并通过遍历整个场景树木寻找与当前计算树木相关的树木;

B.再得到相关树木之后,需要将这些树木的属性信息数据全部调 度到内存中,采用森林生长仿真的调度策略对生长计算过程中的内外 存数据进行调度;

C.生长模型求解:当前计算所需要的数据全部调入内存中之后, 对生长方程的求解,计算出最后的结果;

3)根据大规模森林场景中树木生长模型计算结果,进行大规模森林场 景的可视化,并保存大规模森林场景中树木生长模型的计算结果。

进一步,所述步骤B中,所述森林生长仿真的调度策略包括绘制 线程和调度线程;

当用户视点发生变化时,绘制线程根据当前视点计算出当前的可 见区域,同时对内存中的场景数据进行判断,确认场景重新绘制所需 要的数据是否已经在内存中,如果是则直接进行场景的绘制并向数据 预取线程发送视点更新消息;如果当前需要绘制的场景不在内存中, 绘制线程则需要根据当前视点的位置、当前视点的方向等视点信息对 可见区域内进行计算;在计算完成后,绘制线程挂起并向数据调度发 送数据请求消息,由数据调度线程从外存中调入场景数据后在继续进 行绘制;

数据调度线程负责从外存中调度数据,通过分析绘制线程传递过 来的消息,判断具体需要调度数据的内容,如当前场景绘制数据、场 景预取数据或场景计算数据等,同时从内存中删除部分场景数据;

当数据调度线程接收到绘制线程发来的场景数据请求消息时,进 行直接调度,此时调度线程根据消息直接从外存中调度绘制线程所需 要的数据,此时的数据调度优先级最高;

当数据调度线程接收到绘制线程发来的新视点坐标信息时,说明 当前场景绘制的场景数据都已经在内存,绘制线程已经进入绘制操作; 这时,数据调度线程的主要工作则是根据新视点的数据来判断下一次 绘制可能用到的数据,并将这些数据调度到内存中;当接收到绘制线 程发出的视点的信息后,数据调度线程根据视点信息更新视点视域, 计算需要预取的区域并判断预取区域所对应的LOD层次;预取区域 场景块的编号根据可见区域的编号直接计算得出;在计算出所有预取 区域的场景块之后,由于数据预取时间必须小于场景绘制时间,所以 需要对这些场景块的调度优先级进行分类,判断的依据主要是前一刻 视点的前进方向;

根据场景块与视点运动方向的夹角大小将预取区域分为三个优先 级,场景块i优先级Ki如式(1):

其中,Ki表示场景块i的优先级;θi表示场景块与视点运动方向 的夹角;R表示预取区域场景块的集合;

在将预取数据调度到内存中时,需要从内存中删除相应大小的场 景数据,选择LRU策略来选择删除的场景块。

再进一步,所述步骤1)中,以场景链表为索引,树木信息存储 在MemoryBlock中,场景链表中的每个场景块可能拥有多个 MemoryData来存储块内的树木信息,同时对MemoryData中的树木进 行排序,以加快后面相关树木的搜索。

本发明的有益效果主要表现在:(1)通过分析森林整体动态演变 的全林分级仿真、植物间相互作用的林分级仿真和单株树木动态生长 情况的单木级仿真的信息特点,对场景外存数据结构进行设计组织, 并对地形、地物(非树木地物)、纹理数据进行分割,对三者建立相互 关联的索引及外存存储结构,使得仿真计算时数据读取速度更快;

(2)根据粗粒度场景动态演变模型、中粒度植物间相互作用模型、细 粒度树木个体动态生长模型的求解过程中相对耗时的步骤,对场景数 据在内存中的存储进行设计组织,以减少森林场景模型计算过程的时 间;

(3)针对大规模森林场景生长模型求解以及生长结果可视化时无法一 次性将场景数据调入到内存的问题,在生长模型求解及可视化过程中 内外存数据调度方法进行优化,包括对粗粒度、中粒度和细粒度场景 生长模型计算和仿真时的调度优化,使得最后场景可视化更加流畅。

附图说明

图1是场景数据内存组织结构示意图。

图2是场景数据在内存中的存储结构示意图。

图3是场景多线程调度的示意图。

图4是LOD层次模型选择的示意图。

图5是场景绘制数据预取的示意图。

具体实施方式

下面结合附图对本发明作进一步描述。

参照图1~图5,一种面向大规模森林仿真的生长模型的调度方 法,按照仿真目标获取大规模森林场景的仿真数据,并存储在计算机 内存中,然后根据大规模森林场景数据在仿真过程的调度方式的不同 分别对数据结构(内外存中的存储结构)进行初始化,如图1所示。

在计算机内存中,对于场景信息数据(不包含树木信息),我们根 据地形的四叉树分割采用四叉树的方式进行存储。

对于树木信息数据,考虑到在计算过程中需要对内存中的数据进 行比较频繁的删除和存储,采用内存池技术进行存储,如图2所示。

在内存中,以场景链表为索引,树木信息存储在MemoryBlock中, 场景链表中的每个场景块可能拥有多个MemoryData来存储块内的树 木信息。同时对MemoryData中的树木进行排序,以加快后面相关树木 的搜索。

2.对大规模森林场景进行树木生长模型的计算,获取场景中的每 棵树木进行相互作用计算的结果。

进行大规模森林场景进行树木生长模型计算时,以场景分块为单 位,遍历所有场景分块,并对每个场景分块内的树木生长计算。树木 生长计算的具体步骤如下:

A.在场景中确定当前要计算树木,并根据当前计算树木的属性计 算树木的影响圈范围,然后,根据影响圈范围,计算相关的仿真参数, 并通过遍历整个场景树木寻找与当前计算树木相关的树木。

B.再得到相关树木之后,需要将这些树木的属性信息数据全部调 度到内存中,以便后续在对当前树木进行生长计算时可以快速的使用。 但是,由于计算机内存大小有限,可能会导致无法一次性将所有的树 木数据全部调度到内存中,因此在计算过程中可能会出现需要进行内 外存数据调度的情况。为了能够充分的利用计算机资源,采用森林生 长仿真的调度策略对生长计算过程中的内外存数据进行调度。

根据不同的功能将线程分为绘制线程和数据调度线程两类。当视 点发生变化时,场景的渲染和数据调入可以同时工作,以提高场景的 绘制效率。在场景绘制过程中,CPU主要负责可见区域的计算、场景 生物量计算以及场景模型LOD层次的判断,场景的绘制工作则是由图 形处理器来执行。所以当CPU把处理过的场景数据交给图形处理器绘 制后,这时的CPU将处于空闲状态,可以利用这段空闲时间来调度场 景数据。图3为多线程工作模型。

(1)绘制线程

绘制线程主要功能是根据视点信息计算出当前场景的可见区域并 判断可见区域的绘制数据是否在内存中并向数据调度线程发送预取消 息。

当用户视点发生变化时,绘制线程根据当前视点计算出当前的可 见区域,同时对内存中的场景数据进行判断,确认场景重新绘制所需 要的数据是否已经在内存中,如果是则直接进行场景的绘制并向数据 预取线程发送视点更新消息。如果当前需要绘制的场景不在内存中, 绘制线程则需要根据当前视点的位置、当前视点的方向等视点信息对 可见区域内进行计算。在计算完成后,绘制线程挂起并向数据调度发 送数据请求消息,由数据调度线程从外存中调入场景数据后在继续进 行绘制。如图4所示,图中LODO为精细的植物三维模型、LOD1为简 化后的植物三维模型、LOD2则采用Billboard技术直接使用纹理贴图。

(2)调度线程

数据调度线程的工作主要是负责从外存中调度数据,通过分析绘 制线程传递过来的消息,判断具体需要调度数据的内容,如当前场景 绘制数据、场景预取数据或场景计算数据等,同时从内存中删除部分 场景数据。

当数据调度线程接收到绘制线程发来的场景数据请求消息时,说 明需要绘制的场景数据并不完全在内存中,需要进行直接调度。这时 调度线程根据消息直接从外存中调度绘制线程所需要的数据,此时的 数据调度优先级最高。

当数据调度线程接收到绘制线程发来的新视点坐标信息时,说明 当前场景绘制的场景数据都已经在内存,绘制线程已经进入绘制操作。 这时,数据调度线程的主要工作则是根据新视点的数据来判断下一次 绘制可能用到的数据,并将这些数据调度到内存中。如图5所示,场 景块A为当前视点所在位置,白色区域为当前可见区域,即当前需要 绘制的区域,区域B、C、D则是预取区域。当接收到绘制线程发出的 视点的信息后(坐标和方向),数据调度线程根据视点信息更新视点视 域,计算需要预取的区域并判断预取区域所对应的LOD层次。预取区 域场景块的编号可以根据可见区域的编号直接计算得出。在计算出所 有预取区域的场景块之后,由于每次数据预取存在时间的限制(数据预 取时间必须小于场景绘制时间),所以需要对这些场景块的调度优先级 进行分类,判断的依据主要是前一刻视点的前进方向。

根据场景块与视点运动方向的夹角大小将预取区域分为三个优先 级。如图4所示,箭头表示视点前一时刻的运动方向,预取区域B标 记为高优先级(其优先级依然地域当前场景块的数据优先级),预取区 域C标记为中优先级,预取区域D则标记为低优先级。场景块i优先 级Ki如式(1):

其中,Ki表示场景块i的优先级;θi表示场景块与视点运动方向 的夹角;R表示预取区域场景块的集合。

在将预取数据调度到内存中时,需要从内存中删除相应大小的场 景数据,本文选择LRU(least recently used)策略来选择删除的场景 块。

C.生长模型求解。单前计算所需要的数据全部调入内存中之后, 对生长方程的求解,计算出最后的结果。

3.根据大规模森林场景中树木生长模型计算结果,进行大规模森 林场景的可视化,并保存大规模森林场景中树木生长模型的计算结果。

下面结合附图对本发明作进一步描述。

参照图1~图5,一种面向大规模森林仿真的生长模型的调度方 法,按照仿真目标获取大规模森林场景的仿真数据,并存储在计算机 内存中,然后根据大规模森林场景数据在仿真过程的调度方式的不同 分别对数据结构(内外存中的存储结构)进行初始化,如图1所示。

在计算机内存中,对于场景信息数据(不包含树木信息),我们根 据地形的四叉树分割采用四叉树的方式进行存储。

对于树木信息数据,考虑到在计算过程中需要对内存中的数据进 行比较频繁的删除和存储,采用内存池技术进行存储,如图2所示。

在内存中,以场景链表为索引,树木信息存储在MemoryBlock中, 场景链表中的每个场景块可能拥有多个MemoryData来存储块内的树 木信息。同时对MemoryData中的树木进行排序,以加快后面相关树木 的搜索。

2.对大规模森林场景进行树木生长模型的计算,获取场景中的每 棵树木进行相互作用计算的结果。

进行大规模森林场景进行树木生长模型计算时,以场景分块为单 位,遍历所有场景分块,并对每个场景分块内的树木生长计算。树木 生长计算的具体步骤如下:

A.在场景中确定当前要计算树木,并根据当前计算树木的属性计 算树木的影响圈范围,然后,根据影响圈范围,计算相关的仿真参数, 并通过遍历整个场景树木寻找与当前计算树木相关的树木。

B.再得到相关树木之后,需要将这些树木的属性信息数据全部调 度到内存中,以便后续在对当前树木进行生长计算时可以快速的使用。 但是,由于计算机内存大小有限,可能会导致无法一次性将所有的树 木数据全部调度到内存中,因此在计算过程中可能会出现需要进行内 外存数据调度的情况。为了能够充分的利用计算机资源,采用森林生 长仿真的调度策略对生长计算过程中的内外存数据进行调度。

根据不同的功能将线程分为绘制线程和数据调度线程两类。当视 点发生变化时,场景的渲染和数据调入可以同时工作,以提高场景的 绘制效率。在场景绘制过程中,CPU主要负责可见区域的计算、场景 生物量计算以及场景模型LOD层次的判断,场景的绘制工作则是由图 形处理器来执行。所以当CPU把处理过的场景数据交给图形处理器绘 制后,这时的CPU将处于空闲状态,可以利用这段空闲时间来调度场 景数据。图3为多线程工作模型。

(1)绘制线程

绘制线程主要功能是根据视点信息计算出当前场景的可见区域并 判断可见区域的绘制数据是否在内存中并向数据调度线程发送预取消 息。

当用户视点发生变化时,绘制线程根据当前视点计算出当前的可 见区域,同时对内存中的场景数据进行判断,确认场景重新绘制所需 要的数据是否已经在内存中,如果是则直接进行场景的绘制并向数据 预取线程发送视点更新消息。如果当前需要绘制的场景不在内存中, 绘制线程则需要根据当前视点的位置、当前视点的方向等视点信息对 可见区域内进行计算。在计算完成后,绘制线程挂起并向数据调度发 送数据请求消息,由数据调度线程从外存中调入场景数据后在继续进 行绘制。如图4所示,图中LODO为精细的植物三维模型、LOD1为简 化后的植物三维模型、LOD2则采用Billboard技术直接使用纹理贴图。

(2)调度线程

数据调度线程的工作主要是负责从外存中调度数据,通过分析绘 制线程传递过来的消息,判断具体需要调度数据的内容,如当前场景 绘制数据、场景预取数据或场景计算数据等,同时从内存中删除部分 场景数据。

当数据调度线程接收到绘制线程发来的场景数据请求消息时,说 明需要绘制的场景数据并不完全在内存中,需要进行直接调度。这时 调度线程根据消息直接从外存中调度绘制线程所需要的数据,此时的 数据调度优先级最高。

当数据调度线程接收到绘制线程发来的新视点坐标信息时,说明 当前场景绘制的场景数据都已经在内存,绘制线程已经进入绘制操作。 这时,数据调度线程的主要工作则是根据新视点的数据来判断下一次 绘制可能用到的数据,并将这些数据调度到内存中。如图5所示,场 景块A为当前视点所在位置,白色区域为当前可见区域,即当前需要 绘制的区域,区域B、C、D则是预取区域。当接收到绘制线程发出的 视点的信息后(坐标和方向),数据调度线程根据视点信息更新视点视 域,计算需要预取的区域并判断预取区域所对应的LOD层次。预取区 域场景块的编号可以根据可见区域的编号直接计算得出。在计算出所 有预取区域的场景块之后,由于每次数据预取存在时间的限制(数据预 取时间必须小于场景绘制时间),所以需要对这些场景块的调度优先级 进行分类,判断的依据主要是前一刻视点的前进方向。

根据场景块与视点运动方向的夹角大小将预取区域分为三个优先 级。如图4所示,箭头表示视点前一时刻的运动方向,预取区域B标 记为高优先级(其优先级依然地域当前场景块的数据优先级),预取区 域C标记为中优先级,预取区域D则标记为低优先级。场景块i优先 级Ki如式(1):


其中,Ki表示场景块i的优先级;θi表示场景块与视点运动方向 的夹角;R表示预取区域场景块的集合。

在将预取数据调度到内存中时,需要从内存中删除相应大小的场 景数据,本文选择LRU(least recently used)策略来选择删除的场景 块。

C.生长模型求解。单前计算所需要的数据全部调入内存中之后, 对生长方程的求解,计算出最后的结果。

3.根据大规模森林场景中树木生长模型计算结果,进行大规模森 林场景的可视化,并保存大规模森林场景中树木生长模型的计算结果。

个性化你的检索平台
使用键盘键 进行切换

© Copyright  2017  江苏佰腾科技有限公司  版权所有  |

苏ICP备09077504号  

 苏公网安备 32041202001279号

系统日志

数据更新

 建议使用Chrome、360浏览器

联系我们
群号:580132322
客服-小倩
3326349102
客服-柠檬味の草
190306821
意见反馈