ZZ( http://littl.blog.hexun.com/10167108_d.html)
在PDA上面创建一个文件是很耗时间的,比如我从内存里面读取一个图片流写入PDA输出成一个BMP文件要1.5秒,如果大量生成的话时间可想而知.
而我为了要从内存里面读图片流然后生成一个LPDIRECT3DMOBILETEXTURE纹理就要用D3DMXCreateTextureFromFileEx这个函数,而这个函数只能读取文件然后生成纹理,这样就要从图片流输出到PDA生成BMP,然后生成纹理,耗费时间巨大,导致程序运行速度像蜗牛...
经过很多天找资料研究,终于研究出一种方法来!
LPDIRECT3DMOBILETEXTURE lt;
m_pDevice->CreateTexture( width, height, 1,
D3DMUSAGE_DYNAMIC, D3DMFMT_R5G6B5,
D3DMPOOL_SYSTEMMEM, <);
m_pDevice是一个设备指针,是已经获取到值的.上面这个函数创建一个纹理.
D3DMSURFACE_DESC pDesc;//纹理表面描述
lt->GetLevelDesc(0,&pDesc);//获取纹理表面,纹理可以有很多层,一般都用第一层
LPDIRECT3DMOBILESURFACE srcSurface=NULL;//定义表面
LPDIRECT3DMOBILESURFACE backbuffer=NULL;//定义纹理表面
if(D3DM_OK!=(m_pDevice->CreateImageSurface(pDesc.Width,//宽
pDesc.Height,//高
pDesc.Format,//不带ALPHA通道的24位像素样式
&srcSurface //目标表面,这个函数创建一个表面,宽和高以及format必须跟纹理一样
)))
{
MessageBox(NULL,TEXT("creatsurfaceerror!"),TEXT("LOAD PIC ERROR"),MB_OK);
}
HRESULT hre=D3DMXLoadSurfaceFromFileInMemory(srcSurface,NULL,NULL,m_BufDIB,m_DibBytes,NULL,D3DMX_FILTER_NONE,NULL,NULL);//这个函数是从内存里面直接读取数据写入表面.这里m_BufDIB是一个HDIB指针,是从一个大文件中解压出来的一张图片的数据流指针.后面的m_DibBytes是它的长度,当然这是包含头信息的.
if(FAILED(hre))
{
MessageBox(NULL,TEXT("loadsurfaceerror!"),TEXT("LOAD PIC ERROR"),MB_OK);
}
lt->GetSurfaceLevel(0,&backbuffer);//获取纹理第一层的表面
D3DMXLoadSurfaceFromSurface(backbuffer,NULL,NULL,srcSurface,NULL,NULL,D3DMX_FILTER_NONE,0);//这个函数将创建的表面数据拷贝到纹理的表面.
这样,纹理就创建完毕了,速度大概是0.03秒...跟之前是天壤之别啊!