user-0 提问: 循环如何优化

回复:
user: user-1
content: 最简单的优化方法是用一个二维数组比如int PV[Width][Height]记住LCD屏上每个像素在本次PutPixel之前的值。 如果该值和本次PutPixel的值一样，跳过本次PutPixel；否则PutPixel并在数组中记住新值。

user: user-2
content: 引用 2 楼 ychongx 的回复:[quote=引用 1 楼 user-4 的回复:] 减少/去掉分支机构和函数调用。 如果不是清屏时画圆环而且圆环颜色不止一种，怎么办，代码需要通用  /*   * 绘制同心圆  */ void Mire(void) {     UINT32 x,y;     UINT32 color;     UINT8 red,green,blue,alpha;      for (y = 0; y < ysize; y++)         for (x = 0; x < xsize; x++){             color = ((x-xsize/2)*(x-xsize/2) + (y-ysize/2)*(y-ysize/2))/64;             red   = (color/8) % 256;             green = (color/4) % 256;             blue  = (color/2) % 256;             alpha = (color*2) % 256;              color |= ((UINT32)alpha << 24);             color |= ((UINT32)red   << 16);             color |= ((UINT32)green << 8 );             color |= ((UINT32)blue       );              PutPixel(x,y,color);         } }  麻烦详细点说，大神[/quote]  性能 和 你所谓的通用，都是矛盾体。   你这个所谓的通用，每处理一个像素点，都要调用一次函数。 以8bpp为例，  你就是为了给地址赋值颜色。 却执行了一个函数。  当你对整个图像做完处理之后，处理图像的时间假设为1， 那么调用函数的开销可能就是3~5.  这是多么大的性能浪费啊。  在C/C++预研内的描述， 感觉有如下优化可能。  1、 看看 ClearSCR， 难道一个memset不能搞定？ 2、 Mire 中， color的第1次之后的赋值，用联合体之类的会不会更快。 3、 mire中，  color的第一次赋值，是不是可以更快，例如使用位移。 4、 去掉处理单个像素的函数吧。

user: user-3
content: 引用 1 楼 user-4 的回复:减少/去掉分支机构和函数调用。 根据bpp定义多个PutPixel函数，同时PutPixel并入到ClearScr，在画图的时候先在内存中画好准备要显示图片，在真正要显示的时候直接COPY，就是双缓冲来处理显示延时的问题。

user: user-0
content: 引用 1 楼 user-4 的回复:减少/去掉分支机构和函数调用。 如果不是清屏时画圆环而且圆环颜色不止一种，怎么办，代码需要通用  /*   * 绘制同心圆  */ void Mire(void) {     UINT32 x,y;     UINT32 color;     UINT8 red,green,blue,alpha;      for (y = 0; y < ysize; y++)         for (x = 0; x < xsize; x++){             color = ((x-xsize/2)*(x-xsize/2) + (y-ysize/2)*(y-ysize/2))/64;             red   = (color/8) % 256;             green = (color/4) % 256;             blue  = (color/2) % 256;             alpha = (color*2) % 256;              color |= ((UINT32)alpha << 24);             color |= ((UINT32)red   << 16);             color |= ((UINT32)green << 8 );             color |= ((UINT32)blue       );              PutPixel(x,y,color);         } }  麻烦详细点说，大神

user: user-4
content: 减少/去掉分支机构和函数调用。

user: user-0
content: 引用 4 楼 TheNewIpad 的回复:[quote=引用 2 楼 ychongx 的回复:] [quote=引用 1 楼 user-4 的回复:] 减少/去掉分支机构和函数调用。 如果不是清屏时画圆环而且圆环颜色不止一种，怎么办，代码需要通用  /*   * 绘制同心圆  */ void Mire(void) {     UINT32 x,y;     UINT32 color;     UINT8 red,green,blue,alpha;      for (y = 0; y < ysize; y++)         for (x = 0; x < xsize; x++){             color = ((x-xsize/2)*(x-xsize/2) + (y-ysize/2)*(y-ysize/2))/64;             red   = (color/8) % 256;             green = (color/4) % 256;             blue  = (color/2) % 256;             alpha = (color*2) % 256;              color |= ((UINT32)alpha << 24);             color |= ((UINT32)red   << 16);             color |= ((UINT32)green << 8 );             color |= ((UINT32)blue       );              PutPixel(x,y,color);         } }  麻烦详细点说，大神[/quote]  性能 和 你所谓的通用，都是矛盾体。   你这个所谓的通用，每处理一个像素点，都要调用一次函数。 以8bpp为例，  你就是为了给地址赋值颜色。 却执行了一个函数。  当你对整个图像做完处理之后，处理图像的时间假设为1， 那么调用函数的开销可能就是3~5.  这是多么大的性能浪费啊。  在C/C++预研内的描述， 感觉有如下优化可能。  1、 看看 ClearSCR， 难道一个memset不能搞定？ 2、 Mire 中， color的第1次之后的赋值，用联合体之类的会不会更快。 3、 mire中，  color的第一次赋值，是不是可以更快，例如使用位移。 4、 去掉处理单个像素的函数吧。[/quote] 你说的蛮对的，帖子居然不能编辑，没权限，坑爹啊