碰到这样的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差别会这么大
以上就是我顾虑的地方,至今也没有动手,请教各位大哥如果碰到这样的问题,您会怎么做
实现了一个简单的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
同样,画矩形框,你就再多加两个顶点(结构体再填充2个),其效率是GDI所不能比拟的。
画图片也建议不要用ID3DXSprite,都说ID3DXSprite比较方便,实际上,他比IDirect3DTexture9还多了好几道步骤,更加麻烦,而且还拖效率。用IDirect3DTexture9不需要什么Begin和End,直接和画线段一样,调用DrawPrimitiveUp()就行。
处理alpha就加上下面4条语句,很简洁。
C/C++ code
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