SLOW bitmap from Stream

F

Freesc

Hi,there
i 'm writing an application about bitmap displaying.But i find it
works not very well because of the terrorable performance .

here's my code

/// <summary>
/// Get BMP according to the FrameNumber,then display
/// </summary>
/// <param name="FrameNo"></param>
/// <param name="FandR_Flag">direction</param>
/// <returns></returns>
public Bitmap createImage(int FrameNo, int FandR_Flag)
{
string xustr;
byte[] xutest;
xustr = "CAM";

//find image,cost about 1ms
xutest = ri.Fun_GetSpeData(xustr, FrameNo, FandR_Flag);

//read byte[] into memostream,cost about 1ms
MemoryStream ms = new MemoryStream(xutest, 0, xutest.Length);

//here cost 423ms to construct an bmp, what happened
here?!!!!!!!!!!!!!!!!!!!!!!!!
Bitmap bmp = new Bitmap(ms);

xutest = null;
ms.Close();
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
return bmp;
}

Any suggestion?

Thanks in advance~

Regards,

Freesc
 
S

Simon Hart [MVP]

Under half a second is not that out of the ordinary loading an image on a
device. How big is the image, on what device, how much RAM?

Calling the garbage collector is costing you, I'd get rid of that code if I
were you.
 
F

Freesc

Under half a second is not that out of the ordinary loading an image on a
device. How big is the image, on what device, how much RAM?

Calling the garbage collector is costing you, I'd get rid of that code if I
were you.
--
Simon Hart
Visual Developer - Device Application Development MVPhttp://simonrhart.blogspot.com



Freesc said:
Hi,there
i 'm writing an application about bitmap displaying.But i find it
works not very well because of the terrorable performance .
here's my code
/// <summary>
/// Get BMP according to the FrameNumber,then display
/// </summary>
/// <param name="FrameNo"></param>
/// <param name="FandR_Flag">direction</param>
/// <returns></returns>
public Bitmap createImage(int FrameNo, int FandR_Flag)
{
string xustr;
byte[] xutest;
xustr = "CAM";
//find image,cost about 1ms
xutest = ri.Fun_GetSpeData(xustr, FrameNo, FandR_Flag);
//read byte[] into memostream,cost about 1ms
MemoryStream ms = new MemoryStream(xutest, 0, xutest.Length);
//here cost 423ms to construct an bmp, what happened
here?!!!!!!!!!!!!!!!!!!!!!!!!
Bitmap bmp = new Bitmap(ms);
xutest = null;
ms.Close();
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
return bmp;
}
Any suggestion?
Thanks in advance~

Freesc- Hide quoted text -

- Show quoted text -

Hi,Simon

Thanks for you reply~
i would remove the GC code.

i think 400ms is unbearable because this is a video solution, it must
be 4 or 5 frames per secend as we expect
and i can not find something like Bitmap.FromStream(new
memorystream(...)) in .NET Compactframe , so i can not prevent
constructing a new bitmap when a new frame comes
Any suggestion about that?I have to reduce the cost , but i can't find
an effective way....
thanks again~

Regards~
 
G

Guest

You didn't answer any of Simon's question. How big is the image? What
format is it? Color depth? What kind of device? Processor speed? RAM?
etc. etc. etc...


--

Chris Tacke, eMVP
Join the Embedded Developer Community
http://community.opennetcf.com



Under half a second is not that out of the ordinary loading an image on a
device. How big is the image, on what device, how much RAM?

Calling the garbage collector is costing you, I'd get rid of that code if
I
were you.
--
Simon Hart
Visual Developer - Device Application Development
MVPhttp://simonrhart.blogspot.com



Freesc said:
Hi,there
i 'm writing an application about bitmap displaying.But i find it
works not very well because of the terrorable performance .
here's my code
/// <summary>
/// Get BMP according to the FrameNumber,then display
/// </summary>
/// <param name="FrameNo"></param>
/// <param name="FandR_Flag">direction</param>
/// <returns></returns>
public Bitmap createImage(int FrameNo, int FandR_Flag)
{
string xustr;
byte[] xutest;
xustr = "CAM";
//find image,cost about 1ms
xutest = ri.Fun_GetSpeData(xustr, FrameNo, FandR_Flag);
//read byte[] into memostream,cost about 1ms
MemoryStream ms = new MemoryStream(xutest, 0, xutest.Length);
//here cost 423ms to construct an bmp, what happened
here?!!!!!!!!!!!!!!!!!!!!!!!!
Bitmap bmp = new Bitmap(ms);
xutest = null;
ms.Close();
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
return bmp;
}
Any suggestion?
Thanks in advance~

