索引缓存和顶点缓存
索引缓存和顶点缓存资源在例子引擎中使用得非常频繁,并且把他们作为独立资源是很有用的。对我们引擎的大部分数据来说,在那些传统模型不提供索引和顶点缓存的时候保留他们然后在某个时候覆盖整个模型符合我们的基本要求。索引和顶点缓存对于动态数据特别有用,当使用设备依赖资源的时候他们必须被很小心的处理。使用动态顶点和索引缓存使我们能够随时建立几何体或者在CPU上动画已经存在的物体。在我们构建地形引擎的时候,我们使用这两种办法。
澄清下,我们所说的动态(dynamic)意味着完全代替。锁定一个顶点或索引缓存来改变一些随机的值将在大多数显卡上产生交错的糟糕的表现。因此我们在我们的接口中对这些资源不支持这种行为。在我们的引擎中,我们在每次需要更新的时候将整个动态缓存全部替代。这让驱动能够维护一个单方向的动态数据。一旦数据背传送到显卡,将不再试着将数据读入系统内存去更新某些特殊值。
类对象cVertexBuffer和cIndexBuffer提供我们的缓存需要的基本操作。这些对象同时包含我们的常规缓存和动态缓存。为了支持动态(可以认为是代替)缓存数据,我们使用一个NVIDIA和Microsoft共同认可的最好的方法来更新动态数据。
这个函数使用一个特大的缓存来存放动态数据。例如,如果你的动态数据由10个顶点组成,你将会创建一个能够容纳100个数据的动态缓存。利用这个大空间,你可以每次只使用10个顶点数据。在第一帧,你使用顶点0~9,索引10~19在第二帧被使用,然后继续下去。当你使用完所有的空间,整个缓存的内容都会被销毁,然后从0号顶点开始处理。这个滑动窗口计划(sliding window scheme)被认为使用起来是很友好的,因为它能导致最少数目的直接内存访问(Direct Memory Access ,DMA)操作被打断。清单4.5展示了基于在Microsoft DirectX9 Developer FQA中列出的算法伪码。