游戏开发论坛

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

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

[复制链接]

52

主题

155

帖子

160

积分

注册会员

Rank: 2

积分
160
发表于 2011-10-19 14:14: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就可以解锁了?

1万

主题

1万

帖子

2万

积分

管理员

中级会员

Rank: 9Rank: 9Rank: 9

积分
20515
发表于 2011-10-19 14:29:00 | 显示全部楼层

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

渲染跟逻辑线程分开很不安全把,不单游戏进程本身,系统好像也挺多锁。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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