Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "KOL";
Текущий архив: 2008.06.22;
Скачать: [xml.tar.bz2];

Вниз

PBitmap   Найти похожие ветки 

 
Robt   (2007-09-20 15:15) [0]

почему рисование на битмапе в памяти методом Bitmap.Canvas.lineto
в коротком цикле (1-256) вызываемом по таймеру каждые 30 мСек
загружает процессор (2х ядерный) до 3% ??

в VCL ничо подобного не возникает ...


 
Robt   (2007-09-20 15:35) [1]

при тех-же действиях с панелью все гут...

цитата из книги:
--------------------------------
2.19.5. Канва и модификация собственного изображения через нее (TBitmap)
Canvas - канва самого объекта изображения, позволяет использовать все возможности объекта канвы, чтобы выполнить рисование на изображении в памяти. Обычно рисование в памяти быстрее, чем непосредственно на контексте окна, и кроме того, если рисовать в окне, то пользователь сможет наблюдать за самим процессом рисования, или по крайней мере, при перерисовках окна будут наблюдаться мелькания. Изображения в памяти как раз часто и используются для того, чтобы предотвратить такое мельтешение: картинка подготавливается на объекте TBitmap в памяти, затем быстро копируется в контекст окна, например, методом Draw объекта TBitmap;
-------------------------------

так где скорость то ?


 
homm ©   (2007-09-20 15:39) [2]

> так где скорость то ?

А где ее недостаток? А вообще, да рисование в видеопамяти быстрее, нежели в ОП.


 
Robt   (2007-09-20 17:21) [3]


> А где ее недостаток?


ты плохо читал наверно


> в VCL ничо подобного не возникает ...


 
homm ©   (2007-09-20 17:27) [4]

Чего подобного? Загрузки процессора на 3% для рисовния 8500 линий за секунду это что, недостаток скорости?
Просто либо ты выпендриваешься, либо задача поставленна не верно, я себе плохо представляю, где может понадобиться стока линий рисовать.


 
ANTPro ©   (2007-09-20 17:30) [5]

Код в студию :)


 
Robt   (2007-09-20 17:43) [6]

30 раз в сек по 256 линий длиной 1-50 пикселей (спектр сигнала) это вобще
не нагрузка для процесора

в битмапе в памяти рисуеца спектр сигнала затем выводится на панель

программа переведена с VCL и там нагрузка нулевая
в коде ошибок нет, проблема именно в lineto (видно если закоментировать строку)
а скорей всего в реализации канваса для битмапа


 
Robt   (2007-09-20 18:17) [7]


> Код в студию :)


да пожалста ...

КОЛ загрузка до 5 %

bitmap:=NewDIBBitmap(256,50,pf24bit);
Timer1.interval:=30;

procedure TForm1.Timer1Timer(Sender: PObj);
var
 I: Integer;
begin
Bitmap.Canvas.Rectangle(0, 0, Bitmap.Width, Bitmap.Height);
for I := 1 to 256 do
begin
Bitmap.Canvas.MoveTo(i,0);
Bitmap.Canvas.LineTo(i,random(50));
end;
BitBlt(PaintBox1.Canvas.Handle, 0, 0, Bitmap.Width, Bitmap.Height, Bitmap.Canvas.Handle, 0, 0, srccopy);
end;

VCL загрузка 0 %

Bitmap:=TBitmap.Create;
Bitmap.Width:=256;
Bitmap.Height:=50;
Bitmap.PixelFormat:=pf24bit;
Timer1.interval:=30;

procedure TForm1.Timer1Timer(Sender: TObject);
var
 I: Integer;
begin
Bitmap.Canvas.Rectangle(0, 0, Bitmap.Width, Bitmap.Height);
for I := 1 to 256 do
begin
Bitmap.Canvas.MoveTo(i,0);
Bitmap.Canvas.LineTo(i,random(50));
end;
BitBlt(PaintBox1.Canvas.Handle, 0, 0, Bitmap.Width, Bitmap.Height, Bitmap.Canvas.Handle, 0, 0, srccopy);
end;


 
Vladimir Kladov ©   (2007-09-20 20:42) [8]

