Конференция "Прочее" » рисование в PaintBox на слабый ПК
 
  • aka © (12.09.16 18:05) [0]
    Дописал недавно программу, где один из модулей отрисовует графики в PaintBox. На "нормальных" Пк все работает отлично. Но есть у меня старый системный блок:

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



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

    Получается, что никуда от этого не деться? И причина всему маленькая видео память. Но все ж хочется чтоб везде было красиво.
  • NoUser © (12.09.16 20:29) [1]
    Есть старый трюк - затирать (рисовать фоновым) только то, что нарисовал перед этим, а не заливать фон. Ну и сделать вывод через промежуточную канву.

    А видео памяти там достаточно.
  • aka © (12.09.16 21:50) [2]
    Ну рисовать в Bitmap, а затем BitBlt копировать - понятно. А вот про первое ничего не понял, поподробней можно?
  • Игорь Шевченко © (12.09.16 22:28) [3]

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


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

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

    хороший пример ;)
  • NoUser © (12.09.16 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 © (12.09.16 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

    Всё сходится - весь прогресс-с в картинку!
  • Игорь Шевченко © (12.09.16 23:18) [7]
    NoUser ©   (12.09.16 22:58) [6]


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


    Это EGA, VGA была минимум 320х200х8бит и видеопамяти было минимум 64к
  • kilkennycat © (13.09.16 02:56) [8]

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

    я примерно так же прикинул, но еще добавил всяких левых процессов в современном, и получил, что 286 быстрее.
  • Pavia © (13.09.16 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 © (13.09.16 15:10) [10]
    > kilkennycat ©   (13.09.16 02:56) [8]
    Во-во, такое вот прозрение ))

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

    Так что
    > анализировать OnPaint на "тяжелый код"
    таки придется
  • Игорь Шевченко © (13.09.16 16:52) [11]
    Pavia ©   (13.09.16 07:50) [9]


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


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


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


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


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


    Вы, сударь, перестаньте чепуху говорить. Надоели.
  • Pavia © (13.09.16 18:18) [12]

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

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


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

    Учтём-с. Думал слова "вывод" и "запись" синонимы и не у кого не появится претензий.
  • aka © (17.09.16 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 © (17.09.16 19:41) [14]

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

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

    Тест у вас неправильный. Вы не указали размеры PaintBox, а от этого результат будет зависеть.
  • Pavia © (17.09.16 19:43) [15]
    Ну вот опять Игорь придёт будет ругаться на мою грамотность. Хочу редактирование постов!
  • NoUser © (17.09.16 19:51) [16]
    Не знал, что ака программисты так просто сдаются ))

    Слушай, а может ты перепутал - PaintBox1Paint(Sender); с PaintBox1.Repaint;
    47ms VS 2047ms таки нормальный прирост фпс-ов, не?
  • Inovet © (17.09.16 20:39) [17]
    > [14] Pavia ©   (17.09.16 19:41)
    > видео карта без 2D ускорителя только АЦП и память

    Это ты сейчас о чём говорил?
  • kilkennycat © (18.09.16 21:49) [18]

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

    видеовход, вероятно :)
  • NoUser © (18.09.16 22:46) [19]
    может это (АЦС)
    http://www.ngpedia.ru/id424302p1.html ))
  • kilkennycat © (18.09.16 22:50) [20]

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

    тебе смешно,а мне приходилось игрушки писать, где только ацс и было :)
  • NoUser © (19.09.16 00:36) [21]
    нет, весело, помню как 'рисовал' свои шрифты и 'учил' ESC/P2 принтеры их печатать,
    так сказать, "история о 9-ти иголках" 8-)
 
Конференция "Прочее" » рисование в PaintBox на слабый ПК
Есть новые Нет новых   [134431   +13][b:0][p:0.002]