Szybkie wyswietlanie obrazkow?

0

Mam kilkadziesiat obrazkow, ktore tworze w petli i wyswietlam w losowych wspolrzednych formy. Niestety proces rysowania obrazkow jest widoczny a ja chcialbym tego uniknac. Tylko jak?

Aby Wam lepiej przyblizyc o co mi chodzi podaje kod przykladowy:

procedure TForm1.FormCreate(Sender: TObject);
var
i,x,y : Integer;
Obrazki : array[0..100] of TImage;
begin
randomize;

for i:=0 to 100 do
begin
Obrazki[i]:=TImage.Create(Self);
Obrazki[i].Parent:=Self;
x:=random(200);
y:=random(200);
Obrazki[i].Picture.LoadFromFile('c:\cus1.bmp');
Obrazki[i].AutoSize:=True;
Obrazki[i].Left:=x;
Obrazki[i].Top:=y;
end;
end;

Po skompilowaniu tego kodu na pewno zauwazyliscie ze obrazki pojawiaja sie kolejno po sobie i zajmuje to sporo czasu, a ja chcialbym tego uniknac...--take care,

Wodzu

0

Wodzu napisał:
Mam kilkadziesiat obrazkow, ktore tworze w petli i wyswietlam w losowych wspolrzednych formy. Niestety proces rysowania obrazkow jest widoczny a ja chcialbym tego uniknac. Tylko jak?
&gt
&gtAby Wam lepiej przyblizyc o co mi chodzi podaje kod przykladowy:
&gt
&gt
&gtprocedure TForm1.FormCreate(Sender: TObject);
&gtvar
&gt i,x,y : Integer;
&gt Obrazki : array[0..100] of TImage;
&gtbegin
&gt randomize;
&gt
&gt for i:=0 to 100 do
&gt begin
&gt Obrazki[i]:=TImage.Create(Self);
&gt Obrazki[i].Parent:=Self;
&gt x:=random(200);
&gt y:=random(200);
&gt Obrazki[i].Picture.LoadFromFile('c:\cus1.bmp');
&gt Obrazki[i].AutoSize:=True;
&gt Obrazki[i].Left:=x;
&gt Obrazki[i].Top:=y;
&gt end;
&gtend;
&gt

Moje pierwsze pomysly (bez sprawdzania, nie mam teraz czasu):
1.zmienne x i y sa niepotrzebne, przypisuj Random(200) wprost do Left i Top
2. zaladuj z dysku raz, potem kopiuj.
--Pawel {Delphi 6 Personal}

Po pierwsze: naciśnij F1

0

Jeszcze jedno:
czy nie wystarczy zaladowac rysunek raz np do TBitmap a potem CopyRect 100 razy na Canvasa? Moze bedzie szybciej--Pawel {Delphi 6 Personal}

Po pierwsze: naciśnij F1

0

Probowalem to juz wczesniej ale bez rezultatu... hmm... --take care,

Wodzu

0

A jakby stworzyc bitmape wielkosci formy w pamieci i druga mala tez w pamieci, w mala wgrac plik, skopiowac go 100x na duza w rozne miejsca i ta duza wrzucic na forme?--Pawel {Delphi 6 Personal}

Po pierwsze: naciśnij F1

0

Tak mozna by zrobic jednak nie w tym przypadku. Ja chce miec 100 oddzielnych obrazkow ze wzgledu na to, ze pozniej dla kazdego obrazka chce napisac obsluge porcedury OnMouseDown;--take care,

Wodzu

0

const
number=100; * do testow
var
Form1: TForm1;
Obrazki : array[0..number] of TImage; *dalem tu zeby potem zrobic free w onclose
bitmapa : Tbitmap;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
i : Integer;

begin
randomize;
Bitmapa:=TBitmap.Create;
Bitmapa.LoadFromFile('c:\windows\carved stone.bmp');
for i:=0 to number do
begin
Obrazki[i]:=TImage.Create(Self);
Obrazki[i].Parent:=Self;
Obrazki[i].AutoSize:=True;
Obrazki[i].Left:=random(200);
Obrazki[i].Top:=random(200);
Obrazki[i].Picture.Assign(Bitmapa);
end;
end;

u mnie blyskiem dziala

--
Pawel {Delphi 6 Personal}

Po pierwsze: naciśnij F1

0

pq wygrzebalem twoja stara procedurke mierzaca czas wykonywania np. petelek :)
i wykonanie petelki ktora podales:

for i:=0 to number do
begin
Obrazki[i]:=TImage.Create(Self);
Obrazki[i].Parent:=Self;
Obrazki[i].AutoSize:=True;
Obrazki[i].Left:=random(200);
Obrazki[i].Top:=random(200);
Obrazki[i].Picture.Assign(Bitmapa);
end;

zajmuje ( u mnie ) ok. 150 ms :)
po przeczytaniu artykulu:
http://www.borland.pl/tech/t_optim.htm

przerobilem petelke na taka:

for i:=0 to number do
begin
Obrazki[i]:=TImage.Create(Self);
with Obrazki[i] do
begin
Parent:=Self;
AutoSize:=True;
SetBounds(random(200), random(200), 0,0);
Picture.Assign(Bitmapa);
end;
end;

a jej wykonanie trwa ok. 128 ms :)
to zawsze 22 ms do przodu :)---=-=[ Delphi 3, 6 ]=-=-
-=-=-==[ LKS ]==-=-=-
-=[ [email protected] ]=-

0

