游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3341|回复: 8

[求助]在辅助线程中连续LOCK、UNLOCK顶点缓冲出错

[复制链接]

51

主题

134

帖子

140

积分

注册会员

Rank: 2

积分
140
发表于 2007-9-29 00:48:00 | 显示全部楼层 |阅读模式
部分代码:
void Thread_creat(Terrain_Tile* tt)
{
        buffernode& nc=const_cast<buffernode&>(tt->nowcreat);
        nc.tnode=new Node_513(tt->filename,nc.wz.x*512,nc.wz.y*512,512,tt->_device);
        tt->iscreatrun=false;//更改iscreatrun告诉主线程Node_513创建结束
        return;
}
//这是Block_Terrain的构造函数,Block_Terrain保存着顶点缓冲等。。。
Block_Terrain(char *filename, UINT lox, UINT loz,rg1:OINT3D tl,IDirect3DDevice9* device)
{
        FILE *fp;
        UINT i=0;
        position_x=lox/32;
        position_y=(512-(loz-32))/32-1;
        position_y=15-position_y;
        device->CreateVertexBuffer(
                33*33 * sizeof(rg1::TerrainVertex),
                D3DUSAGE_WRITEONLY,
                rg1::TerrainVertex::FVF,
                D3DPOOL_MANAGED,
                &vb,
                0);
        vb->Lock(0, 0, (void**)&(v), 0);
        //读取高度图文件的一部分,存入V
        vb->Unlock();
/*。。。。。*/
}
//这是struct Node_513的构造函数,Node_513是一个四叉树,有着4个子节点或者是一个Block_Terrain
Node_513(char *filename,UINT lox,UINT loz,UINT level,IDirect3DDevice9* device)
{
        UINT c=CELL_SPACE;
        br.x=lox*c+level*c;
        br.y=0;
        br.z=loz*c;
        tl.x=lox*c;
        tl.y=0;
        tl.z=loz*c+level*c;
        if(level>32)
        {
                BT=NULL;
                UINT nextlevel=level/2;
                child[0]=new Node_513(filename,lox,loz+nextlevel,nextlevel,device);
                child[1]=new Node_513(filename,lox+nextlevel,loz+nextlevel,nextlevel,device);
                child[2]=new Node_513(filename,lox,loz,nextlevel,device);
                child[3]=new Node_513(filename,lox+nextlevel,loz,nextlevel,device);
        }
        else
        {
                child[0]=NULL;
                child[1]=NULL;
                child[2]=NULL;
                child[3]=NULL;
                BT=NULL;
                UINT zx=lox%512;
                UINT zz=loz%512;
                zz=zz+32;
                BT=new Block_Terrain(filename,zx,zz,tl,device);
        }
}
在主线程中,正确创建Node_513的话没有任何问题,而在辅助线程中动态生成就会出错

刚刚想了一下,我的主线程的d3d 设备一直在进行渲染操作,是不是因为我在渲染的时候另一条线程在载入顶点缓冲就会出错,我该怎么办

51

主题

134

帖子

140

积分

注册会员

Rank: 2

积分
140
 楼主| 发表于 2007-9-29 01:06:00 | 显示全部楼层

Re:[求助]在辅助线程中连续LOCK、UNLOCK顶点缓冲出错

汗。。。
没有定义D3DCREATE_MULTITHREADED。。。。
不过还有点问题。。。哎 问题不段啊

6

主题

471

帖子

1047

积分

金牌会员

Rank: 6Rank: 6

积分
1047
发表于 2007-9-29 10:16:00 | 显示全部楼层

Re:[求助]在辅助线程中连续LOCK、UNLOCK顶点缓冲出错

渲染前通知线程更新,等待线程完成工作后绘制,intel上有DirectX多线程例子可以去看下.

51

主题

134

帖子

140

积分

注册会员

Rank: 2

积分
140
 楼主| 发表于 2007-9-29 10:33:00 | 显示全部楼层

Re: Re:[求助]在辅助线程中连续LOCK、UNLOCK顶点缓冲出错

filx: Re:[求助]在辅助线程中连续LOCK、UNLOCK顶点缓冲出错

渲染前通知线程更新,等待线程完成工作后绘制,intel上有DirectX多线程例子可以去看下.

这样就没有动态加载的意义了。。。。

6

主题

471

帖子

1047

积分

金牌会员

Rank: 6Rank: 6

积分
1047
发表于 2007-9-29 11:35:00 | 显示全部楼层

Re:[求助]在辅助线程中连续LOCK、UNLOCK顶点缓冲出错

动态加载也要确保你的代码逻辑没问题,预分块加载然后绘制.
如果你想同时绘制和加载必定要等载完再画,不然肯定出错.
多线程好处是在你载入大量数据时不会堵塞主线程响应.
你在绘制当前区域的时候,载入周围将会绘制的区域才叫动态载入.

51

主题

134

帖子

140

积分

注册会员

Rank: 2

积分
140
 楼主| 发表于 2007-9-29 14:19:00 | 显示全部楼层

Re:[求助]在辅助线程中连续LOCK、UNLOCK顶点缓冲出错

代码的逻辑没问题。。。
只是D3D设备创建时没定义为D3DCREATE_MULTITHREADED而已,没有必要等待线程完成工作后绘制,完全可以同时进行。。。。

119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

积分
1393
发表于 2007-9-29 17:43:00 | 显示全部楼层

Re:[求助]在辅助线程中连续LOCK、UNLOCK顶点缓冲出错

加载完成之间最好设置一个标志,
初始设置为false,

加载完成最后一行loaded=true,

为true的进行绘制。

辅助线程动态释放正好相反
动态释放的第一行就是load=false
然后再释放....

注意简单的细节能避免很多不必要的麻烦

我刚做完这块,感触颇多。

51

主题

134

帖子

140

积分

注册会员

Rank: 2

积分
140
 楼主| 发表于 2007-9-29 20:47:00 | 显示全部楼层

Re:[求助]在辅助线程中连续LOCK、UNLOCK顶点缓冲出错

已经这么做了,基本搞定了,不过还是要感谢楼上的

36

主题

1047

帖子

1147

积分

金牌会员

Rank: 6Rank: 6

积分
1147
发表于 2007-9-29 23:59:00 | 显示全部楼层

Re:[求助]在辅助线程中连续LOCK、UNLOCK顶点缓冲出错

使用 D3DCREATE_MULTITHREADED 方式创建 device 会严重影响渲染性能,除非你的游戏对性能没有很高要求。对于这种需要频繁动态加载的资源,可以在游戏初始时创建一个大的 dynamic buffer,然后在需要时去 lock\unlock 填充数据,不过要保证在填充时 device 不会使用你填充的这部分数据段,也可以实现相同的效果,而且没有多线程同步的开销。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-21 01:36

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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