【发布时间】:2014-02-04 07:02:14
【问题描述】:
我喜欢在DesktopWindow 上使用SetPixel,但有时它的行为很奇怪。
for(i=0;i<10000;i++)
SetPixel(DC,100+100*sin((float)i/100),100+100*cos((float)i/100),0);
上面的代码应该打印 10,000 像素,在屏幕的左上角绘制一个圆形。但是如果我多次使用它,它会变得越来越慢。下面的代码应该提供一个这样的例子:
#include<windows.h>
int main(){
Sleep(4000);//waiting you to be ready
int i,j,k,l;
HDC DC=GetDC(GetDesktopWindow());
j=GetTickCount();//base time
for(l=0;l<10;l++)
{
for(i=0;i<10000;i++)
SetPixel(DC,rand()%1000,rand()%1000,0);//print 10000 random x,y pixel
printf("%d\n",(k=GetTickCount())-j);//time duration from the last count
for(i=0;i<10000;i++)
SetPixel(DC,rand()%1000,rand()%1000,0);
printf("%d\n",(j=GetTickCount())-k);
}
return 0;
}
为什么这个操作会随着时间的推移而变慢?
【问题讨论】:
-
printf是时间的一部分,所以可能就是这样。尝试将其注释掉,看看它是否看起来仍然变慢。SetPixel从来都不是在显示器上绘图的最快方式。 -
是的。 SetPixel 的效率如此之低,以至于处理器降低时钟频率以保持散热已经是一个简单的解释。
-
@HansPassant 如果
GetTickCount函数返回时钟周期数,这不会改变代码结果 -
不,
GetTickCount确实不返回处理器时钟周期数。 @HansPassant,老实说,您不会认为SetPixel对处理器的压力足以导致散热问题吗? -
我相信 setpixel 实际上会写入屏幕外缓冲区,然后将其 bitblt 到实际屏幕(尽管这可能是大约 20 年前 Windows 使用的工作方式)。桌面管理器是否有可能检测到更改并仅复制更改的矩形,该矩形最终会变得更大,因此需要更长的时间?