d3d9中绘制2d元素时提高效率

比如绘制一个rect,通常方法

vertexbuffer->lock();

fillRectVertex();

vertexbuffer->unlock();

setTexture();

drawprimitive();

 

绘制多个2d元素时效率很低。其原因是lock/unlock多次调用

 

 

改进方法:

2d元素绘制

使用一个统一的内存buffer和命令记录。

绘制时先把顶点数据填充到buffer,填充命令记录,包含当前元素的shader,vertex idx/size,primitive type.

真正绘制时,copy buffer到顶点缓冲,然后执行命令记录(设置shader,drawprimitive(idx,size)),这里可以合并相邻的同类命令(shader和primitive type相同的连续命令,比如drawtext)

 

这里的shader包含类型有 texture,texture blend(无ps的话),ps/vs,以及ps/vs相关的 变化脚本(比如做一个游戏图标,由2层纹理混合,其中一层不停旋转)

 

如果有必要,还可以使用z坐标标注命令顺序。执行前先对命令进行排序 (半透明元素最后绘制).减少render state切换.

 

绘制2d元素的3种方法。 

先绘制所有3d元素,然后绘制2d前可以clear z,然后就可以用z缓冲了

 

1. 使用POTION_T的顶点格式,跳过world/view变化,顶点坐标为像素坐标。

2. 使用identity的world/view 矩阵,关闭光照, 顶点坐标为 x[-1,1],y[-1,1],上方和右方为正,原点在屏幕/窗口中心。这个方法的好处是绘制图形是按百分比来计算的,和分辨率无关。

3. 使用vs,跳过world/view变化,和2类似效果,另外还可以增加一些简单的动画。

比如一个旋转的风车,直接变化texture的u/v

 

你可能感兴趣的:(游戏开发)