有没有高手指导我一把啊,急!!!!!!!!!!!!
我在使用directx8的时候,我使用线程来加载图片数据,首先在辅助线程中把数据读到surface上,再在主线程中把数据copy到纹理上,再进行渲染,可时不时的会出现屏幕变花,没有渲染的奇怪现象,谁来帮帮忙啊,谢谢! 问题点数:100、回复次数:14Top
1 楼why54(小坏蛋)回复于 2005-08-04 21:18:23 得分 20
把代码给出来看看,这样没法子帮你哦Top
2 楼lizer(骄傲的猫)回复于 2005-08-04 21:37:16 得分 0
读取:
//有m_nCount帧数据
for( int i = 0; i < pThis->m_nCount; ++i )
{
//图片数据在内存映像中
BYTE *pData = pThis->m_pResLib->GetResourceData( pThis->m_nStart + i );
int nLen = pThis->m_pResLib->GetResourceInfo(pThis->m_nStart + i )->dwSize;
block.AttachMemory( pData, nLen );
pThis->m_vvSurface[i].resize(block.m_nBlockCount);
pThis->m_vvX[i].resize(block.m_nBlockCount);
pThis->m_vvY[i].resize(block.m_nBlockCount);
for( int j = 0; j < block.m_nBlockCount; ++j )
{
pThis->m_vvX[i][j] = block.m_paBlock[j].m_x / 128;
pThis->m_vvY[i][j] = block.m_paBlock[j].m_y / 128;
//创建图片表面
pThis->m_vvSurface[i][j] = new zwD3DSurface8(); while( !pThis->m_vvSurface[i][j]->Create( pThis->m_pGraphic, 128, 128 ) );
//写表面
if( pThis->m_vvSurface[i][j]->Lock(sd) )
{
block.DrawBlock( &block.m_paBlock[j], sd, 0, 0, 0, 0, 128, 128 );
pThis->m_vvSurface[i][j]->Unlock();
}
}
写纹理:
int x = m_vvX[m_nFrame][i];
int y = m_vvY[m_nFrame][i];
m_texture[x][y].DrawSurface(0, 0, m_vvSurface[m_nFrame][i], 0, 0, 128, 128 );
渲染:
//设置位置
if( FAILED(pDev->SetTransform(D3DTS_WORLD, &m_mtxPosition)))
{
DEBUG_OUTPUT("D3D::SetTransform.");
}
//pDev->SetTransform(D3DTS_TEXTURE0, &m_mtxTexture);
//设置像素格式
if( FAILED(pDev->SetVertexShader( zwD3DVertex::FVF )))
{
DEBUG_OUTPUT("D3D::SetVertexShader.");
}
//设置顶点缓冲
if( FAILED(pDev->SetStreamSource( 0, m_pVB, sizeof(zwD3DVertex) ) ))
{
DEBUG_OUTPUT("D3D::SetStreamSource.");
}
//画矩形
if( FAILED(pDev->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 2 )))
{
DEBUG_OUTPUT("D3D::DrawPrimitive.");
}
//代码比较乱,也请看看。Top
3 楼lizer(骄傲的猫)回复于 2005-08-04 22:03:47 得分 0
我发现好象我不做写表面那一步,这些现象就消失了,可是该画的也没有在屏幕上画出来。Top
4 楼CGChina(时空英雄)回复于 2005-08-05 03:44:26 得分 20
好像没有类似Lock and UnLock的功能,这样就不能保证,数据处理的完整。Top
5 楼tslkfyh(TSL)回复于 2005-08-05 09:18:53 得分 20
在画之前有没有清屏呢Top
6 楼lizer(骄傲的猫)回复于 2005-08-05 14:28:29 得分 0
基本的绘图过程都是有的,而这个问题也是随机出现的Top
7 楼tslkfyh(TSL)回复于 2005-08-05 16:53:14 得分 0
看来这是由多线程引起的,这玩意是最难掌握的,为什么一定要用多线程呢Top
8 楼why54(小坏蛋)回复于 2005-08-05 21:50:06 得分 0
1、m_vvSurface[i][j] 是new出来的,在什么地方释放的,因用了多线程,考虑在引用该变量前是否有被释放或清零的可能????
2、循环的边界值是否正确??
3、多线程间是否同步??Top
9 楼lizer(骄傲的猫)回复于 2005-08-06 10:32:07 得分 0
有时候在调用m_vvSurface[i][j]->Create的时候,会出现OUTOFMEMORY的错误,可内存明显还有啊。Top
10 楼KingofMagic(大魔头)回复于 2005-08-06 13:43:32 得分 20
哎!没什么说的,因为不知道问题是怎么出来的
只是没明白,为什么一定要用多线程???又不是服务端Top
11 楼lizer(骄傲的猫)回复于 2005-08-08 19:57:56 得分 0
图片数据太多了,有2G多,所以我弄一个读文件的线程,还有D3D8的程序怎么样
才能变成独占模式的啊Top
12 楼tslkfyh(TSL)回复于 2005-08-10 18:13:00 得分 0
可以参考一下代理模式,在真正需要某个资源才真正去加载他,但不一定得多线程Top
13 楼netbian(寻欢のLEE)回复于 2005-08-12 00:03:23 得分 20
对多线程不敢冒 呵呵
感觉 CGChina(时空英雄)说的有道理 没有lock 和 unlock。不过没有试验 个人意见 呵呵Top
14 楼lizer(骄傲的猫)回复于 2005-09-01 16:02:27 得分 0
问题是解决了,但还是不知道是怎么回事,我只要不是在线程中调用createsurface就没有问题。Top




