的笔记

随时随地编辑

Page系统设计思想

Page系统设计思想

Steve Streeting
Page系统作为Ogre(1.7.2)的核心组件,其设计理念如下:

 

1.         勿须假定Page系统明确了解世界,世界的新的组成部分不仅具备可以被用于动态加载定义好的数据的特性,还必须有被动态"发现\探索到"的特性.

:对原有的世界必须也有个改进,让其具备一定被动态发现的特性.

2.         允许多策略决定页面的生命周期---乌鸦飞行距离路线案例就是一个很好的印证[1],但我们也必须允许其他策略(尤其是在密集的、闭塞的场景中,它可能是连通或闭塞的区域状态)的存在.

3.         将分页策略(Paging Strategy)和分页内容当做一个正交概念对待,亦即你可以用多种方式混合和匹配组合它们.

4.         勿须假定分页是规则的尺寸,或者分页占据独特的、非重叠的空间区域。

5.         支持设置多种多样结构的分页。可以是网格的地形,也可以是岩洞结构的'蛇型'区域。

6.         页面之间的过渡不能有具体类型相关的细节信息,关键是需要支持各种不同的场景的过渡,例如从洞穴结构到二维地形再到空旷空间。

7.         可以在一个独立线程中完成分页的加载,不管是在全线程或半线程下都可以用相同的形式将资源作为可用资源来使用[2]

8.         分页应该在物理内容变化的时候支持多重LODs。分页中的内容可以有自己的LOD,但我们也应该允许物理内容在更高级别上也可以发生变化。

9.         现在还不支持分页坐标系。为了配合大世界的精细处理,可以使用双精度坐标系和与摄像机相关的渲染方法。页面相关的坐标系需要一个较大的代码变动,主席肯定不允许冒这么大的风险把这差事给我这大把年纪的程序猿去做滴,那就预留给以后的版本完成。

10.     总的来说,对分页系统的支持不能过分要求场景管理器有太多改动,公主泽肯定会不高兴滴,那这些就保留到2.0版的时候再搞吧。

 

PageManager(页面管理器)

       主要作用是提供PageStrategyPageContentFactory这样的扩展类的一个中心注册入口,同是也是访问当前加载的世界分页(PagedWorld)的地方。我还没有决定是将其挂在核心的Root下还是让它作为一个独立库让使用者引用。

 

PagedWorld(世界分页)

       这个基本上是整个结构中的数据驱动部分。一个PagedWorld是世界中内容的集合,可以从文件中加载或在代码中定义。最重要的是,它不需要创建其中的全部东西---顶多需要创建一个分页世界区域(PagedWorldSections),并且可以在定义了“重生点”的情况下选择性的创建一个分页入口点(PageEntryPoints,在出现不可能简单获的从一个相机的世界位置加载分页需要的数据源的情况下,这点非常重要)。 用这种适当的方式,请求就能动态的加载余下需要的部分。

 

PagedWorldSection(世界分页区域)

       这是世界的一个组成区域,它符合特定的分页策略。例如,室外2D地形区域(这里的'地形'我的意思是:它在结构上是2D的,而不是指它定义了地形的内容)可能会使用一个策略,并被限定使用一种方式;室外的天空区域可能使用另一种策略,一个复杂的室内区域可能使用再另一种策略。这里只需要掌握一个高层次的描述---世界的区域编号(section id)、通用边界信息以及可选的入口点(仅仅包含一个坐标和一个页面标识符 ---在策略缺失而通过上下文无法将坐标点直接转换成一个分页的情况下尤为重要)

注:Section这里指组成某个整体的一部分区域。Space这里指地形上的天空,不是天空盒。

 

PageStrategy(分页策略)

       这个类是负责决定如何加载和清除分页,并且可以选选择仅从世界位置获得一个分页(和一个PagedWorldSection)。每当摄像机移动的时候,PageStrategy负责决定如何响应一个在世界分页区域(PagedWorldSection)中的页面请求。它可能是一个网格系统,这个时候它可能使用页面之间的关联性来确定遍历的深度。无论如何,只要给定了一个世界统一坐标、一个存在的分页或一个分页入口点(PageEntry point),这个策略就必须能够决定哪些分页必须被请求、哪些分页必须被抛弃。分页策略(PageStrategy)被设计成具备用户可扩展性。

 

Page(页面)

这个类聚合了一个数据页的所有表述。它虽然定义了页面,但实际上不包含其自身的任何数据。相反,它只是包含了一个LOD levels的列表和一个LOD策略的引用。每个分页在世界区域里都有一个唯一的ID

 

PageLOD(页面层级)

       这个是为了在需要的情况下让页面内容不止一次加载完。例如,您可能想要一个分多个阶段加载的分页,其中包括最基本的内容与一个距离相关的非常简单的定义,然后是包括靠近的时候更多细节的定义。我打算重用可插拔的LodStrategy类来表现这些转换规则(transition rules)。

        现在定义我们页面加载中所需单位化的特殊标记:“世界ID:世界区域ID:分页ID:分页层级索引 (WorldIDWorldSectionIDPAGEIDPageLODIndex)”。我可能会在一个适当的地方放置一个可插拔的转换系统,这样就可以运用这些数字,并将其转换成一个独特的资源来加载---这个资源可能简单到是一个文件(“myworld_sec1_p1234_0.dat”),或者可以转换成一个现成的已打包好的资源文件或类似东西中的一个偏移量。

 

PageContent(页面内容)

       虽然PageLOD是加载的单位量,但是你可能还想要包含多种不同类型的内容。例如,在一个分页中你可能有一块地形、一些静态几何体、一些自定义的用户数据(如触发区域,世界中的物体等)。因此使用了PageLOD你就可以有多个PageContent实例,它们都被放在一起加载,但每一个实例都会有自定义数据格式和同样的套路用于将其在线获取。在加载时,它们都将被工厂系统实例化,而这个工厂系统则基于名字加载器来实现的。

 

       这些不同类型的页面内容(PageContent)中的每一种也都可以自由地做他们自己的LOD版本的事情。例如,如果某个内容包括了创建一些实体的实例并且它们是使用了LOD的网格,那么这个情况下将仍然提出申请。对于地形,每个分页都有它自己的细分(subdivisions)与LOD,但其前提是这是一个基于内存的LOD,适合于轻量级的动态调整,而更高级别的PageLOD则更重量级并在实际上改变页面内容、造成内存占用(memory footprint)的变化等(也同样被潜在的执行了)。这就是为什么存在两种类型的LOD的原因,它们并非互相重复。页面内容(PageContent)和页面内容工厂(PageContentFactory)都被设计成具备用户可扩展性。

 

Phew(玛雅)

       玛雅,好吧,这是我有生以来写出的内容最多的帖子之一。我希望一切看起来都很好---不过它仍然不够精炼,因此没有任何内容是一成不变的,但我已经花了相当多的时间来思考整体架构、我要支持什么样的功能以及扩展点在哪里,所以我很高兴为公主泽做了这么多。欢迎评论!

 

Steve Streeting

Tue Mar 03, 2009 7:39 pm



[1] 一个著名的策略分析案例,指乌鸦飞行路线有一定随机性,可能很远,可能很近.

[2] with the same modes as available for resources

posted on 2013-04-14 11:27 的笔记 阅读(2946) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理