|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
GDI+ и скорость выполнения
Пытаюсь использовать функцию GdipDrawImageRectRectI для отрисовки png-файла с Alpha каналом. Всё рисует, всё красиво, но скорость отрисовки достигает полусекунды. Что делать, отказаться?
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#2
|
||||
|
||||
HD 5750, i3 2120 не более 85мс 1280*1024*32ARGB с
Код:
InvalidateRgn(Handle, 0, True); Код:
Canvas.Brush.Color:=clYellow; Canvas.FillRect(ClientRect); отрисовка окна после поднятия из под другого не больше 20мс Пишу программы за еду. __________________ Последний раз редактировалось NumLock, 10.03.2013 в 17:08. |
#3
|
||||
|
||||
У меня отрисовка идёт так
Код:
procedure TGPGraphic.Draw(aCanvas : HDC; const dstRect : TRect; const srcRect : TRect); var aGraphics : GpGraphics; begin if Assigned(fGpImage) then begin aGraphics := NIL; if SetStatus(GdipCreateFromHDC(aCanvas, aGraphics)) = Ok then try SetStatus(GdipDrawImageRectRectI(aGraphics, fGpImage, dstRect.Left, dstRect.Top, dstRect.Right - dstRect.Left, dstRect.Bottom - dstRect.Top, srcRect.Left, srcRect.Top, srcRect.Right - srcRect.Left, srcRect.Bottom - srcRect.Top, UnitPixel, NIL, NIL, NIL)); finally if Assigned(aGraphics) then GdipDeleteGraphics(aGraphics); end; end; end; // вызов SetRect(aRect, Frame mod 3 * 82, Frame div 3 * 82, Frame mod 3 * 82 + 82, Frame div 3 * 82 + 82); bmStar.Draw(Handle, GetRect(fCells[CellIndex]), aRect); Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#4
|
||||
|
||||
ну практически также:
Код:
unit UnitMain; interface uses Gdiplus, Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, XPMan, ExtCtrls, StdCtrls; type TFormMain = class(TForm) Memo1: TMemo; Label1: TLabel; Label2: TLabel; Label3: TLabel; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure FormPaint(Sender: TObject); procedure FormResize(Sender: TObject); private { Private declarations } AImage: GpImage; public { Public declarations } end; var FormMain: TFormMain; implementation {$R *.dfm} procedure TFormMain.FormCreate(Sender: TObject); begin AImage:=nil; GdipLoadImageFromFile('Untitled.png', AImage); end; procedure TFormMain.FormDestroy(Sender: TObject); begin if Assigned(AImage) then GdipDisposeImage(AImage); end; procedure TFormMain.FormPaint(Sender: TObject); var g: GpGraphics; f, c1, c2: Int64; t: Int64; begin Canvas.Brush.Color:=clYellow; Canvas.FillRect(ClientRect); if Assigned(AImage) then begin QueryPerformanceFrequency(f); QueryPerformanceCounter(c1); GdipCreateFromHDC(Canvas.Handle, g); GdipDrawImageRectRectI(g, AImage, 0, 0, ClientWidth, ClientHeight, 0, 0, 1280, 1024, UnitPixel, nil, nil, nil); GdipDeleteGraphics(g); QueryPerformanceCounter(c2); t:=Trunc(((c2-c1)*1000/f)); Memo1.Lines.Add(IntToStr(t)); end; end; procedure TFormMain.FormResize(Sender: TObject); begin InvalidateRgn(Handle, 0, True); end; end. Пишу программы за еду. __________________ |
#5
|
||||
|
||||
Странно конечно, когда выводишь в цикле несколько объектов, начинаются дикие тормоза. Выносишь за цикл (один объект) - быстро.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#6
|
||||
|
||||
Чёрт бы побрал этот GDI+, постоянно проигрывает в скорости блит-функциям.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |