Paging Component

深入探讨PagingComponent与PagedWorld的高效管理机制
本文详细解析了PagingComponent如何通过预定义与动态发现机制管理PagedWorld的新内容,以及PageManager在创建、销毁、加载、保存、获取等操作中的角色。同时,阐述了PagedWorld、PagedWorldSection和PageProvider之间的层次关系与管理策略,特别是多样化的页调度策略和页内容的多类型支持。文章还深入讨论了页切换、页加载、LOD(层次细节)策略及与SceneManager的解耦设计。最后,对比了OgreTerrain在使用PagingComponent时的特殊之处。
  1. Paging Component(PageManager)并不和整个World(PagedWorld)紧密相关,Paging Component可以通过预定义的结构,也可以通过动态发现机制来获取World的新内容。PageManager负责:
    1. 管理所有的PagedWorld(创建,销毁,加载,保存,获取)。PageManager何必实现多种PageWorld支持呢,有点过度设计了。
    2. 管理所有的PageStrategy(添加,销毁,获取),其中的PageStrategy为PagedWorldSection所用。
    3. 管理所有的PageContentCollectionFactory (添加,销毁,获取)
    4. 管理所有的PageContentCollection(创建,销毁,获取)
    5. 管理所有的PageContentFactory(添加,销毁,获取)
    6. 管理所有的PageContent(创建,销毁)
    7. 管理所有的PagedWorldSectionFactory(添加,销毁,获取)
    8. 管理所有的PagedWorldSection(创建,销毁,获取)
    9. 管理PageProvider(设置,获取)
    10. 管理所有的Camera(添加,销毁,获取)
  2. PagedWorld负责管理一组PagedWorldSection(创建,销毁,获取)和管理PageProvider(设置,获取)。一个PagedWorld由多个PagedWorldSection组成。而每个PagedWorldSection都遵从特定的一种PageStrategy。比如一个PagedWorld可以包括一个组织室外的PagedWorldSection和一个组织室内的PagedWorldSection,或者是其他的什么PagedWorldSection。
  3. PagedWorldSection负责管理一组Page和管理PageProvider(设置,获取)和管理PageStrategy(设置,获取),这时候会发现PageManager、PagedWorldSection和PageProvider都管理了PageProvider,其实Paging Component的机制是:在PagedWorldSection获取Page数据的时候,会按照PagedWorldSection->PagedWorld->PageManager的顺序来寻找PageProvider,以获取Page数据(够饶吧?)。每个PagedWorldSection都遵从特定的一种PageStrategy。
  4. 多样化的页调度策略(PageStrategy,PageStrategyData,Grid2DPageStrategy,Grid2DPageStrategyData)
  5. 页调度策略和页内容无关(PageContent,PageContentFactory):是没关系,页调度策略主要是确定Page的Id而已,和Page的内容无关。
  6. 支持各种类型和大小的页(Page,PageData):好理解,实际的Page内容呀,当然支持异步加载。但是注意:Page是由一组PageContentCollection组成的。Page不是加载单元,PageContentCollection才是。
  7. 支持页的LOD(LodPageContentCollection,LodStrategy)。
  8. PageContentCollection和SimplePageContentCollection。PageContentCollection是加载单元,SimplePageContentCollection是PageContentCollection的派生类,采用List组织了一组PageContent,这些PageContent可以是一块地形(但是OgreTerrainPagedWorldSection.h中所说的:因为地形块之间存在的相互关系,不把地形块实现为PageContent更好,这也许就是为什么TerrainPageContent类没有实现的缘故);一些静态几何体,或者其他一些内容。
  9. PageContent的生成时通过PageContentFactory建立。
  10. 页切换和具体的页的类型无关
  11. 页加载(Page的RequestQueue)可以使用单独线程,和Ogre的资源加载形式相同(全线程化和半线程化)
  12. 尽可能和SceneManger无关(SceneManager)

LodPageContentCollection可以用来实现对Page的多步加载。距离远的时候加载部分内容,距离近的时候加载另外部分内容。

Paging Compoent的层次关系和层次命名是:WorldID:WorldSectionID:PageID:PageLODIndex。

总结:非常喜欢这个Paging Component的设计,这正是我想要的东东。尽管它有那么点过度设计。

OgreTerrain在使用Paging Component的时候,并没有完全遵照上面的设计。

  1. TerrainPaging:负责管理SectionFactory和管理TerrainPagedWorldSection(创建),这些本来是由PageManager来管理的。
  2. TerrainPagedWorldSection:负责管理GridStrategy和一个TerrainGroup(而不是一组Page)
  3. TerrainGroup:负责地形加载,使用了TerrainSlot。加载代码参考:TerrainGroup::loadTerrainImpl(TerrainSlot* slot, bool synchronous)
  4. Grid2DPageStrategy::notifyCamera > TerrainPagedWorldSection::loadPage > TerrainGroup::loadTerrain > TerrainGroup::loadTerrainImpl > Terrain::Terrain
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值