-
Дописал недавно программу, где один из модулей отрисовует графики в PaintBox. На "нормальных" Пк все работает отлично. Но есть у меня старый системный блок: 0,8 Celeron
256 ОЗУ
32мб Видео Где все жутко тормозит при перерисовке. Я было кинулся анализировать OnPaint на "тяжелый код", но как оказалось, дело совсем не в этом. Потому что тормоза идут только в полно экранном режиме. Получается, что никуда от этого не деться? И причина всему маленькая видео память. Но все ж хочется чтоб везде было красиво.
-
Есть старый трюк - затирать (рисовать фоновым) только то, что нарисовал перед этим, а не заливать фон. Ну и сделать вывод через промежуточную канву.
А видео памяти там достаточно.
-
Ну рисовать в Bitmap, а затем BitBlt копировать - понятно. А вот про первое ничего не понял, поподробней можно?
-
> > 0,8 Celeron > 256 ОЗУ > 32мб Видео > > Где все жутко тормозит при перерисовке.
В свое время я играл в графические игрушки в полноэкранном режиме на 286 с 1 мб памяти и стандартной видеопамяти VGA (не помню, сколько). И ничего, как ни странно, не тормозило, хотя сцена перерисовывалась. Может, кроме характеристик железа еще и код привести, чтобы было чего диагностировать ?
-
> Игорь Шевченко © (12.09.16 22:28) [3]
хороший пример ;)
-
Поправка > *Ну или сделать вывод через промежуточную канву Например
if fFirstFrame then begin
Brush.Color := clBlack;
FillRect(rcMaxArea);
end else
Pen.Color := clBlack;
MoveTo(xOldWhite0,yOldWhite0);
LineTo(xOldWhite1,yOldWhite1);
MoveTo(xOldRed0,yOldRed0);
LineTo(xOldRed1,yOldRed1);
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.
-
> Игорь Шевченко © (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
Всё сходится - весь прогресс-с в картинку!
-
NoUser © (12.09.16 22:58) [6]
> xV => 320x200 x 4bit = 32000 byte VRAM
Это EGA, VGA была минимум 320х200х8бит и видеопамяти было минимум 64к
-
> NoUser © (12.09.16 22:58) [6]
я примерно так же прикинул, но еще добавил всяких левых процессов в современном, и получил, что 286 быстрее.
-
>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 ускорителем спрайты кэшировались в видео памяти.
-
> kilkennycat © (13.09.16 02:56) [8] Во-во, такое вот прозрение ))
> Pavia © (13.09.16 07:50) [9] > 286 вывод 1 байт занимал 75- 100 тактов Ну не знаю, помню диггер на EC7978 (~2MHz) рисовал новый уровень точно быстрее секунды.
Так что > анализировать OnPaint на "тяжелый код" таки придется
-
Pavia © (13.09.16 07:50) [9]
> Откуда имеем что обновление всего экрана на 286 было 1-1, > 5 fps.
А ничего, что обновлением экрана занимался видеоадаптер ? :)
> Т.е. если на 286 вывод 1 байт занимал 75- 100 тактов
Вы, сударь, чепуху говорите. Вывод байта никак не связан с записью в видеопамять.
> На 286 ускорение достигали тем, что перерисовывали только > часть экрана
Вы, сударь, перестаньте чепуху говорить. Надоели.
-
> А ничего, что обновлением экрана занимался видеоадаптер > ? :)
Ох, и вопросы у вас с подковыркой. Я имел ввиду тот термин который не имеет общего названия. Думаю кто хотел понять поняли, что речь про устройство задержки ограниченное рамками экрана расположенного в видеопамяти - кадр экрана или холст экрана.
> Вы, сударь, чепуху говорите. Вывод байта никак не связан > с записью в видеопамять.
Учтём-с. Думал слова "вывод" и "запись" синонимы и не у кого не появится претензий.
-
> Так что > > анализировать 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
public
end;
var
Form1: TForm1;
implementation
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.
-
> На "слабом" 1 мин 10 сек.
У меня на работе аналогичный случай был в том году. Новый комп, оказалось видео карта без 2D ускорителя только АЦП и память. Тест показывал 10 FPS, но на обработку уходило половина производительности процессора. По идеи всё должно было работать, но программа или система всё равно лагала. Поэтому оставили только обработку без отображения.
Тест у вас неправильный. Вы не указали размеры PaintBox, а от этого результат будет зависеть.
-
Ну вот опять Игорь придёт будет ругаться на мою грамотность. Хочу редактирование постов!
-
Не знал, что ака программисты так просто сдаются ))
Слушай, а может ты перепутал - PaintBox1Paint(Sender); с PaintBox1.Repaint; 47ms VS 2047ms таки нормальный прирост фпс-ов, не?
-
> [14] Pavia © (17.09.16 19:41) > видео карта без 2D ускорителя только АЦП и память
Это ты сейчас о чём говорил?
-
> Inovet © (17.09.16 20:39) [17]
видеовход, вероятно :)
-
-
> NoUser © (18.09.16 22:46) [19]
тебе смешно,а мне приходилось игрушки писать, где только ацс и было :)
-
нет, весело, помню как 'рисовал' свои шрифты и 'учил' ESC/P2 принтеры их печатать, так сказать, "история о 9-ти иголках" 8-)
|