![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
PBitmap [Delphi, Windows]
Robt © (2007-09-20 15:15:00)почему рисование на битмапе в памяти методом Bitmap.Canvas.lineto
в коротком цикле (1-256) вызываемом по таймеру каждые 30 мСек
загружает процессор (2х ядерный) до 3% ??
в VCL ничо подобного не возникает ...
Robt (2007-09-22 13:26:00) [1]
> Я так понимаю, тебе уже не интересно непосредственно само
> рисование с большой скоростью?
нууу как сказать , интересно конечно
так как этот пример мизер того что мне надо.
на данный момент мне важней чтоб КОЛовская версия работала как минимум не тормозней VCLовской и без всяких эффектов бабочки , ведь нафига он тогда нужен...
homm (2007-09-22 12:41:00) [2]> [19] Robt (22.09.07 12:14)
> может влиять работа со звуком
Эффект бабочки? :)
Я так понимаю, тебе уже не интересно непосредственно само рисование с большой скоростью?
Robt (2007-09-22 12:39:00) [3]
> homm © (22.09.07 11:07) [18]
взял код отсюда - все ОК :)
всетаки я был прав...
косяк имено при работе методов канваса с битмапом, а через АПИ все гут
Robt (2007-09-22 12:14:00) [4]пока ваш код не проверял т.к. только что обнаружил невероятный тупняк
1)значит запущены только мои примитивы на КОЛ и VCL в чистой тестовой винде, нагрузка у обоих 0
> Robt (20.09.07 18:17) [7]
2)как только я запускаю свою програму у примитива КОЛ 4% у примитива VCL 0% ?!?!
3)методом Тыка я определил что на это повлияла инициализация DirectSound и других вещей для работы со звуком используемых моей програмой
4)и действительно при запуске некоторых медиа плееров типа Media Player Classic, Aimp и др. вместе с примитивами картина таже самая ?!?!
так вот вопрос как в принципе ???
может влиять работа со звуком одной программы на работу Bitmap другой программы сделаной в КОЛ и не влиять вобще на VCL....
homm (2007-09-22 11:07:00) [5]> [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;
Vladimir Kladov (2007-09-22 10:50:00) [6]Тогда уже вот так, вообще нет разницы.
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-21 22:03:00) [7]Ха, а ведь автороказался прав, разница была более чем в 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;
homm (2007-09-21 21:46:00) [8]> [13] Robt (21.09.07 21:41)
> этот кол своей жизнью живет чоли ?
Вообще, я не понимаю что ты видищьс транного, смотря на показания прибора, погрешность которого равна ибольше результатов измернения. Вот вруби на полную катушку LineTo в цикле оборотов эдак на мильон, и время измерь, вот тогда поговрим.
homm (2007-09-21 21:44:00) [9]> [13] Robt (21.09.07 21:41)
> homm-овский грузит на 5 %
Память DDR-1, видимо потому так много. У меня DDR-II 600.
Robt (2007-09-21 21:41:00) [10]
> Я смотрел оба примера. Не на 2х процессорном, на мультитредном.
> Никакой разницы на глаз не видно. Змейка абсолютно одинаковая
> между 0 и 2%. А вы из-под Delphi смотрите?
я уже по всякому смотрел
прикол в том что мой примитивный пример седня не грузит !?!?
homm-овский грузит на 5 %
а моя прога так и грузит все в тойже строке с Bitmap.Canvas.LineTo
этот кол своей жизнью живет чоли ? или тока у автора все ОК ?
homm (2007-09-21 21:27:00) [11]> [10] Robt (21.09.07 20:03)
Ты сечас о чем ведешь разговор? Разве я тебе не привел пример, что то-же самое, что и у тебя рисуется не 30 а 1000 раз в секунду с оконулевой загрузкой процессора? Какие у тебя еше остались вопросы?
Vladimir Kladov (2007-09-21 21:24:00) [12]Я смотрел оба примера. Не на 2х процессорном, на мультитредном. Никакой разницы на глаз не видно. Змейка абсолютно одинаковая между 0 и 2%. А вы из-под Delphi смотрите?
Robt (2007-09-21 20:03:00) [13]
> Я почему-то думаю, что битмап и канва тут практически не
> при чем. Чему там быть медленнее, сами посудите. А вот что
> в KOL действительно медленное - это обработка сообщений.
> На крайний случай попробуйте таймер устанавливать вручную,
> без TTimer (просто SetTimer, c Callback'ом, чтобы он через
> сообщения не ходил).
да при чом тут сообщения и таймер? их всего 30 в секунду
это просто пример (но гонит также)
на самом деле все происходит в потоке
если я просто закоментирую строку с Bitmap.Canvas.LineTo нагрузка сразу до 0 падает
если выважу непосредственно на PaintBox1.Canvas тоже нулевая нагрузка
homm (2007-09-20 21:30:00) [14]
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. Как я уже говорил, работа с функйиями канвы быстрее все-же на аппаратном ускорении.
Vladimir Kladov (2007-09-20 20:42:00) [15]Я почему-то думаю, что битмап и канва тут практически не при чем. Чему там быть медленнее, сами посудите. А вот что в KOL действительно медленное - это обработка сообщений. На крайний случай попробуйте таймер устанавливать вручную, без TTimer (просто SetTimer, c Callback'ом, чтобы он через сообщения не ходил).
Robt (2007-09-20 18:17:00) [16]
> Код в студию :)
да пожалста ...
КОЛзагрузка до 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;
Robt (2007-09-20 17:43:00) [17]30 раз в сек по 256 линий длиной 1-50 пикселей (спектр сигнала) это вобще
не нагрузка для процесора
в битмапе в памяти рисуеца спектр сигнала затем выводится на панель
программа переведена с VCL и там нагрузка нулевая
в коде ошибок нет, проблема именно в lineto (видно если закоментировать строку)
а скорей всего в реализации канваса для битмапа
ANTPro (2007-09-20 17:30:00) [18]Код в студию :)
homm (2007-09-20 17:27:00) [19]Чего подобного? Загрузки процессора на 3% для рисовния 8500 линий за секунду это что, недостаток скорости?
Просто либо ты выпендриваешься, либо задача поставленна не верно, я себе плохо представляю, где может понадобиться стока линий рисовать.
Robt (2007-09-20 17:21:00) [20]
> А где ее недостаток?
ты плохо читал наверно
> в VCL ничо подобного не возникает ...