D3D显示内存数据崩溃

jamspen 2013-05-23 10:38:22
下面是一个我从网上找到的一个D3D显示图片数组的例子,现在的问题是如果m_nWidth;m_nHeight都大于600的话,显卡工作不正常,win7出现显卡崩溃,出现问题是在如下函数:
m_pd3dDevice->GetBackBuffer(0,0,D3DBACKBUFFER_TYPE_MONO,&pBackBuffer);

请教一下这段代码哪里有问题?我的目的是动态显示内存图片数据,数据是实时刷新的,之前用gdi显示没问题,但是gdi在win8上很慢,所以想用d3d显示。

我的本质目的其实是memcpy一段内存,紧接着显示,要求是实时,请教除了GDI最实时的方法是什么?只要求60fps就行了。

void d3d_show(LPBYTE pBuffer,long lLen)
{


if(m_pd3dSurface == NULL)
return;
D3DLOCKED_RECT d3d_rect;
if( FAILED(m_pd3dSurface->LockRect(&d3d_rect,NULL,D3DLOCK_DONOTWAIT)))
return ;
const int w = m_nWidth;
const int h = m_nHeight;
BYTE * const p = (BYTE *)d3d_rect.pBits;
const int stride = d3d_rect.Pitch;
int i = 0;
for(i = 0;i < h;i ++)
{
memcpy(p + i * stride,pBuffer + i * w, w);
}
for(i = 0;i < h/2;i ++)
{
memcpy(p + stride * h + i * stride / 2,pBuffer + w * h + w * h / 4 + i * w / 2, w / 2);
}
for(i = 0;i < h/2;i ++)
{
memcpy(p + stride * h + stride * h / 4 + i * stride / 2,pBuffer + w * h + i * w / 2, w / 2);
}
if( FAILED(m_pd3dSurface->UnlockRect()))
{
return ;
}
if (m_pd3dDevice != NULL)
{
m_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,0), 1.0f, 0 );

m_pd3dDevice->BeginScene();

IDirect3DSurface9 * pBackBuffer = NULL;
m_pd3dDevice->GetBackBuffer(0,0,D3DBACKBUFFER_TYPE_MONO,&pBackBuffer);
m_pd3dDevice->StretchRect(m_pd3dSurface,NULL,pBackBuffer,&m_rtViewport,D3DTEXF_LINEAR);


m_pd3dDevice->EndScene();
m_pd3dDevice->Present( NULL, NULL, NULL, NULL );
}
}
...全文
223 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
lsupper 2013-05-23
  • 打赏
  • 举报
回复
最实时? 你可以看下双缓冲技术

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