Paging Component

来源:互联网 发布:js删除数组中重复元素 编辑:程序博客网 时间:2024/05/26 17:43
  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
原创粉丝点击