Головна сторінка
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.64 MB
Час: 0.02 c
15-1473692722
ака
2016-09-12 18:05
2018.08.12
малювання в PaintBox на слабкий ПК


15-1474119240
Лисиця
2016-09-17 16:34
2018.08.12
Буратіно


2-1468763108
Alex79
2016-07-17 16:45
2018.08.12
chromium не заповнюється, що випадає


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


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





африкаанс албанський арабська вірменин азербайджанець баскський білоруський болгарська каталонський Китайська (спрощене письмо) Китайський традиційний) хорватський чеська данську мову нідерландський Ukranian естонець Філіппінська фінську мову французький
галісійська грузинський німецький грецький гаїтянський креольський давньоєврейську хінді угорський ісландський індонезієць ірландський італійський японський корейський латиська литовець македонець малайський мальтійський норвежець
перс полірування португальська румунський російська сербський словацький словенський іспанська суахілі шведську мову тайський турецька український урду в'єтнамський валлійський ідиш бенгальський боснійський
кебуано есперанто гуджараті хауса хмонг ігбо яванський каннада кхмерская Лао латинь маорі маратхі монгольський непальська панджабі сомалійський тамільська телугу йоруба
зулуський
Англійська Французький Німецький Італійський Португальська Русский Іспанська