Freesc- Hide quoted text -

- Show quoted text -

Hi,Simon

Thanks for you reply~
i would remove the GC code.

i think 400ms is unbearable because this is a video solution, it must
be 4 or 5 frames per secend as we expect
and i can not find something like Bitmap.FromStream(new
memorystream(...)) in .NET Compactframe , so i can not prevent
constructing a new bitmap when a new frame comes
Any suggestion about that?I have to reduce the cost , but i can't find
an effective way....
thanks again~

Regards~
 
F

Freesc

You didn't answer any of Simon's question. How big is the image?  What
format is it?  Color depth? What kind of device?  Processor speed? RAM?
etc. etc. etc...

--

Chris Tacke, eMVP
Join the Embedded Developer Communityhttp://community.opennetcf.com


Under half a second is not that out of the ordinary loading an image on a
device. How big is the image, on what device, how much RAM?
Calling the garbage collector is costing you, I'd get rid of that code if
I
were you.
Freesc said:
Hi,there
i 'm writing an application about bitmap displaying.But i find it
works not very well because of the terrorable performance .
here's my code
/// <summary>
/// Get BMP according to the FrameNumber,then display
/// </summary>
/// <param name="FrameNo"></param>
/// <param name="FandR_Flag">direction</param>
/// <returns></returns>
public Bitmap createImage(int FrameNo, int FandR_Flag)
{
string xustr;
byte[] xutest;
xustr = "CAM";
//find image,cost about 1ms
xutest = ri.Fun_GetSpeData(xustr, FrameNo, FandR_Flag);
//read byte[] into memostream,cost about 1ms
MemoryStream ms = new MemoryStream(xutest, 0, xutest.Length);
//here cost 423ms to construct an bmp, what happened
here?!!!!!!!!!!!!!!!!!!!!!!!!
Bitmap bmp = new Bitmap(ms);
xutest = null;
ms.Close();
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
return bmp;
}
Any suggestion?
Thanks in advance~
Regards,
Freesc- Hide quoted text -
- Show quoted text -

Hi,Simon

Thanks for you reply~
i would remove the GC code.

 i think 400ms is unbearable because this is a video solution, it must
be 4 or 5 frames per secend as we expect
and i can not find something like Bitmap.FromStream(new
memorystream(...)) in .NET Compactframe , so i can not prevent
constructing a new bitmap when a new frame comes
Any suggestion about that?I have to reduce the cost , but i can't find
an effective way....
thanks again~

Regards~- Hide quoted text -

- Show quoted text -

Oops~~~

sorry about that ~ :)

each frame is an Image of 240*180 Bitmap(24bit) , we test our
application in an XScale device of 416Mhz, 128MB ROM,64MB RAM

Thanks Chris~
 
S

Simon Hart [MVP]

I would say half a second is probebly about right. You might want to try
caching the objects when loaded, but to be honest you'll probebly find
drawing them to screen using GDI is also time consuming. Worth a test though.
--
Simon Hart
Visual Developer - Device Application Development MVP
http://simonrhart.blogspot.com


Freesc said:
You didn't answer any of Simon's question. How big is the image? What
format is it? Color depth? What kind of device? Processor speed? RAM?
etc. etc. etc...

--

Chris Tacke, eMVP
Join the Embedded Developer Communityhttp://community.opennetcf.com


Under half a second is not that out of the ordinary loading an image on a
device. How big is the image, on what device, how much RAM?
Calling the garbage collector is costing you, I'd get rid of that code if
I
were you.
:
Hi,there
i 'm writing an application about bitmap displaying.But i find it
works not very well because of the terrorable performance .
here's my code
/// <summary>
/// Get BMP according to the FrameNumber,then display
/// </summary>
/// <param name="FrameNo"></param>
/// <param name="FandR_Flag">direction</param>
/// <returns></returns>
public Bitmap createImage(int FrameNo, int FandR_Flag)
{
string xustr;
byte[] xutest;
xustr = "CAM";
//find image,cost about 1ms
xutest = ri.Fun_GetSpeData(xustr, FrameNo, FandR_Flag);
//read byte[] into memostream,cost about 1ms
MemoryStream ms = new MemoryStream(xutest, 0, xutest.Length);
//here cost 423ms to construct an bmp, what happened
here?!!!!!!!!!!!!!!!!!!!!!!!!
Bitmap bmp = new Bitmap(ms);
xutest = null;
ms.Close();
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
return bmp;
}
Any suggestion?
Thanks in advance~

Freesc- Hide quoted text -
- Show quoted text -

Hi,Simon

Thanks for you reply~
i would remove the GC code.

i think 400ms is unbearable because this is a video solution, it must
be 4 or 5 frames per secend as we expect
and i can not find something like Bitmap.FromStream(new
memorystream(...)) in .NET Compactframe , so i can not prevent
constructing a new bitmap when a new frame comes
Any suggestion about that?I have to reduce the cost , but i can't find
an effective way....
thanks again~

Regards~- Hide quoted text -

- Show quoted text -

Oops~~~

sorry about that ~ :)

each frame is an Image of 240*180 Bitmap(24bit) , we test our
application in an XScale device of 416Mhz, 128MB ROM,64MB RAM

Thanks Chris~
 
S

Simon Hart [MVP]

I forgot to mention you arn't using anything stupid such as directX are you,
I'm assuming GDI.
--
Simon Hart
Visual Developer - Device Application Development MVP
http://simonrhart.blogspot.com


Freesc said:
You didn't answer any of Simon's question. How big is the image? What
format is it? Color depth? What kind of device? Processor speed? RAM?
etc. etc. etc...

--

Chris Tacke, eMVP
Join the Embedded Developer Communityhttp://community.opennetcf.com


Under half a second is not that out of the ordinary loading an image on a
device. How big is the image, on what device, how much RAM?
Calling the garbage collector is costing you, I'd get rid of that code if
I
were you.
:
Hi,there
i 'm writing an application about bitmap displaying.But i find it
works not very well because of the terrorable performance .
here's my code
/// <summary>
/// Get BMP according to the FrameNumber,then display
/// </summary>
/// <param name="FrameNo"></param>
/// <param name="FandR_Flag">direction</param>
/// <returns></returns>
public Bitmap createImage(int FrameNo, int FandR_Flag)
{
string xustr;
byte[] xutest;
xustr = "CAM";
//find image,cost about 1ms
xutest = ri.Fun_GetSpeData(xustr, FrameNo, FandR_Flag);
//read byte[] into memostream,cost about 1ms
MemoryStream ms = new MemoryStream(xutest, 0, xutest.Length);
//here cost 423ms to construct an bmp, what happened
here?!!!!!!!!!!!!!!!!!!!!!!!!
Bitmap bmp = new Bitmap(ms);
xutest = null;
ms.Close();
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
return bmp;
}
Any suggestion?
Thanks in advance~

Freesc- Hide quoted text -
- Show quoted text -

Hi,Simon

Thanks for you reply~
i would remove the GC code.

i think 400ms is unbearable because this is a video solution, it must
be 4 or 5 frames per secend as we expect
and i can not find something like Bitmap.FromStream(new
memorystream(...)) in .NET Compactframe , so i can not prevent
constructing a new bitmap when a new frame comes
Any suggestion about that?I have to reduce the cost , but i can't find
an effective way....
thanks again~

Regards~- Hide quoted text -

- Show quoted text -

Oops~~~

sorry about that ~ :)

each frame is an Image of 240*180 Bitmap(24bit) , we test our
application in an XScale device of 416Mhz, 128MB ROM,64MB RAM

Thanks Chris~
 
F

Freesc

I forgot to mention you arn't using anything stupid such as directX are you,
I'm assuming GDI.
--
Simon Hart
Visual Developer - Device Application Development MVPhttp://simonrhart.blogspot.com



Freesc said:
You didn't answer any of Simon's question. How big is the image?  What
format is it?  Color depth? What kind of device?  Processor speed?RAM?
etc. etc. etc...
--
Chris Tacke, eMVP
Join the Embedded Developer Communityhttp://community.opennetcf.com
Under half a second is not that out of the ordinary loading an imageon a
device. How big is the image, on what device, how much RAM?
Calling the garbage collector is costing you, I'd get rid of that code if
I
were you.
--
Simon Hart
Visual Developer - Device Application Development
MVPhttp://simonrhart.blogspot.com
:
Hi,there
i 'm writing an application about bitmap displaying.But i find it
works not very well because of the terrorable performance .
here's my code
/// <summary>
/// Get BMP according to the FrameNumber,then display
/// </summary>
/// <param name="FrameNo"></param>
/// <param name="FandR_Flag">direction</param>
/// <returns></returns>
public Bitmap createImage(int FrameNo, int FandR_Flag)
{
string xustr;
byte[] xutest;
xustr = "CAM";
//find image,cost about 1ms
xutest = ri.Fun_GetSpeData(xustr, FrameNo, FandR_Flag);
//read byte[] into memostream,cost about 1ms
MemoryStream ms = new MemoryStream(xutest, 0, xutest.Length);
//here cost 423ms to construct an bmp, what happened
here?!!!!!!!!!!!!!!!!!!!!!!!!
Bitmap bmp = new Bitmap(ms);
xutest = null;
ms.Close();
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
return bmp;
}
Any suggestion?
Thanks in advance~
Regards,
Freesc- Hide quoted text -
- Show quoted text -
Hi,Simon
Thanks for you reply~
i would remove the GC code.
 i think 400ms is unbearable because this is a video solution, it must
be 4 or 5 frames per secend as we expect
and i can not find something like Bitmap.FromStream(new
memorystream(...)) in .NET Compactframe , so i can not prevent
constructing a new bitmap when a new frame comes
Any suggestion about that?I have to reduce the cost , but i can't find
an effective way....
thanks again~
Regards~- Hide quoted text -
- Show quoted text -

sorry about that ~   :)
each frame is an Image of  240*180 Bitmap(24bit) , we test our
application in an XScale device of 416Mhz, 128MB ROM,64MB RAM
Thanks Chris~- Hide quoted text -

- Show quoted text -

Thanks, Simon.

anyhow, my problem was solved by compress the image before load in
frame, here's my code:


string xustr;
byte[] xutest;
xustr = "CAM";
xutest = ri.Fun_GetSpeData(xustr,FrameNo,FandR_Flag);

MemoryStream ms = new MemoryStream(xutest, 0, xutest.Length);

//Compress as a 200*127 image,using the ImageUtils(by OpenNETCF.org)
IBitmapImage ibi = ImageUtils.CreateThumbnail(ms, new Size(200,
127));

Bitmap bmp = ImageUtils.IBitmapImageToBitmap(ibi);
xutest = null;
ms.Close();
return bmp;

Thank you again, both Simon & Chris

Cheers
Freesc
 
F

Freesc

I forgot to mention you arn't using anything stupid such as directX are you,
I'm assuming GDI.
Freesc said:
On Mar 8, 1:03 pm, "<ctacke/>" <ctacke[at]opennetcf[dot]com> wrote:
You didn't answer any of Simon's question. How big is the image?  What
format is it?  Color depth? What kind of device?  Processor speed? RAM?
etc. etc. etc...
--
Chris Tacke, eMVP
Join the Embedded Developer Communityhttp://community.opennetcf.com
Under half a second is not that out of the ordinary loading an image on a
device. How big is the image, on what device, how much RAM?
Calling the garbage collector is costing you, I'd get rid of that code if
I
were you.
--
Simon Hart
Visual Developer - Device Application Development
MVPhttp://simonrhart.blogspot.com
:
Hi,there
i 'm writing an application about bitmap displaying.But i find it
works not very well because of the terrorable performance .
here's my code
/// <summary>
/// Get BMP according to the FrameNumber,then display
/// </summary>
/// <param name="FrameNo"></param>
/// <param name="FandR_Flag">direction</param>
/// <returns></returns>
public Bitmap createImage(int FrameNo, int FandR_Flag)
{
string xustr;
byte[] xutest;
xustr = "CAM";
//find image,cost about 1ms
xutest = ri.Fun_GetSpeData(xustr, FrameNo, FandR_Flag);
//read byte[] into memostream,cost about 1ms
MemoryStream ms = new MemoryStream(xutest, 0, xutest.Length);
//here cost 423ms to construct an bmp, what happened
here?!!!!!!!!!!!!!!!!!!!!!!!!
Bitmap bmp = new Bitmap(ms);
xutest = null;
ms.Close();
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
return bmp;
}
Any suggestion?
Thanks in advance~
Regards,
Freesc- Hide quoted text -
- Show quoted text -
Hi,Simon
Thanks for you reply~
i would remove the GC code.
 i think 400ms is unbearable because this is a video solution, it must
be 4 or 5 frames per secend as we expect
and i can not find something like Bitmap.FromStream(new
memorystream(...)) in .NET Compactframe , so i can not prevent
constructing a new bitmap when a new frame comes
Any suggestion about that?I have to reduce the cost , but i can't find
an effective way....
thanks again~
Regards~- Hide quoted text -
- Show quoted text -
Oops~~~
sorry about that ~   :)
each frame is an Image of  240*180 Bitmap(24bit) , we test our
application in an XScale device of 416Mhz, 128MB ROM,64MB RAM
Thanks Chris~- Hide quoted text -
- Show quoted text -

Thanks, Simon.

anyhow, my problem was solved by compress the image before load in
frame, here's my code:

string xustr;
byte[] xutest;
xustr = "CAM";
xutest = ri.Fun_GetSpeData(xustr,FrameNo,FandR_Flag);

MemoryStream ms = new MemoryStream(xutest, 0, xutest.Length);

//Compress as a 200*127 image,using the ImageUtils(by OpenNETCF.org)
IBitmapImage ibi = ImageUtils.CreateThumbnail(ms, new Size(200,
127));

Bitmap bmp = ImageUtils.IBitmapImageToBitmap(ibi);
xutest = null;
ms.Close();
return bmp;

Thank you again, both Simon & Chris

Cheers
Freesc- Hide quoted text -

- Show quoted text -

and now it cost me just 150ms to load the bmp:)

Regards
 
S

Simon Hart [MVP]

Interesting code, thanks for posting it.
--
Simon Hart
Visual Developer - Device Application Development MVP
http://simonrhart.blogspot.com


Freesc said:
I forgot to mention you arn't using anything stupid such as directX are you,
I'm assuming GDI.
:
On Mar 8, 1:03 pm, "<ctacke/>" <ctacke[at]opennetcf[dot]com> wrote:
You didn't answer any of Simon's question. How big is the image? What
format is it? Color depth? What kind of device? Processor speed? RAM?
etc. etc. etc...

Chris Tacke, eMVP
Join the Embedded Developer Communityhttp://community.opennetcf.com
"Freesc" <[email protected]> wrote in message
On Mar 8, 5:10 am, Simon Hart [MVP] <[email protected]> wrote:
Under half a second is not that out of the ordinary loading an image on a
device. How big is the image, on what device, how much RAM?
Calling the garbage collector is costing you, I'd get rid of that code if
I
were you.
:
Hi,there
i 'm writing an application about bitmap displaying.But i find it
works not very well because of the terrorable performance .
here's my code
/// <summary>
/// Get BMP according to the FrameNumber,then display
/// </summary>
/// <param name="FrameNo"></param>
/// <param name="FandR_Flag">direction</param>
/// <returns></returns>
public Bitmap createImage(int FrameNo, int FandR_Flag)
{
string xustr;
byte[] xutest;
xustr = "CAM";
//find image,cost about 1ms
xutest = ri.Fun_GetSpeData(xustr, FrameNo, FandR_Flag);
//read byte[] into memostream,cost about 1ms
MemoryStream ms = new MemoryStream(xutest, 0, xutest.Length);
//here cost 423ms to construct an bmp, what happened
here?!!!!!!!!!!!!!!!!!!!!!!!!
Bitmap bmp = new Bitmap(ms);
xutest = null;
ms.Close();
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
return bmp;
}
Any suggestion?
Thanks in advance~

Freesc- Hide quoted text -
- Show quoted text -

Thanks for you reply~
i would remove the GC code.
i think 400ms is unbearable because this is a video solution, it must
be 4 or 5 frames per secend as we expect
and i can not find something like Bitmap.FromStream(new
memorystream(...)) in .NET Compactframe , so i can not prevent
constructing a new bitmap when a new frame comes
Any suggestion about that?I have to reduce the cost , but i can't find
an effective way....
thanks again~
Regards~- Hide quoted text -
- Show quoted text -

sorry about that ~ :)
each frame is an Image of 240*180 Bitmap(24bit) , we test our
application in an XScale device of 416Mhz, 128MB ROM,64MB RAM
Thanks Chris~- Hide quoted text -
- Show quoted text -

Thanks, Simon.

anyhow, my problem was solved by compress the image before load in
frame, here's my code:

string xustr;
byte[] xutest;
xustr = "CAM";
xutest = ri.Fun_GetSpeData(xustr,FrameNo,FandR_Flag);

MemoryStream ms = new MemoryStream(xutest, 0, xutest.Length);

//Compress as a 200*127 image,using the ImageUtils(by OpenNETCF.org)
IBitmapImage ibi = ImageUtils.CreateThumbnail(ms, new Size(200,
127));

Bitmap bmp = ImageUtils.IBitmapImageToBitmap(ibi);
xutest = null;
ms.Close();
return bmp;

Thank you again, both Simon & Chris

Cheers
Freesc- Hide quoted text -

- Show quoted text -

and now it cost me just 150ms to load the bmp:)

Regards
 
Top