游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1751|回复: 1

多线程texture 资源修改 同步问题

[复制链接]

52

主题

155

帖子

160

积分

注册会员

Rank: 2

积分
160
发表于 2011-10-19 14:25:00 | 显示全部楼层 |阅读模式
我在另一个线程里 修改了 texture的数据,用lockRect锁住改的。
   
     lock();   

    D3DLOCKED_RECT d3dlr;
   
    {
if (FAILED(m_pTexture->LockRect(0, &d3dlr, 0, 0)))
{
unlock();
return E_FAIL;
}
    }
   
        for( row = 0; row< (UINT)m_lVidHeight; row++)
        {
            pdwS = ( DWORD*)pBmpBuffer;
            pdwD = ( DWORD*)pTxtBuffer;
            for( col = 0; col < dwordWidth; col ++ )
            {
                pdwD[0] =  pdwS[0] | 0xFF000000;
                pdwD[1] = ((pdwS[1]<<8)  | 0xFF000000) | (pdwS[0]>>24);
                pdwD[2] = ((pdwS[2]<<16) | 0xFF000000) | (pdwS[1]>>16);
                pdwD[3] = 0xFF000000 | (pdwS[2]>>8);
                pdwD +=4;
                pdwS +=3;
            }
            
    }
  
    unlock();
和主渲染线程同步控制的 用了 Mute,
void render()
{
                video_rest.myDShow2texture.lock();
V( g_pd3dDevice->BeginScene() ) ;
drawFullTex(video_rest.myDShow2texture.getVideoTexture());
V( g_pd3dDevice->EndScene() );
video_rest.myDShow2texture.unlock();
}
void CTextureRenderer::lock()
{
DWORD dw = WaitForSingleObject(textureMutex, 1000);
if(dw == WAIT_TIMEOUT || dw == WAIT_FAILED) ASSERT(false);
}
void CTextureRenderer::unlock()
{
ReleaseMutex(textureMutex);
}
测试下来,一个问题,在xp下没问题,换到win7下程序偶尔会僵死。
难道win7在directx9做了什么手脚?
另外锁的位置我也不确定,是不是要在  present 之后 , 还是 到 V( g_pd3dDevice->EndScene() );之后。还是DrawPraviateup就可以解锁了?

85

主题

824

帖子

878

积分

高级会员

Rank: 4

积分
878
QQ
发表于 2011-10-20 10:55:00 | 显示全部楼层

Re:多线程texture 资源修改 同步问题

你创建设备时有没有设置D3DCREATE_MULTITHREADED标志?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-8 23:53

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表