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

Вниз

быстрая работа с графикой без DirectX и OpenGL   Найти похожие ветки 

 
delphiForever   (2007-09-04 18:59) [0]

как можна быстро работать с графикой без DirectX и OpenGL. Вот например ниже есть код быстрой работы с графикой, кругом куча подобных примеров.
В чем его секрет ума не преложу, рисовать "всякую левоту" или по пикселям картинку 1240*768 в цыкле задав перед етим каждый цвет пикселя константой и вручную?
Как тогда заменить стандартные CopyRect, StrechDraw или Draw и зачем? Ведь они и так быстро работают. Или использовать WinApi напрямую.
Зачем етот пример быстрой работы и как его использовать если его можно использовать с пользой?


unit Unit1;

interface

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

type
TBig = array[0..0] of Integer;
type
 TForm1 = class(TForm)
   Timer1: TTimer;
   procedure FormCreate(Sender: TObject);
   procedure FormDestroy(Sender: TObject);
   procedure FormResize(Sender: TObject);
   procedure Timer1Timer(Sender: TObject);
   procedure FormPaint(Sender: TObject);
 private
   procedure CreateBitmap(aSX, aSY: Integer);
   procedure RecreateBitmap(aSX, aSY: Integer);
   procedure DeleteBitmap;
   procedure RestrictSize(var msg: TMessage); message WM_GETMINMAXINFO;
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
 ScrBitmap: TBitmap;
 Scr: Pointer;
 SX, SY: Integer;
implementation

{$R *.dfm}

procedure TForm1.CreateBitmap(aSX, aSY: Integer);
var
BInfo: tagBITMAPINFO;
begin
// Ñîçäàíèå DIB
SX := aSX; SY := aSY;
BInfo.bmiHeader.biSize := sizeof(tagBITMAPINFOHEADER);
BInfo.bmiHeader.biWidth := SX;
BInfo.bmiHeader.biHeight := -SY;
BInfo.bmiHeader.biPlanes := 1;
BInfo.bmiHeader.biBitCount := 32;
BInfo.bmiHeader.biCompression := BI_RGB;
ScrBitmap := TBitmap.Create();
ScrBitmap.Handle := CreateDIBSection(Canvas.Handle, BInfo, DIB_RGB_COLORS, Scr, 0, 0);
ZeroMemory(Scr, SX * SY * 4);
end;

procedure TForm1.DeleteBitmap;
begin
// Óäàëåíèå DIB
ScrBitmap.FreeImage();
ScrBitmap.Destroy;
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
 form1.Canvas.Draw(0, 0, ScrBitmap);
end;

procedure TForm1.RecreateBitmap(aSX, aSY: Integer);
var
BInfo: tagBITMAPINFO;
begin
// Ïåðåñîçäàíèå DIB ïðè èçìåíåíèè ðàçìåðîâ "ýêðàíà"
ScrBitmap.FreeImage();
SX := aSX; SY := aSY;
BInfo.bmiHeader.biSize := sizeof(tagBITMAPINFOHEADER);
BInfo.bmiHeader.biWidth := SX;
BInfo.bmiHeader.biHeight := -SY;
BInfo.bmiHeader.biPlanes := 1;
BInfo.bmiHeader.biBitCount := 32;
BInfo.bmiHeader.biCompression := BI_RGB;
ScrBitmap.Handle := CreateDIBSection(Canvas.Handle, BInfo, DIB_RGB_COLORS, Scr, 0, 0);
ZeroMemory(Scr, SX * SY * 4);
end;

procedure TForm1.RestrictSize(var msg: TMessage);
var
p: PMinMaxInfo;
begin
// Îãðàíè÷èòåëü ðàçìåðîâ îêíà (îáðàáîòêà ñîîáùåíèé Windows).
// Óäîáíàÿ âåùü êñòàòè (âàæíî: ñì. îáúÿâëåíèå ïðîöåäóðû â êëàññå TFmMain)
// The lParam contains a pointer on a structure of type TMinMaxInfo
p := PMinMaxInfo(Msg.lParam);
// This represents the size of the Window when Maximized
// p.ptMaxSize.x := 320;
// p.ptMaxSize.y := 240;
// This represents the position of the Window when Maximized
// p.ptMaxPosition.x := 10;
// p.ptMaxPosition.y := 10;
// This represents the minimum size of the Window
p.ptMinTrackSize.x := 520;
p.ptMinTrackSize.y := 240;
// This represents the maximum size of the Window
// p.ptMaxTrackSize.x := 400;
// p.ptMaxTrackSize.y := 320;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
CreateBitmap(Form1.ClientWidth, Form1.ClientHeight);
Form1.Canvas.Draw(0, 0, ScrBitmap);
Caption := "Âèçóàëèçàòîð"; Application.Title := Caption;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
DeleteBitmap();
end;

procedure TForm1.FormResize(Sender: TObject);
begin
ReCreateBitmap(Form1.ClientWidth, Form1.ClientHeight);
Form1.Canvas.Draw(0, 0, ScrBitmap);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
x, y: Integer;

begin
// Â öèêëå ðèñóåòñÿ ïîëíàÿ ëåâîòà. Ðèñóéòå òóò ñâîþ ëåâîòó :)
for x := 0 to SX - 1 do for y := 0 to SY - 1 do
 TBig(Scr^)[x + y * SX] := RGB(Random(256),Random(256),Random(256));

// Ïðè æåëàíèè, èñïîëüçóåì ñðåäñòâà Delphi íà îáúåêòå ScrBitmap òèïà TBitmap
// â ò.÷. ìîæíî íàðèñîâàòü íà íåì äðóãîé Bitmap ñ ïîìîùüþ ôóíêöèè
// ScrBitmap.Canvas.Draw(x,y,AnotherBitmap);
// ×òîáû òåêñò âûãëÿäåë êðàñèâåå (áåç ôîíà), ðàñêîììåíòèðó&# 233;òå ñòðîêè
// SetBkMode(ScrBitmap.Canvas.Handle, TRANSPARENT);
ScrBitmap.Canvas.Font.Size := 24;
ScrBitmap.Canvas.TextOut(10, 10, "Demo");
// SetBkMode(ScrBitmap.Canvas.Handle, OPAQUE);

// Íàðèñóåìñÿ
Form1.Paint;
end;

end.


 
Efir ©   (2007-09-04 22:27) [1]

Чтобы обращаться к отдельным пикселам с большой скоростью.


 
homm ©   (2007-09-04 23:37) [2]

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

Ты задал вопрос и сам на него ответил сразу-же. В чем смысл создания ветки, может стоит спросить еше раз конкретнее?


 
delphiForever   (2007-09-04 23:58) [3]


> Ты задал вопрос и сам на него ответил сразу-же. В чем смысл
> создания ветки, может стоит спросить еше раз конкретнее?
>

никак не мог понять в коде смысл быстрой работы с графикой, поетому и спросил, может я чего-то не вижу, того что задумано, и наверное что бы успокоить себя...


 
homm ©   (2007-09-05 00:04) [4]

> никак не мог понять в коде смысл быстрой работы с графикой

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


 
не читатель ...   (2007-09-05 00:13) [5]


> homm ©   (05.09.07 00:04) [4]
> > никак не мог понять в коде смысл быстрой работы с графикой
>
> Смысл быстрой работы в увеличении производительности, что-
> бы такты твоего новенького двухядерного проца не тратились
> на всякую ерунду, и ты мог как можно быстрее получить результат
> работы. Я думал это более чем очевидно.


Покажи пальцем - где видно, что код нагружает оба процессора. Разве этим не занимается сама ОС? Ну и конференция, всё-таки, обзывается "Начинающим"; о какой очевидности можно вести речь? Хотя ничего и не очевидно, но возможно и требует изучения.


 
delphiForever   (2007-09-05 00:26) [6]


> homm ©   (05.09.07 00:04) [4]
>
> Смысл быстрой работы в увеличении производительности, что-
> бы такты твоего новенького двухядерного проца не тратились
> на всякую ерунду, и ты мог как можно быстрее получить результат
> работы.
>

у моего любимого процессора четыре ядра


> Я думал это более чем очевидно.

очевидно что нарисовать 1024*768 по пикселям


 
antonn ©   (2007-09-05 00:36) [7]


> никак не мог понять в коде смысл быстрой работы с графикой,
>  поетому и спросил, может я чего-то не вижу, того что задумано,
>  и наверное что бы успокоить себя...

