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

Вниз

рисование в PaintBox на слабый ПК   Найти похожие ветки 

 
aka ©   (2016-09-12 18:05) [0]

Дописал недавно программу, где один из модулей отрисовует графики в PaintBox. На "нормальных" Пк все работает отлично. Но есть у меня старый системный блок:

0,8 Celeron
256 ОЗУ
32мб Видео


Где все жутко тормозит при перерисовке.
Я было кинулся анализировать OnPaint на "тяжелый код", но как оказалось, дело совсем не в этом. Потому что тормоза идут только в полно экранном режиме.

Получается, что никуда от этого не деться? И причина всему маленькая видео память. Но все ж хочется чтоб везде было красиво.


 
NoUser ©   (2016-09-12 20:29) [1]

Есть старый трюк - затирать (рисовать фоновым) только то, что нарисовал перед этим, а не заливать фон. Ну и сделать вывод через промежуточную канву.

А видео памяти там достаточно.


 
aka ©   (2016-09-12 21:50) [2]

Ну рисовать в Bitmap, а затем BitBlt копировать - понятно. А вот про первое ничего не понял, поподробней можно?


 
Игорь Шевченко ©   (2016-09-12 22:28) [3]


>
> 0,8 Celeron
> 256 ОЗУ
> 32мб Видео
>
> Где все жутко тормозит при перерисовке.


В свое время я играл в графические игрушки в полноэкранном режиме на 286 с 1 мб памяти и стандартной видеопамяти VGA (не помню, сколько). И ничего, как ни странно, не тормозило, хотя сцена перерисовывалась.
Может, кроме характеристик железа еще и код привести, чтобы было чего диагностировать ?


 
kilkennycat ©   (2016-09-12 22:34) [4]


> Игорь Шевченко ©   (12.09.16 22:28) [3]

хороший пример ;)


 
NoUser ©   (2016-09-12 22:37) [5]

Поправка
> *Ну или сделать вывод через промежуточную канву

Например

if fFirstFrame then begin
Brush.Color := clBlack;
FillRect(rcMaxArea);
end else
Pen.Color := clBlack;
MoveTo(xOldWhite0,yOldWhite0);
LineTo(xOldWhite1,yOldWhite1);
// Pen.Color := clBlack;
MoveTo(xOldRed0,yOldRed0);
LineTo(xOldRed1,yOldRed1);
// Pen.Color := clBlack;
MoveTo(xOldBlue0,yOldBlue0);
LineTo(xOldBlue1,yOldBlue1);
end;

Pen.Color := clWhite;
MoveTo(xNewWhite0,yNewWhite0);
LineTo(xNewWhite1,yNewWhite1);

Pen.Color := clRed;
MoveTo(xNewRed0,yNewRed0);
LineTo(xNewRed1,yNewRed1);

Pen.Color := clBlue;
MoveTo(xNewBlue0,yNewBlue0);
LineTo(xNewBlue1,yNewBlue1);

//

xOldWhite0 := xNewWhite0;
xOldWhite1 := xNewWhite1;
yOldWhite0 := yNewWhite0;
yOldWhite1 := yNewWhite1;

xOldRed0 := xNewRed0;
xOldRed1 := xNewRed1;
yOldRed0 := yNewRed0;
yOldRed1 := yNewRed1;

xOldBlue0 := xNewBlue0;
xOldBlue1 := xNewBlue1;
yOldBlue0 := yNewBlue0;
yOldBlue1 := yNewBlue1;


Ну и можно через Winapi а не Canvas.


 
NoUser ©   (2016-09-12 22:58) [6]

> Игорь Шевченко ©   (12.09.16 22:28) [3]
;))

xV => 320x200 x 4bit = 32000 byte VRAM
yV => 1024x768 x 32bit = 3145728 byte VRAM

xC => 286 x 8 MHz
yC => 686 x 800 MHz

yC/xC = 100
yV/xV ~ 100

Всё сходится - весь прогресс-с в картинку!


 
Игорь Шевченко ©   (2016-09-12 23:18) [7]

NoUser ©   (12.09.16 22:58) [6]


> xV => 320x200 x 4bit = 32000 byte VRAM


Это EGA, VGA была минимум 320х200х8бит и видеопамяти было минимум 64к


 
kilkennycat ©   (2016-09-13 02:56) [8]


> NoUser ©   (12.09.16 22:58) [6]

я примерно так же прикинул, но еще добавил всяких левых процессов в современном, и получил, что 286 быстрее.


 
Pavia ©   (2016-09-13 07:50) [9]

>kilkennycat ©   (13.09.16 02:56) [8]
>> NoUser ©   (12.09.16 22:58) [6]
У того целерона видео шина в 40 раз быстрее. Т.е. если на 286 вывод 1 байт занимал 75- 100 тактов
pci/agp прокачивает 40 байт за тежи 100-150 тактов ЦП.
Откуда имеем что обновление всего экрана на 286 было 1-1,5 fps.
На целероне 40-60 fps. (Если видеокарта AGP1.0 то 8 раз меньше)

У современных ПК на pcie скорость ещё выше 160 - 240 fps
На 286 ускорение достигали тем, что перерисовывали только часть экрана. А вот на целероне в играх разрешение 1024х768 было редкостью обычно 800х600. На видео карте с 2d ускорителем спрайты кэшировались в видео памяти.


 
NoUser ©   (2016-09-13 15:10) [10]

