利用LPDIRECT3DMOBILESURFACE生成LPDIRECT3DMOBILETEXTURE

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, &lt);

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秒...跟之前是天壤之别啊! 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值