Я почему-то думаю, что битмап и канва тут практически не при чем. Чему там быть медленнее, сами посудите. А вот что в KOL действительно медленное - это обработка сообщений. На крайний случай попробуйте таймер устанавливать вручную, без TTimer (просто SetTimer, c Callback"ом, чтобы он через сообщения не ходил).


 
homm ©   (2007-09-20 21:30) [9]

procedure TForm1.KOLForm1FormCreate(Sender: PObj);
begin
bitmap:=NewDIBBitmap(256,50,pf24bit);
Timer1.interval:=1;
Timer2.interval:=1000;
end;

procedure TForm1.Timer1Timer(Sender: PObj);
var
I: Integer;
begin
Bitmap.Canvas.Rectangle(0, 0, Bitmap.Width, Bitmap.Height);
for I := 1 to 256 do
begin
Bitmap.Canvas.MoveTo(i,0);
Bitmap.Canvas.LineTo(i,random(50));
end;
BitBlt(PaintBox1.Canvas.Handle, 0, 0, Bitmap.Width, Bitmap.Height, Bitmap.Canvas.Handle, 0, 0, srccopy);
n := n + 1;
end;

procedure TForm1.Timer2Timer(Sender: PObj);
begin
form.Caption := int2str(n);
n := 0;
end;


Первый таймер Multimedia=true; В заголовек выводит от 999 до 1006 срабатываний в секунду, загрузка процессора от 0 до 2 %. Sempron 2400MHz GF7600GT. Пробовал ПАС и АСМ версии, инвариантно. Советую также, если собираетесь с пикселями напрямую рботать, поставить pf32bit, а если нет, то и вовсе NewBitmap. Как я уже говорил, работа с функйиями канвы быстрее все-же на аппаратном ускорении.


 
Robt   (2007-09-21 20:03) [10]


> Я почему-то думаю, что битмап и канва тут практически не
> при чем. Чему там быть медленнее, сами посудите. А вот что
> в KOL действительно медленное - это обработка сообщений.
>  На крайний случай попробуйте таймер устанавливать вручную,
>  без TTimer (просто SetTimer, c Callback"ом, чтобы он через
> сообщения не ходил).

да при чом тут сообщения и таймер? их всего 30 в секунду
это просто пример (но гонит также)
на самом деле все происходит в потоке
если я просто закоментирую строку с Bitmap.Canvas.LineTo нагрузка сразу до 0 падает
если выважу непосредственно на PaintBox1.Canvas тоже нулевая нагрузка


 
Vladimir Kladov ©   (2007-09-21 21:24) [11]

Я смотрел оба примера. Не на 2х процессорном, на мультитредном. Никакой разницы на глаз не видно. Змейка абсолютно одинаковая между 0 и 2%. А вы из-под Delphi смотрите?


 
homm ©   (2007-09-21 21:27) [12]

> [10] Robt   (21.09.07 20:03)

Ты сечас о чем ведешь разговор? Разве я тебе не привел пример, что то-же самое, что и у тебя рисуется не 30 а 1000 раз в секунду с оконулевой загрузкой процессора? Какие у тебя еше остались вопросы?


 
Robt   (2007-09-21 21:41) [13]


> Я смотрел оба примера. Не на 2х процессорном, на мультитредном.
>  Никакой разницы на глаз не видно. Змейка абсолютно одинаковая
> между 0 и 2%. А вы из-под Delphi смотрите?


я уже по всякому смотрел
прикол в том что мой примитивный пример седня не грузит !?!?
homm-овский грузит на 5 %
а моя прога так и грузит все в тойже строке с Bitmap.Canvas.LineTo

этот кол своей жизнью живет чоли ? или тока у автора все ОК ?


 
homm ©   (2007-09-21 21:44) [14]

> [13] Robt   (21.09.07 21:41)
> homm-овский грузит на 5 %

Память DDR-1, видимо потому так много. У меня DDR-II 600.


 
homm ©   (2007-09-21 21:46) [15]

> [13] Robt   (21.09.07 21:41)
> этот кол своей жизнью живет чоли ?

Вообще, я не понимаю что ты видищьс транного, смотря на показания прибора, погрешность которого равна ибольше результатов измернения. Вот вруби на полную катушку LineTo в цикле оборотов эдак на мильон, и время измерь, вот тогда поговрим.


 
homm ©   (2007-09-21 22:03) [16]

Ха, а ведь автороказался прав, разница была более чем в 5 раз, пока я не подправил код так:

var
 bitmap: PBitmap;
 i, j, t: Integer;
begin
 bitmap := NewDIBBitmap(256,50,pf32bit);
 T := GetTickCount();
 for j := 1 to 10000 do begin
   Bitmap.Canvas.Rectangle(0, 0, Bitmap.Width, Bitmap.Height);
   with Bitmap.Canvas^ do
   for I := 0 to 255 do begin
     MoveTo(i,0);
     LineTo(i,random(50));
   end;
   BitBlt(PaintBox1.Canvas.Handle, 0, 0, Bitmap.Width, Bitmap.Height, Bitmap.Canvas.Handle, 0, 0, srccopy);
 end;
 ShowMessage(int2str(GetTickCount()-T));
 bitmap.Free;


 
Vladimir Kladov ©   (2007-09-22 10:50) [17]

Тогда уже вот так, вообще нет разницы.

var
bitmap1: PBitmap;
i, j, t: Integer;
C: PCanvas;
begin
bitmap1 := NewDIBBitmap(256,50,pf32bit);
T := GetTickCount();
for j := 1 to 10000 do
begin
  C := Bitmap1.Canvas;
  C.Rectangle(0, 0, 256, 50);
  for I := 0 to 255 do
  begin
    C.MoveTo(i,0);
    C.LineTo(i,random(50));
  end;
  BitBlt( PaintBox1.Canvas.Handle, 0, 0, 256, 50,
          C.Handle, 0, 0, srccopy);
end;
ShowMessage(int2str(GetTickCount()-T));
bitmap1.Free;
end;


У нас канва долго получается. Зато код меньше.


 
homm ©   (2007-09-22 11:07) [18]

> [17] Vladimir Kladov ©   (22.09.07 10:50)
> Зато код меньше.

Сомнительный плюс :)