hehe :) ---= pozdrawiam Oskar =- (delphi 6 GG:2792614)

0

Ok, ale ja i tak widze proces rysowania kolejno obrazkow. I szczerze mowiac to nie widze zbytniej roznicy pomiedzy tym o czym wczoraj mowilismy.
Ja bym chcial aby te wszystkie obrazki pojawily sie rownoczesnie.

Czy nie mozna np. zrobic jakiegos splash screena i pokazac go w czasie rysowania obrazkow?--take care,

Wodzu

0

Wodzu, a na jakim sprzecie Ty to piszesz? Moze masz za wolnego kompa! Albo za szybkie oko :))

LKS : dzieki za namiary na artykul. nie wiedzialem, ze with przyspiesza, nawet gdzies go odradzano ze wzgledu na to ze zmniejsza przejrzystosc i moze powodowac pomylki... Ale jak zapewne pamietasz (z watku z jajcem) nie zgodze sie z P. Ksiezykiem co do inc(i) i i:=i+1.

Ciekawe tez, czy nie przyspieszyloby wylaczenie AutoSize a zamiast tego ustawienie rozmiaru bitmapy w SetBounds. Ale nie chce mi sie mierzyc.

Aha, a moze jeszcze wykorzystac LockWindowUpdate z tego artykulu? Sprobuj, Wodzu!

--
Pawel {Delphi 6 Personal}

Po pierwsze: naciśnij F1

0

LockWIndowUpdate nie dziala...

Jedyna metoda jaka dziala to podwojne buforowanie ale zrzera za duzo zasobow.

PS. Kompa mam wystarczajaca szybkiego, myesl ze nie zaleznie od predkosci sprzetu proces rysowania obrazkow bedzie zauwazalny--take care,

Wodzu

0

Wodzu napisał:
LockWIndowUpdate nie dziala...
&gt
&gtJedyna metoda jaka dziala to podwojne buforowanie ale zrzera za duzo zasobow.
&gt
&gtPS. Kompa mam wystarczajaca szybkiego, myesl ze nie zaleznie od predkosci sprzetu proces rysowania obrazkow bedzie zauwazalny
&gt

Wiesz Wodzu, nie rozumiem. U mnie moja wersja (nawet bez poprawek LKS-a) dziala tak ze nie widac rysowania obrazkow. A moze Twoja bitmapa jest jakas duza?--Pawel {Delphi 6 Personal}

Po pierwsze: naciśnij F1

0

Wodzu napisał:
LockWIndowUpdate nie dziala...
&gt
&gtJedyna metoda jaka dziala to podwojne buforowanie ale zrzera za duzo zasobow.
&gt
Strasznie się na te TImage uparłeś. A nie może być tak:
var
i : Integer;
begin
randomize;
Bitmapa:=TBitmap.Create;
Buf:=TBitmap.Create;
Buf.Width:=Form1.Width;
Buf.Height:=Form1.Height;
Bitmapa.LoadFromFile('c:\windows\puch.bmp');
for i:=0 to number do
Buf.Canvas.Draw(random(200), random(200),Bitmapa);
Form1.Canvas.Draw(0,0,Buf);
Bitmapa.Free;
Buf.Free;
--Jest jeszcze jeden błąd ... :)

------------Reklama-------------
Szukasz pomocy?
Najszybsza pomoc dostępna na IRC:
serwer: warszawa.ircnet.pl
sieć: POLNet
kanał: #4programmers.net lub #4programmers

0

Dryobates, przeczytaj w tym watku:
Wodzu dnia 03.08.2002 22:44
--Pawel {Delphi 6 Personal}

Po pierwsze: naciśnij F1

0

pq napisał:
Dryobates, przeczytaj w tym watku:
&gtWodzu dnia 03.08.2002 22:44
&gt
Ups przeoczyłem to {wstyd}

Ale jakoś będę się ratował.
Wodzu, możesz narysować wszystko na jednym, bez Image'ów, a jedynie zapamiętywać położenie obrazków. Potem w zdarzeniu OnMouseDown, ale Formy odczytywać miejsce kliknięcia i w ten spsób dojść, który to obrazek. Tak mniej więcej robi się to pod dosem, gdzie nie ma obiektów typu TImage.--Jest jeszcze jeden błąd ... :)

------------Reklama-------------
Szukasz pomocy?
Najszybsza pomoc dostępna na IRC:
serwer: warszawa.ircnet.pl
sieć: POLNet
kanał: #4programmers.net lub #4programmers

0

&gtAle jakoś będę się ratował.
&gtWodzu, możesz narysować wszystko na jednym, bez Image'ów, a jedynie &gtzapamiętywać położenie obrazków. Potem w zdarzeniu OnMouseDown, ale Formy &gtodczytywać miejsce kliknięcia i w ten spsób dojść, który to obrazek. Tak mniej &gtwięcej robi się to pod dosem, gdzie nie ma obiektów typu TImage.

Wiem ze moge tak zrobic, ale nie jestem pod Dosem tylko pod windowsem.
Mam juz taka procedure zreszta napisana. CHcialbym jednak poradzic sobie z tym w ten sposob.

pq, ja nie wiem w takim razie dlaczego u mnie to nie chodzi tak szybko jak u Ciebie.
Sprawdzalem na dwoch kompach (fakt juz nie pierwszej mlodosci;) ) i na obu wyswietla te obrazki tak samo.--take care,

Wodzu

1 użytkowników online, w tym zalogowanych: 0, gości: 1