First, thanks for the response!

I have two questions at this point:

1) How do I combine the background image buffer with the shape image buffer
so that the background is still visible?
2) In the paint method do I just blit in the portion of the combined shape
and background image buffer that is indicated by the Graphics2D object's
getClipBounds() method?

Thanks again for all the help!

Will

-----Original Message-----
From: Discussion list for Java 2D API [mailto:[EMAIL PROTECTED]
On Behalf Of Catharsis
Sent: Monday, October 27, 2003 5:15 AM
To: [EMAIL PROTECTED]
Subject: Re: [JAVA2D] Performance question...

At 12:00 AM 10/27/2003 -0700, you wrote:
>My current redraw strategy is to iterate the linkedlist in the paint
>method and pass the getBounds method of each element into the hitClip
>method of the graphics object to determine if I need to draw it.
>By offscreen buffering do you mean am I using the default double
>buffering capability built into Java2D?  I still have doublebuffering
>enabled at the moment but have considered turning it off to see what
>speed improvements might turn up.

Yep, there is a lot that can be done to speed up your app. Hopefully, I'll
provide some starter info.

I am assuming that the user can only move one icon or a group of icons at a
time on the screen. Simplest case is for one at a time.

Definitely take a look at the Volatile Image API; there is a significant
speedup to be had here on Win32; my development platform presently.

The best way to speed up you app is to not redraw all of the shapes every
single time you repaint. You should manually double buffer (with volatile
images) your component. The first buffer should be your background with no
items (you might want a texture here). The second buffer (shape buffer)
consists of the background + all non moving items. Lastly your
paintComponent method will draw the shape buffer + all the moving shape(s).

As Jim suggested find a way to eliminate the hitClip calls. You should be
able to check for visible components in a loop.

Now to the basic idea:

Mouse is pressed
   1. Check to see if shape(s) is selected; if not do nothing.

   2. If shape(s) is selected then redraw your shape buffer with all visible
   non selected shapes.
       2a. add a mouse motion listener.
       2b. set a flag indicating movable a shape(s)

Mouse dragged  (update mouse position and call repaint) In paintComponent:
   1. Draw shape buffer
   2. Draw movable shape(s)

Mouse is released
   1. Draw the previously moving shape(s) into the shape buffer and remove
the mouse motion
    listener and set the movable objects flag to false.

When there isn't a movable shape the shape buffer will contain all visible
shapes

Interesting tips:
You can keep a reference to the Graphics2D object of the shape buffer.
This will allow you to set the rending hints once and start redrawing the
buffer immediately without a call to createGraphics().

Use VM parameter:
-Dsun.java2d.accthreshold=0
If using translucent images then add:
-Dsun.java2d.translaccel=true

The drawShapeBuffer method will look like this.
1. draw the background buffer via drawImage 2. draw all visible non moving
shapes.

If you don't want a background image you can eliminate the background buffer
and use clearRect on the shape buffer.

---------

Conceivably in 1.5 if the user is allowed to select/move multiple shapes you
could create a transparent movable shape buffer with all of the moving
shapes drawn in it; IE just move/draw one image instead of redrawing many
shapes.

---------

With the strategy above you should have a lightning fast app.

Best,
--Mike

Egregious
"Spiritual renewal through music for those outside the heard."
http://www.egregious.net/

===========================================================================
To unsubscribe, send email to [EMAIL PROTECTED] and include in the body
of the message "signoff JAVA2D-INTEREST".  For general help, send email to
[EMAIL PROTECTED] and include in the body of the message "help".

===========================================================================
To unsubscribe, send email to [EMAIL PROTECTED] and include in the body
of the message "signoff JAVA2D-INTEREST".  For general help, send email to
[EMAIL PROTECTED] and include in the body of the message "help".

Reply via email to