> kilkennycat ©   (13.09.16 02:56) [8]
Во-во, такое вот прозрение ))

> Pavia ©   (13.09.16 07:50) [9]
> 286 вывод 1 байт занимал 75- 100 тактов
Ну не знаю, помню диггер на EC7978 (~2MHz) рисовал новый уровень точно быстрее секунды.

Так что
> анализировать OnPaint на "тяжелый код"
таки придется


 
Игорь Шевченко ©   (2016-09-13 16:52) [11]

Pavia ©   (13.09.16 07:50) [9]


> Откуда имеем что обновление всего экрана на 286 было 1-1,
> 5 fps.


А ничего, что обновлением экрана занимался видеоадаптер ? :)


> Т.е. если на 286 вывод 1 байт занимал 75- 100 тактов


Вы, сударь, чепуху говорите. Вывод байта никак не связан с записью в видеопамять.


> На 286 ускорение достигали тем, что перерисовывали только
> часть экрана


Вы, сударь, перестаньте чепуху говорить. Надоели.


 
Pavia ©   (2016-09-13 18:18) [12]


> А ничего, что обновлением экрана занимался видеоадаптер
> ? :)

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


> Вы, сударь, чепуху говорите. Вывод байта никак не связан
> с записью в видеопамять.

Учтём-с. Думал слова "вывод" и "запись" синонимы и не у кого не появится претензий.


 
aka ©   (2016-09-17 18:16) [13]


> Так что
> > анализировать OnPaint на "тяжелый код"
> таки придется

Таки видать не судьба рисовать в paintbox на таком худом железе, перерисовывать только часть екрана - не хочу мучатся.
А вот если полностью перерисовывать BITMAP, то есть сначала его стирать PatBlt,  затем все нарисовать и скопировать BitBlt, то по времени оно примерно одинаково с PaintBox.Repaint .    

на любом "нормальном" ПК среднее время 2 сек. На "слабом" 1 мин 10 сек. Так что хоть что делай нормально там работать ничего не будет, зато нашелся отличный копм для тестирования.
unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, ExtCtrls, StdCtrls, Buttons;

type
 TForm1 = class(TForm)
   Panel1: TPanel;
   PaintBox1: TPaintBox;
   SpeedButton1: TSpeedButton;
   procedure PaintBox1Paint(Sender: TObject);
   procedure FormCreate(Sender: TObject);
   procedure SpeedButton1Click(Sender: TObject);ф
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
 PaintBox1.Canvas.MoveTo(0,0);
 PaintBox1.Canvas.LineTo(1000,1000);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 DoubleBuffered := True;
end;

procedure TForm1.SpeedButton1Click(Sender: TObject);
var
 i: Integer;
begin
 for i := 0 to 1000 do PaintBox1.Repaint;
 ShowMessage("ok");
end;

end.


 
Pavia ©   (2016-09-17 19:41) [14]


> На "слабом" 1 мин 10 сек.

У меня на работе аналогичный случай был в том году. Новый комп, оказалось видео карта без 2D ускорителя только АЦП и память. Тест показывал 10 FPS, но на обработку уходило половина производительности процессора. По идеи всё должно было работать, но программа или система всё равно лагала. Поэтому оставили только обработку без отображения.

Тест у вас неправильный. Вы не указали размеры PaintBox, а от этого результат будет зависеть.


 
Pavia ©   (2016-09-17 19:43) [15]

Ну вот опять Игорь придёт будет ругаться на мою грамотность. Хочу редактирование постов!


 
NoUser ©   (2016-09-17 19:51) [16]

Не знал, что ака программисты так просто сдаются ))

Слушай, а может ты перепутал - PaintBox1Paint(Sender); с PaintBox1.Repaint;
47ms VS 2047ms таки нормальный прирост фпс-ов, не?


 
Inovet ©   (2016-09-17 20:39) [17]

> [14] Pavia ©   (17.09.16 19:41)
> видео карта без 2D ускорителя только АЦП и память

Это ты сейчас о чём говорил?


 
kilkennycat ©   (2016-09-18 21:49) [18]


> Inovet ©   (17.09.16 20:39) [17]

видеовход, вероятно :)


 
NoUser ©   (2016-09-18 22:46) [19]

может это (АЦС)
http://www.ngpedia.ru/id424302p1.html ))


 
kilkennycat ©   (2016-09-18 22:50) [20]


> NoUser ©   (18.09.16 22:46) [19]

тебе смешно,а мне приходилось игрушки писать, где только ацс и было :)


 
NoUser ©   (2016-09-19 00:36) [21]

нет, весело, помню как "рисовал" свои шрифты и "учил" ESC/P2 принтеры их печатать,
так сказать, "история о 9-ти иголках" 8-)



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

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

Наверх





Память: 0.5 MB
Время: 0.003 c
15-1473692722
aka
2016-09-12 18:05
2018.08.12
рисование в PaintBox на слабый ПК


6-1286219600
olevacho_
2010-10-04 23:13
2018.08.12
TIDHTTPclient и потоки


4-1289571945
Vidog
2010-11-12 17:25
2018.08.12
Отрисовка на рабочем столе


2-1468763108
Alex79
2016-07-17 16:45
2018.08.12
chromium не заполняется выпадающий список


15-1474119240
Fox
2016-09-17 16:34
2018.08.12
Буратино





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский