Форум: "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)
> Зато код меньше.
Сомнительный плюс :)
Тогда уж так, еще быстрее чем VCLvar
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