вместо   TBig(Scr^)[x + y * SX] := RGB(Random(256),Random(256),Random(256));
подставь  ScrBitmap.Canvas.pixels[] и узнаешь


 
delphiForever   (2007-09-05 00:43) [8]


> ScrBitmap.Canvas.pixels[]

когда-то пробывал потом начал использовать ScanLine


 
не читатель ...   (2007-09-05 01:06) [9]


> antonn ©   (05.09.07 00:36) [7]
>
> > никак не мог понять в коде смысл быстрой работы с графикой,
>
> >  поетому и спросил, может я чего-то не вижу, того что
> задумано,
> >  и наверное что бы успокоить себя...
>
> вместо   TBig(Scr^)[x + y * SX] := RGB(Random(256),Random(256),
> Random(256));
> подставь  ScrBitmap.Canvas.pixels[] и узнаешь


Ну и что? Это сейчас известно, даже действительно, начинающим. А чем ScanLine хуже? Хотя не спорю, а спрашиваю: может и хуже. Объясни очевидность, заявленную в homm ©   (05.09.07 00:04) [4].


 
homm ©   (2007-09-05 07:39) [10]

> Покажи пальцем - где видно, что код нагружает оба процессора.

Я сказал, что нагружает оба? Просто сейчас почти все новые процессоры идкт двуядерными.

Автор, может тебе нежуно объяснить не «смысл быстрой работы с графикой», а «принцип быстрой работы с графикой», и собственно почему этот код работает быстро???


 
alshtam ©   (2007-09-05 09:25) [11]


> delphiForever   (04.09.07 18:59) 

все очень просто, ты можеш делать с в памяти с картинкой(например Tbitmap) все что угодно, но пока конечная картинка не готова нельзя ее выводить на экран, только когда все операция завершина(например поворот на градус) можно вывести на экран по верх старой, тогда не будет мерцания и будет быстро


 
не читатель ...   (2007-09-05 18:34) [12]


>
> alshtam ©   (05.09.07 09:25) [11]
>
> > delphiForever   (04.09.07 18:59)
>
> все очень просто, ты можеш делать с в памяти с картинкой(например
> Tbitmap) все что угодно, но пока конечная картинка не готова
> нельзя ее выводить на экран, только когда все операция завершина(например
> поворот на градус) можно вывести на экран по верх старой,
>  тогда не будет мерцания и будет быстро


Да? Ну тогда, просто голыми средствами Delphi, без использования DirectX и OpenGL продемонстрируй вращающийся многогранник и при этом ещё бегающий следом за курсором мышки. Но движения должны быть плавными, без рывков. Метод канвы CopyRect работает вроде бы быстро, хотя пожалуй можешь использовать функцию WinAPI BitBlt, которая уж точно работает очень быстро, но всё-равно не напрямую с видеопамятью. А бегать за мышкой для того, что бы не возможно было заранее вычислить некие, якобы случайные траектории.

> homm ©   (05.09.07 07:39) [10]

Я не автор вопроса, я просто не читатель и головоморочитель:-)


 
не читатель ...   (2007-09-05 18:46) [13]


> alshtam ©   (05.09.07 09:25) [11]

Да, вот ещё: манипулируя в памяти с TBitmap примени свойства канвы Pixels[].

Ну, а насчёт вышеприведённого "быстрого доступа к пикселям" - нужно попробовать и разобраться что к чему, может и правда что-то стОящее.


 
homm ©   (2007-09-05 22:12) [14]

> Ну, а насчёт вышеприведённого "быстрого доступа к пикселям"
> - нужно попробовать и разобраться что к чему, может и правда
> что-то стОящее.

В вышеприведенном примере все как обычно, правильная работа с памятью, но есть и особенность. Дело в том, что код создания TBitmap какой-то тормозной, и там он заменен более быстрым аналагом в CreateBitmap.



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

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

Наверх





Память: 0.51 MB
Время: 0.064 c
2-1188930945
serko
2007-09-04 22:35
2007.09.30
Системы исчисления...


8-1166796860
nuflin
2006-12-22 17:14
2007.09.30
вопрос по openlG


3-1180336962
Junior)
2007-05-28 11:22
2007.09.30
TDBF и руские буквы


2-1188558769
Dib@zol
2007-08-31 15:12
2007.09.30
SetWindowRgn


15-1188546061
Ega23
2007-08-31 11:41
2007.09.30
Неклиентская область окна





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