当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 7 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : 这段代码能够优化加速吗?
帖子发表于 : 2008-01-26 23:29 

注册: 2007-11-12 22:10
帖子: 22
送出感谢: 0 次
接收感谢: 0 次
代码:
#include <stdio.h>
#include <time.h>
#include <math.h>

#define IMAGE_WIDTH   1000
#define IMAGE_HEIGHT  1000

guchar *pos;
guchar rgbbuf[IMAGE_WIDTH * IMAGE_HEIGHT * 3];
int main()
{
   gint x,y;
   pos = rgbbuf;
   gdouble vx,vy;
   
   guchar bright= 0;
   GTimeVal  timestart;
   g_get_current_time(&timestart);
   for (y = 0; y< IMAGE_HEIGHT;y++)
   {
      vx=0;
      vy=0;
      gdouble tmpy = ((256-bright)/(gdouble)IMAGE_HEIGHT)*((gdouble)y);
      for (x= 0; x<IMAGE_WIDTH; x++)
      {
         vx +=(256-bright)/(gdouble)IMAGE_WIDTH;
         vy += (tmpy)/IMAGE_WIDTH;
         guchar r,g,b;
         r   = floor(vx);
         g = floor(vy);
         b = floor(vy);
         
         *pos++ =r;             /*Red. */
         *pos++ =g;         /*Green. */
         *pos++ =b;           /*Blue. */
      }
   }
   GTimeVal  timeend;
   g_get_current_time(&timeend);
   
   glong lostTime = timeend.tv_usec - timestart.tv_usec;
   g_print("The Calendar Time lost %d\n", lostTime);
   return (0);
}




此代码目的是生成一个颜色面板的Buff,但测试发现速度不理想,不知道能不能对其进行优化……此代码的思路是一样些javascript的方式在思考,不知道在C上面有没有其他的办法....


附件:
文件注释: 此代码目的是生成一个颜色面板的Buff
color.jpg
color.jpg [ 4.55 KiB | 被浏览 1005 次 ]
页首
 用户资料  
 
2 楼 
 文章标题 :
帖子发表于 : 2008-01-27 13:31 
头像

注册: 2006-07-02 11:16
帖子: 12522
地址: 廣州
送出感谢: 0 次
接收感谢: 8
预先算好, 用的时候立刻画出来


_________________
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。


页首
 用户资料  
 
3 楼 
 文章标题 :
帖子发表于 : 2008-01-27 16:57 

注册: 2007-11-12 22:10
帖子: 22
送出感谢: 0 次
接收感谢: 0 次
BigSnake.NET 写道:
预先算好, 用的时候立刻画出来


其实最后肯定是先计算Buff,然后用gdk_draw_rgb_image(),但现在要解决的问题是这个颜色面板的颜色是动态更新的,比如动态更改bright变量。。。。

Gimp里面的颜色面板计算相当的快,我没有找到此代码,有接近的,但没有完全看懂其计算方式

我现在在考虑用SSE指令是否可以提速。。。。。


页首
 用户资料  
 
4 楼 
 文章标题 :
帖子发表于 : 2008-01-27 17:02 
头像

注册: 2005-08-14 21:55
帖子: 58428
地址: 长沙
送出感谢: 4
接收感谢: 272
取色?不如转换思维,直接显示svg。然后取色。


_________________
● 鸣学


页首
 用户资料  
 
5 楼 
 文章标题 :
帖子发表于 : 2008-01-31 11:26 

注册: 2005-09-09 11:32
帖子: 45
送出感谢: 0 次
接收感谢: 0 次
一般优化都是找出时间瓶颈,即最消耗时间的地方,想办法提高效率
这个程序,需要在循环里头优化,尽量减少循环中的运算
代码:
   for (y = 0; y< IMAGE_HEIGHT;y++)
   {
      vx=0;
      vy=0;
      gdouble tmpy = ((256-bright)/(gdouble)IMAGE_HEIGHT)*((gdouble)y);
      //(256-bright)/(gdouble)IMAGE_HEIGHT 可以提前算好
     //节省(IMAGE_HEIGHT - 1)次整数减法和浮点除法运算
      for (x= 0; x<IMAGE_WIDTH; x++)
      {
         vx +=(256-bright)/(gdouble)IMAGE_WIDTH;
         //(256-bright)/(gdouble)IMAGE_WIDTH可以提前算好
        //节省(IMAGE_WIDTH * IMAGE_HEIGHT -1)次整数减法和浮点除法运算
         vy += (tmpy)/IMAGE_WIDTH;
         guchar r,g,b;
         r   = floor(vx);
         g = floor(vy);
         b = floor(vy);
         //估计这 3 个 floor() 调用是消耗时间的大头
         //g 跟 b 都是 floor(vy) ,不知道有没有什么差别
         //如果没有,直接 b = g; 节省(IMAGE_WIDTH * IMAGE_HEIGHT)次 floor() 调用开销
        //另外需要对 floor() 本身优化,比如写成 宏,避免函数调用的开销,优化 floor() 的算法之类。。。
         
         *pos++ =r;             /*Red. */
         *pos++ =g;         /*Green. */
         *pos++ =b;           /*Blue. */
      }
   }
[/code]


页首
 用户资料  
 
6 楼 
 文章标题 :
帖子发表于 : 2008-02-21 2:33 

注册: 2007-11-12 22:10
帖子: 22
送出感谢: 0 次
接收感谢: 0 次
非常感谢,我去试一试


页首
 用户资料  
 
7 楼 
 文章标题 :
帖子发表于 : 2008-02-21 3:57 

注册: 2007-11-12 22:10
帖子: 22
送出感谢: 0 次
接收感谢: 0 次
问题主要出在floor()调用上

谢谢5楼的解答


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 7 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 4 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译