Тогда уж так, еще быстрее чем VCL

var
bitmap1: PBitmap;
i, j, t: Integer;
h: THandle;
begin
bitmap1 := NewDIBBitmap(256,50,pf32bit);
T := GetTickCount();
for j := 1 to 10000 do
begin
 h := Bitmap1.Canvas.Handle;
 Rectangle(h, 0, 0, 256, 50);
 for I := 0 to 255 do
 begin
   MoveToEx(h, i, 0, nil);
   LineTo(h, i,random(50));
 end;
 BitBlt( PaintBox1.Canvas.Handle, 0, 0, 256, 50,
         h, 0, 0, srccopy);
end;
ShowMessage(int2str(GetTickCount()-T));
bitmap1.Free;
end;


 
Robt   (2007-09-22 12:14) [19]

пока ваш код не проверял т.к. только что обнаружил невероятный тупняк

1)значит запущены только мои примитивы на КОЛ и VCL в чистой тестовой винде, нагрузка  у обоих 0

> Robt   (20.09.07 18:17) [7]


2)как только я запускаю свою програму у примитива КОЛ 4% у примитива VCL 0% ?!?!

3)методом Тыка я определил что на это повлияла инициализация DirectSound и других вещей для работы со звуком используемых моей програмой

4)и действительно при запуске некоторых медиа плееров типа Media Player Classic, Aimp и др. вместе с примитивами картина таже самая ?!?!

так вот вопрос как в принципе ???
может влиять работа со звуком одной программы на работу Bitmap другой программы сделаной в КОЛ и не влиять вобще на VCL....


 
Robt   (2007-09-22 12:39) [20]


> homm ©   (22.09.07 11:07) [18]


взял код отсюда - все ОК :)
всетаки я был прав...
косяк имено при работе методов канваса с битмапом, а через АПИ все гут


 
homm ©   (2007-09-22 12:41) [21]

> [19] Robt   (22.09.07 12:14)
> может влиять работа со звуком

Эффект бабочки? :)

Я так понимаю, тебе уже не интересно непосредственно само рисование с большой скоростью?


 
Robt   (2007-09-22 13:26) [22]


> Я так понимаю, тебе уже не интересно непосредственно само
> рисование с большой скоростью?

нууу как сказать , интересно конечно
так как этот пример мизер того что мне надо.

на данный момент мне важней чтоб КОЛовская версия работала как минимум не тормозней VCLовской и без всяких эффектов бабочки , ведь нафига он тогда нужен...



Страницы: 1 вся ветка

Форум: "KOL";
Текущий архив: 2008.06.22;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.046 c
2-1211781195
MVN
2008-05-26 09:53
2008.06.22
InputBox


2-1211875062
AlekseyB
2008-05-27 11:57
2008.06.22
Как программно сделать даблклик на DBGrid


2-1212039243
brother
2008-05-29 09:34
2008.06.22
имеет ли смысл задержка?


15-1210171008
fics
2008-05-07 18:36
2008.06.22
Как срубить капусты?


2-1211800811
Fr1K
2008-05-26 15:20
2008.06.22
Поиск в файле





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский