[Lazarus] Fast drawing to canvas

dhkblaszyk at zeelandnet.nl dhkblaszyk at zeelandnet.nl
Thu Feb 9 10:35:34 CET 2012


  

Hi Alex, 

I will add memory buffering as well of course, but on
longer sequences, this will help little. The memory buffer will run
empty before a second thread will fill it with new images. 

Darius 

On
9 feb '12, Alejandro PĆ©rez wrote: 

> My 2 cents.
> 
> Try to load in
memory some png first and descompress them, when the 
> buffer is full,
launch other thread that only get data from the buffer 
> and paint it
while the first thread fills the buffer with more files, 
> your
bottleneck is always loading and decoding png files from disk.
> 
>
Plase let us know your improvements,
> Alex
> 
> El 09/02/2012 3:33,
Brett Hunter escribiĆ³:
> 
>> I seem to remember some code that was in
the NativeJPG examples that loaded the file into a TMemoryStream first,
then did a LoadfromSteam instead of a LoadfromFile. It might be that the
loadfromfile (or in your case LoadFromRawImage) is slower than a
TMemorysteam.loadfromfile+Image.LoadfromStream. I admit I have never
tried as I have never needed it, but it might help. Please let us know
if there is a speed improvement. Ciao brett -----Original Message-----
From: Darius Blaszyk [mailto:dhkblaszyk at zeelandnet.nl [3]] Sent:
Thursday, 9 February 2012 11:52 AM To: Lazarus mailing list Subject: Re:
[Lazarus] Fast drawing to canvas Despite all the advices, none of the
suggestions of drawing on a TPaintBox or creating a TCustomControl
actually speed up the painting significantly. Therefore I did some
profiling. It appears that loading a 40kb png file (50% HD) from a
stream takes about 60msec another 30msec is used to paint the bitmap to
screen. It all results in approx. 11fps which is actually pretty poor
when you imagine a full HD loop will make the rate drop 2.5fps. As I see
it now, I will need to lower the access time to the png's from disk. I
will do a test with storing only raw pixel data instead. This means that
there will be no conversion (or decompression in the case of PNG) when
streaming from disk. However, although the minor part of the total loop,
I was hoping to improve the painting speed significantly as well.
Hopefully someone else has an idea that works. Is there a way to access
even lower level functions from LCL? Like GDI and GTK2 functions to copy
the pixel data as fast as possible? Appreciate the help from everybody
so far. Regards, Darius On Feb 8, 2012, at 5:12 PM, Sven Barth wrote:

>> 
>>> Am 08.02.2012 16:02, schrieb dhkblaszyk at zeelandnet.nl: [1] 
>>>

>>>> I have played with Image.Update, .Invalidate and .Repaint, but
none of them seem to work for me. Only when I put
Application.ProcessMessages the painted images show on screen. See below
for the testloop code. The images are streamed from a file cache. For 24
frames this seems overkill, but running at 24fps the memeory
requirements quickly get very large! Image.Transparent is also set to
false btw, which is default. Otherwise the drawing on the canvas is even
messed up. Regards, Darius procedure TForm1.Button1Click(Sender:
TObject); var s: TDateTime; i: Integer; begin s := now; for i := 1 to 24
do begin if filecache_get_from_cache(i, png) then begin
Image1.Picture.Bitmap.LoadFromRawImage(png.RawImage, False);
Application.ProcessMessages; end; end; ShowMessage(FloatToStr(24 / ((now
- s) * 24 * 3600))) end;
>>> Here it is clear that you need to use
Application.ProcessMessages, because
>> "LoadFromRawImage" will only
tell the control that it needs to repaint itself, but does not execute
this repainting (this is done in Application.ProcessMessages). In the
example you posted in the beginning the call to
Application.ProcessMessages is located inside the OnPaint handler of the
Image which is - in my opinion - not good. Maybe also the loading of the
image inside the OnPaint handler is not good... 
>> 
>>> Maybe you
should try - like Felipe suggested - something else than TImage.
>> Try
for example TPaintBox in combination with the Application.OnIdle event:
procedure TForm1.ApplicationOnIdle(aSender: TObject; var aDone:
Boolean); begin LoadNextImageFromCache; // this will load the next image
into
>> 
>>> y you'll need to write it of course ;) ]
PaintBox1.Invalidate; aDone := False; // important! end; procedure
TForm1.PaintBox1Paint(aSender: TObject); begin
PaintBox1.Canvas.Draw(fImage); // or however you'll
>> nt of the fImage
onto the canvas of the PaintBox end; Note: Don't forget to assign your
ApplicationOnIdle to Application
>> 
>>> type="cite"
style="padding-left:5px; border-left:#1010ff 2px solid; margin-left:5px;
width:100%">Regards, Sven --
_______________________________________________ Lazarus mailing list
Lazarus at lists.laz
>> al.org
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus [4] --
_______________________________________________ Lazarus mailing list
Lazarus at lists.lazarus
>> 
>>> us.freepascal.org/mailman/listinfo/lazarus
__________ Information from ESET NOD32 Antivirus, version of virus
signature database 6869 (20120208) __________ The message was checked by
ESET NOD32 Antivirus. http://www.eset.com [2] __________ Information
from ESET NOD32 Antivirus, ver
>> signature database 6869 (20120208)
__________ The message was checked by ESET NOD32 Antivirus.
http://www.eset.com [5] --
_______________________________________________ Lazarus mailing list
Lazarus at lists.lazarus.freepascal.org [6]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus [7]
> 
>
--
> _______________________________________________
> Lazarus mailing
list
> Lazarus at lists.lazarus.freepascal.org [8]
>
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus [9]

 


Links:
------
[1] mailto:dhkblaszyk at zeelandnet.nl:
[2]
http://www.eset.com
[3] mailto:dhkblaszyk at zeelandnet.nl
[4]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus
[5]
http://www.eset.com
[6] mailto:Lazarus at lists.lazarus.freepascal.org
[7]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus
[8]
mailto:Lazarus at lists.lazarus.freepascal.org
[9]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.lazarus-ide.org/pipermail/lazarus/attachments/20120209/8f6c3b06/attachment-0003.html>


More information about the Lazarus mailing list