请教GUI中窗体的绘制问题。。
我要做一个比较复杂的窗体,能够支持任意大小的宽高。
这个窗体由四个角和四个边框组成,如图
为了绘制这么个整体,一次要调用8个DrawPrimitiveUP()函数
DrawPrimitiveUP(左上角)
DrawPrimitiveUP(右上角)
DrawPrimitiveUP(左下角)
DrawPrimitiveUP(右下角)
DrawPrimitiveUP(上边框)
DrawPrimitiveUP(下边框)
DrawPrimitiveUP(左边框)
DrawPrimitiveUP(右边框)
调用8个对于这个小小的窗体来讲,开销应该很大,又不规范吧?
而且那个边框的大小很小,32×1和1×32的,然后用寻址模式平铺,调用DrawPrimitiveUP()就为了绘制这么点的像素。有些不划算的感觉。
要怎么绘制??怎么设计?
[解决办法]
你可以参照ID3DXSprite设计一个类,把相同纹理的所有四边形放在一个缓冲区里面,end或者flush的时候一次绘制,就只有一次DrawPrimitiveUP调用了。
[解决办法]
就是说,准备一个大的顶点缓冲区,把用到同一个纹理的所有四边形数据保存在那个大的顶点缓冲区里面,一次绘制出来。
举一个例子:
定义一个类,假设名叫MySpriteclass MySprite{public: bool Begin() { //准备绘制 } void End() { //绘制最后一批 //做好清理工作 } void Flush() { //调用DrawPrimitiveUP绘制顶点缓冲区中的所有精灵 //清空顶点缓冲区 } void DrawImage(Texture* texture,Rect& src,Rect& dest) { //检测是否和上一次绘制的纹理相同 //如果不是则需要切换纹理,或者缓冲区已满,则调用Flush绘制然后清空当前顶点缓冲区 Flush(); //生成四边形数据并且存入顶点缓冲区,直到下次切换纹理或者缓冲区满的时候才绘制 }private: ui_vertex* m_VertexBuffer; //顶点缓冲区 uint m_VertexCount; //顶点数量 uint m_FaceCount; //多边形数量public:};//使用的时候,假设有MySprite m_Sprite;那么绘制的时候,可以这样if(m_Sprite.Begin()){ m_Sprite.DrawImage(左上角); m_Sprite.DrawImage(左边框); m_Sprite.DrawImage(左下角); m_Sprite.DrawImage(下边框); ... ... m_Sprite.End();}
[解决办法]
这种情况下,应该使用三角形列表,所以每个图片需要6个顶点,一共是48个顶点,如果你要这么做的话。
我的建议是,在DrawImage这个函数里面,为要显示的一个图片计算6个顶点,保存在顶点缓冲区里面。
需要绘制几个图片,就调用几次DrawImage,这样就能非常灵活了。