请教一个关于DirectX窗口程序的问题.

xyz119 2004-09-10 09:19:20
由于目前大多数显示器都是设置为32bit, 而我内部图象是按16bit存放,要画到窗口上必须要进行转换. 是每画一幅都进行转换快,还是先将所有的图都画到一个16bit内存缓冲中,再统一转成32bit快 ? 目前我采用的是后者,因为这样比较方便,但是效果不是太理想. 另外有没有快速16bit转32bit的代码,谢谢!

下面是我自己写的16bit转32bit代码,有时间帮我看看,有什么地方可以优化的,再次谢谢!

static __int64 MASKB=0x0000001F0000001F;

static __int64 MASKG=0x000007E0000007E0;

static __int64 MASKR=0x0000F8000000F800;

BYTE* pDstBp = m_pMDrawSuface->GetLockData();
BYTE* pSrcBp = (BYTE*)m_pwBitData;

int nDstLineSize = m_pMDrawSuface->GetLockLinearSize();
int nSrcLineSize = m_nLinearSize;

int nWidth = m_nWidth >> 1;
int nHeight = m_nHeight;
_asm{

mov esi,pSrcBp;

mov edi,pDstBp;

mov ecx,nWidth;

mov edx,nHeight;

xor eax,eax;//eax = 0

xor ebx,ebx;//ebx = 0

movq mm0,MASKR;
movq mm1,MASKG;
movq mm2,MASKB;

bitloop:
pxor mm6,mm6;//mm6 = 0
movd mm3,[esi];//mm3 = 0000 0000 src1 src0

punpcklwd mm3,mm6;//mm3 = 0000 src1 0000 src0

add esi,4;

movq mm5,mm3;

movq mm6,mm3;

add edi,8;

movq mm7,mm3;

pand mm5,mm0; //得到R分量
pand mm6,mm1; //得到G分量

pslld mm5,8;
pslld mm6,5;

pand mm7,mm2; //得到B分量
por mm5,mm6;//合并RG

pslld mm7,3;

por mm5,mm7;//和合并RGB

inc ebx;//ebx++

movq [edi],mm5;

cmp ebx,ecx;//ebx == width ?
je nextline;

jmp bitloop;

nextline:
inc eax;//eax++
cmp eax,edx;//eax == height ?
je done;

xor ebx,ebx;//ebx = 0;

mov esi,pSrcBp;
mov edi,pDstBp;

add esi,nSrcLineSize;
add edi,nDstLineSize;

mov pSrcBp,esi;
mov pDstBp,edi;
jmp bitloop;
done:
emms
}
...全文
145 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
cryincold 2004-09-16
  • 打赏
  • 举报
回复
UP好吗
潘李亮 2004-09-16
  • 打赏
  • 举报
回复
做为纹理是不需要的。
kofightas 2004-09-15
  • 打赏
  • 举报
回复
什么模式都不用转
你试试就知道了。
xyz119 2004-09-14
  • 打赏
  • 举报
回复
我说的是窗口模式
myling 2004-09-13
  • 打赏
  • 举报
回复
初始化的时候 SetDisplayMode 为16位的不就行了?
bopengbopeng 2004-09-13
  • 打赏
  • 举报
回复
你运行前设置显示模式到16位就行了吧。
impossible 2004-09-13
  • 打赏
  • 举报
回复
Directx自动完成,不需要转化吧,当你把图片当作纹理载入的时候都做好了

8,305

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