游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1571|回复: 2

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

[复制链接]

1

主题

2

帖子

6

积分

新手上路

Rank: 1

积分
6
发表于 2004-9-10 21:18:00 | 显示全部楼层 |阅读模式
请教一个关于DirectX窗口程序的问题.

由于目前大多数显示器都是设置为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
        }

1

主题

2

帖子

6

积分

新手上路

Rank: 1

积分
6
 楼主| 发表于 2004-9-11 21:59:00 | 显示全部楼层

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

.

26

主题

324

帖子

325

积分

中级会员

Rank: 3Rank: 3

积分
325
QQ
发表于 2004-9-12 20:30:00 | 显示全部楼层

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

好难!你用汇编啊?我不懂! [em23]
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-8-18 15:18

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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