![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
||||
|
||||
|
Пытаюсь использовать функцию GdipDrawImageRectRectI для отрисовки png-файла с Alpha каналом. Всё рисует, всё красиво, но скорость отрисовки достигает полусекунды. Что делать, отказаться?
|
|
#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); |
|
#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
|
||||
|
||||
|
Странно конечно, когда выводишь в цикле несколько объектов, начинаются дикие тормоза. Выносишь за цикл (один объект) - быстро.
|
|
#6
|
||||
|
||||
|
Чёрт бы побрал этот GDI+, постоянно проигрывает в скорости блит-функциям.
![]() |