碰到这样的UI问题 你打算怎么办

我在一家小游戏公司
实现了一个简单的UI引擎,主要在游戏中用于绘制UI操作界面
我是用D3D+GDI相关技术实现的

主要手段是 通过获得D3D 后备缓冲表面然后调用IDirect3DSurface9::GetDC 
方法获得DC上下文,然后使用GDI相关API绘制图像,例如AlphaBlend,Bitblt实现的


在一开始觉得效率还是可以的,但是发现实际应用时候导致游戏的帧数有比较大的下降
我查了一下网上资料,都说GetDC操作是比较慢的,但是我之所以选择GDI是因为GDI绘制
2D的API比较丰富,比较友好.虽然我已经尽力的去优化代码,但是效果却还不是很明显.
为什么说IDirect3DSurface9::GetDC会慢呢?我也没有理解


现在我为了提高速度,打算修改一下绘图引擎部分的实现了,据说2D可以用ID3DXSprite 来做2D贴图
这样就避免GetDC了,但是在UI引擎中有时候需要用到简单的画矩形,画边框的操作
如果用ID3DXSprite 贴贴图还好,如果要画点线边框等操作,就比较麻烦了,还要创建网格方式来画

还有一个很奇怪的情况,同样的机器配置,同样的代码实现,如果在XP上跑,游戏画面帧虽然下降了但是还算流畅
但是如果在WIN7上跑,发现游戏画面帧会有很大的下降,这也是导致我考虑重新设计UI引擎部分的原因
我还是没有理解 为什么WIN7和XP差别会这么大

以上就是我顾虑的地方,至今也没有动手,请教各位大哥如果碰到这样的问题,您会怎么做

作者: jyg_mysoul   发布时间: 2011-06-14

我还是没有理解 为什么WIN7和XP差别会这么大


谁知道微软改了什么啊,加了什么东西在里边

作者: xuexiaodong2009   发布时间: 2011-06-15

既然用了D3D,就直接用他画就行了,你所说的麻烦,是你不了解吧?其实相当简单,画一条线仅要3条语句:
C/C++ code

    SVertex2D vertexData[] =
    {
        {         float(x),         float(y), 0, 1, color,    0, 0 },
        { float(x+lenght),         float(y), 0, 1, color,    0, 0 },
    };

    pD3DDevice->SetTexture(0, 0);
    pD3DDevice->DrawPrimitiveUP(D3DPT_LINELIST, 1, &vertexData, sizeof(SVertex2D));


同样,画矩形框,你就再多加两个顶点(结构体再填充2个),其效率是GDI所不能比拟的。
画图片也建议不要用ID3DXSprite,都说ID3DXSprite比较方便,实际上,他比IDirect3DTexture9还多了好几道步骤,更加麻烦,而且还拖效率。用IDirect3DTexture9不需要什么Begin和End,直接和画线段一样,调用DrawPrimitiveUp()就行。
处理alpha就加上下面4条语句,很简洁。
C/C++ code

m_pD3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, true); 
m_pD3DDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); 
m_pD3DDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
m_pD3DDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);

作者: xychzh   发布时间: 2011-06-15