Модераторы: Snowy, Alexeis, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ускорить работу с графикой не переписвая программу 
:(
    Опции темы
Cheburek
Дата 1.5.2006, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 26.3.2006

Репутация: нет
Всего: 1



рисую я на TImage, с помощью TCanvas... по пикселям
Код

pic.Canvas.Pixels[round(x),round(WinY/2+R*sin(fi))] := THColor;

но когда начинаю двигать объект - картинка начинает попросту лагать.. вот пример функции которая рисует линзу, и заодно ее описывает физически
Код

procedure OptOs.OFRLinze(h,R,xl,Nsr:real;pic:TImage;k,THColor:integer);
var fi,FiM,xs,x:real;
        y:integer;
begin
    FiM := arcsin((h/(2*R)));
  xs := xl - R*cos(FiM);
    fi:=-FiM;
    WHILE fi <= FiM DO begin
    x := xs + R*cos(FiM);
    WHILE  x <= (xs + R) DO begin
     IF x < round(xs+R*cos(fi)) THEN begin
            pic.Canvas.Pixels[round(x),round(WinY/2+R*sin(fi))] := THColor;
        KoafPr[round(x),round(WinY/2+R*sin(fi))] := Nsr;
        YgNorm[round(x),round(WinY/2+R*sin(fi))] := k*fi;
        IF  (R*sin(fi-(1/R)) < 0) and (0<R*sin(fi+(1/R))) THEN begin
         YgNorm[round(x),round(WinY/2+R*sin(fi))] := 0;
        end;
      end;
      x:=x+1;
    end;
    fi:=fi+(1/R);
    end;
  FOR y := round(WinY/2 - (h/2)) TO  round(WinY + (h/2)) DO begin
    YgNorm[round(xl),y] := 0;
  end;
end;


с объектами которые попроще все нормально, но чем сложнее объект тем больше лагает((( 
Вроде почитал у вас использовать Bitmap быстрее.... А вот как вопрос не переписывая программу полностью, можно ускорить работу с графикой??? 
Как вот конкретно можно  строчку pic.Canvas.Pixels[round(x),round(WinY/2+R*sin(fi))] := THColor; можно заменить ипользуя bitmap??? 

Это сообщение отредактировал(а) Cheburek - 1.5.2006, 19:41
PM MAIL   Вверх
Kesh
Дата 1.5.2006, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2488
Регистрация: 31.7.2002
Где: Германия, Saarbrü cken

Репутация: 1
Всего: 54



Cheburek, используй функцию scanline... 


--------------------
user posted image
PM MAIL WWW ICQ Skype   Вверх
Cheburek
Дата 1.5.2006, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 26.3.2006

Репутация: нет
Всего: 1



Kesh
вот этим щас и занимался... хоть и меньше но всеравно лагает
Код

procedure OptOs.OFRLinze(h,R,xl,Nsr:real;pic:TImage;k,THColor:integer);
var fi,FiM,xs,x:real;
        y:integer;
    p: PARGB;
begin
    FiM := arcsin((h/(2*R)));
  xs := xl - R*cos(FiM);
    fi:=-FiM;
     IF bmp = nil THEN begin
       bmp := TBitmap.Create;
        bmp.pixelformat := pf24bit;
        bmp.width :=round(R - R*cos(FiM));
        bmp.height := pic.Height;
      end;
    WHILE fi <= FiM DO begin
    x := xs + R*cos(FiM);
    WHILE  x <= (xs + R) DO begin
     IF x < round(xs+R*cos(fi)) THEN begin
    {pic.Canvas.Pixels[round(x),round(WinY/2+R*sin(fi))] := THColor;}
        p := bmp.scanline[round(WinY/2+R*sin(fi))];
        p[round(x-(xs + R*cos(FiM)))].r := 150;
        p[round(x-(xs + R*cos(FiM)))].b := 200;
        p[round(x-(xs + R*cos(FiM)))].g := 10;
        KoafPr[round(x),round(WinY/2+R*sin(fi))] := Nsr;
        YgNorm[round(x),round(WinY/2+R*sin(fi))] := k*fi;
        IF  (R*sin(fi-(1/R)) < 0) and (0<R*sin(fi+(1/R))) THEN begin
         YgNorm[round(x),round(WinY/2+R*sin(fi))] := 0;
        end;
      end;
      x:=x+1;
    end;
    fi:=fi+(1/R);
    end;
  FOR y := round(WinY/2 - (h/2)) TO  round(WinY + (h/2)) DO begin
    YgNorm[round(xl),y] := 0;
  end;
  pic.Canvas.Draw(round(xl),0,bmp);
end;


кстати как перевести TColor -> RGB?  Что вообще в этом коде занимает больше всего времени? 
PM MAIL   Вверх
darkart
Дата 1.5.2006, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 379
Регистрация: 9.11.2005

Репутация: нет
Всего: 31



Цитата(Cheburek @  1.5.2006,  22:54 Найти цитируемый пост)
кстати как перевести TColor -> RGB? 

GetRValue, GetGValue, GetBValue
По мерцанию - рисуй на вспомогательном Canvase, затем копируй 
PM MAIL WWW ICQ Skype GTalk   Вверх
Cheburek
Дата 2.5.2006, 01:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 26.3.2006

Репутация: нет
Всего: 1



Цитата(darkart @  1.5.2006,  23:01 Найти цитируемый пост)
По мерцанию - рисуй на вспомогательном Canvase, затем копируй 

не понял совсем)) как это?
 
PM MAIL   Вверх
Alexeis
Дата 2.5.2006, 08:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Цитата(darkart @  1.5.2006,  22:01 Найти цитируемый пост)
По мерцанию - рисуй на вспомогательном Canvase, затем копируй 

Cheburek, я думаю что речь идет о рисовании на вспомогательном Битмапе, потому что Canvas служит для отображения, а битмап для хранения изображения. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
darkart
Дата 2.5.2006, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 379
Регистрация: 9.11.2005

Репутация: нет
Всего: 31



Ссори, конечно на битмапеsmile 
PM MAIL WWW ICQ Skype GTalk   Вверх
Cheburek
Дата 3.5.2006, 00:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 26.3.2006

Репутация: нет
Всего: 1



darkart,  я вот что-то всеравно не понимаю..
что значит по мерцанию? И чем такой вариант хуже, и вообще чем он отличаеться от вашего?
Код

        p := bmp.scanline[round(WinY/2+R*sin(fi))];    
        p[round(x-(xs + R*cos(FiM)))].r := 150;    
        p[round(x-(xs + R*cos(FiM)))].b := 200;    
        p[round(x-(xs + R*cos(FiM)))].g := 10;
 
а потом так..
Код

        pic.Canvas.Draw(round(xl),0,bmp);
 

Это сообщение отредактировал(а) Cheburek - 3.5.2006, 00:29
PM MAIL   Вверх
Alexeis
Дата 3.5.2006, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Cheburek, конечно же ни чем!
Очень медленно выполняются синус и косинус.
желательно выполнить:
Код

var
 t : integer;
...........
t := round(x-(xs + R*cos(FiM)));
p := bmp.scanline[round(WinY/2+R*sin(fi))];     
p[t].r := 150;     
p[t].b := 200;     
p[t].g := 10;


Для ускорения работы я как правило еще сохраняю адреса всех строк полученных при помощи scnline в отдельный масив, и использую этот массив вместо постоянного вызова донной функции. 
 

Это сообщение отредактировал(а) alexeis1 - 3.5.2006, 09:21


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
vovos
Дата 3.5.2006, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 21.2.2006

Репутация: нет
Всего: нет



Еще вместо ScanLine можеш попробовать API функцию: SetBitmapBits - она перекидывает содержимое масива байт в битмап 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема »


 




[ Время генерации скрипта: 0.0831 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.