Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.06.22;
Скачать: CL | DM;

Вниз

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 вся ветка

Текущий архив: 2008.06.22;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.018 c
2-1211880081
prohoney
2008-05-27 13:21
2008.06.22
Даны 8 целых чисел размером 1 байт.


15-1210213823
Slider007
2008-05-08 06:30
2008.06.22
С днем рождения ! 8 мая 2008 четверг


2-1211781195
MVN
2008-05-26 09:53
2008.06.22
InputBox


2-1211885645
Alik
2008-05-27 14:54
2008.06.22
Управление ScrollBar в TStringGrid


15-1210570323
Юрий Зотов
2008-05-12 09:32
2008.06.22
Защита ПК