随想录(canvas双缓存下的性能分析)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

    有过canvas编程经验的同学都知道,如果希望在客户端屏幕上不出现闪烁的情况,最好使用双缓存输出的方法。所谓的双缓存,就是在paint画面之前,先用memdc将所要表现的内容全部弄好,最后再bitblt到dc上面。这种方法很实用,但是效率究竟差多少,却很少人做过实验,今天我们就来试试看。

1、原始画面

    为了便于测量,我们特地在代码中多次打印和输出字符,

        case WM_PAINT:
            hdc = BeginPaint(hWnd, &ps);
            // TODO: Add any drawing code here...
            RECT rt;

            val = ::GetTickCount();
            for(i = 0; i < 10000; i++){
                GetClientRect(hWnd, &rt);
                DrawText(hdc, szHello, strlen(szHello), &rt, DT_CENTER);
            }
            val = ::GetTickCount()-val;
            EndPaint(hWnd, &ps);
            break;

2、先缓存,后输出画面

    和实验1不同,这里我们先创建一个兼容dc和bitmap,等到打印后再bitblt输出。

        case WM_PAINT:
            RECT rt;
            hdc = BeginPaint(hWnd, &ps);        
            GetClientRect(hWnd, &rt);

            hmemdc = CreateCompatibleDC(hdc);
            hnew = CreateCompatibleBitmap(hdc, rt.right-rt.left, rt.bottom-rt.top);
            hold = (HBITMAP)SelectObject(hmemdc, hnew);

            // TODO: Add any drawing code here...
            val = ::GetTickCount();
            for (i=0; i < 10000; i++){
                DrawText(hmemdc, szHello, strlen(szHello), &rt, DT_CENTER);
            }
            val = ::GetTickCount() - val;

            BitBlt(hdc, 0, 0, rt.right-rt.left, rt.bottom-rt.top, hmemdc, 0, 0, SRCCOPY);
            SelectObject(hmemdc, hold);
            DeleteObject(hnew);
            DeleteDC(hmemdc);

            EndPaint(hWnd, &ps);
            break;

3、实验结果

    我们是按照多次打印统计的方法来分析的。用来统计的函数是GetTickCount函数,单位是毫秒。实验结果是,实验1中的val数值为210ms,实验2中数值为140ms。这里只是打印了字符一种情况,可能效果不太明显。我想,如果是点阵这种情况的话,可能更体现出兼容dc的优越性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式-老费

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值