DirectX程序效率低下的一个原因

  我终于发现了我的程序执行Alpha混合的时候效率低下的原因,原来我把后备缓冲开在显存里了(想了一个晚上才找到这个错误,照小超同学说的,“应该挨扁了”)。为什么后备缓存要开在系统内存中呢?不单要这样,最好连离屏表面也也开在系统内存中。虽然图像是直接从显存调出来显示的,似乎一开始尽量把图像数据送到显存效率会更高,但实际结果却不是这样。我们先了解一下图像数据是怎么传递的。

  正常的步骤是这样的(双缓冲方式):
  一开始各个图像放在外存里,外存的数据不可以直接读入到显存,必须通过内存,所以通过API可以把图像读取到系统内存,接着放入到离屏表面(系统内存),接着把图像数据经过游戏程序的处理(在内存中处理)后被送到到后备缓存(也属于系统内存),最后把后备缓存的数据一次性送到主表面(显存)。

  数据传递:外存==>内存==>内存==>显存

  假如一开始就把图像数据“直接”放到“效率更高”的显存中,那么流程会是怎么样的呢?(同样是双缓冲方式)
  首先图像由API从外存读取到内存(这个少不了),然后把图像数据从内存送入离屏表面(显存),接着处理图像(必须从显存调回内存处理,处理完再送回显存),接着把图像从离屏表面送入后备缓存(显存),最后全部送入主表面(显存)。

  数据传递:外存==>内存==>显存==>内存==>显存==>显存==>显存

  可以看到这里降低效率的地方:内存与显存之间的传递比内存间或显存间各自的数据传递比慢很多,第一个方法只有一次内存与显存间的数据交互(最后送到主表面),而第二个方法显然多了几次内存与显存之间的数据交互,如果图像数据一多,效率降低会很明显,特别是窗口模式,或进行Alpha混合的时候。


posted on 2005-08-29 12:33  张瓅  阅读(1413)  评论(2)    收藏  举报

导航