Показать сообщение отдельно
Старый 28.06.2011, 10:37   #1
RegIon
Элита
 
Аватар для RegIon
 
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,158
Написано 502 полезных сообщений
(для 1,012 пользователей)
Подмигивание "Ускорение" функций

void draw_string(uint8_t font_id, uint16_t x, uint16_t y, char *str)
{
    gfx_point2d_t pos;
    gfx_rect_t    rect;
    int i, nchar,n,m;

    pos.x = x;
    pos.y = y;
    rect.width = 24;
    rect.height = 24;
    i = 0;

    while (str[i] != 0) {
       nchar = str[i];
       pos.x+=12;
      for(n=0;n<16;n++){
          for(m=0;m<16;m++){
            if(n*16+m==nchar){
            //pos.x = i*24;
            rect.x =m*24; 
            rect.y =n*24;
            gfx_set_colorrop(0xcc);//api функции
            gfx_sprite(font_id, &rect, &pos);//api спрайта,рубит rect'ом ресует в pos
              }
             }
        }
        i++;
    }
}
пришлось писать такую функцию,ну как видно много циклов-меньше скорость,как "ускороить" её?(пока на скорость не влияет)
//целый корень....
int isqrt(unsigned x) { 
  unsigned m, y, b;
   m = 0x40000000;
   y = 0;
   while(m != 0) {              // Do 16 times.
      b = y | m;
      y = y >> 1;
      if (x >= b) {  x = x - b; y = y | m; }
      m = m >> 2;
   }
   return y;
 }
 
float fsqrt(unsigned float x){//дробный корень с 3 числами после знака...
 int p=isqrt(x*100000);
    float n=(1.0*x)/(p*p);
      int s=isqrt(n*1000000);
float m=1.0*p*(s/1000.0);      
return m/1000.0;     
}
а эта считает корень без сопра(сопроцессора),как видно много делений на большие числа и умножение,а пользоваться смещением не умею.. подкинте идеи.
__________________
Сайт: http://iexpo.ml
(Offline)
 
Ответить с цитированием