Can I suggest you to look at the source code of this game?

http://code.google.com/p/replicaisland/

It's a great little 2d side scroller with well structured and
optimized code -- a lot to be learned from it.

I am in no way affilitaed with that project, just came across it.

On Apr 24, 7:21 am, Jon mailinglists <[email protected]> wrote:
> Hi all,
>
> Like everyone else I'm doing a game to learn a bit about the android
> platform. I've now reached a point where I need to optimize my draw
> function and I'm trying to figure out the pros and cons of different
> paths to take. I'm pretty new to graphics (but not programming) so my
> questions might seems stupid, and my native language isn't English but
> please bear with me. I'll be trying to explain as well as I can and
> hopefully giving a bite more info than needed rather than less.
>
> It's "simple" 2D graphics we're talking about here. Doing frame
> animations from a sprite sheet with sequences of movement for
> different creatures, so basically I'm painting a portion of the sprite
> sheet to the canvas, a little moved each time to make it look it's
> walking/driving/running. The "game plan" is larger than the screen so
> there's a view port Rectangle I use to draw what's on screen. I'm
> doing this threaded pretty much like the lunar lander example. My
> current draw function does:
>
> 1. Update physics, set boolean to updated if anything happened
> 2. Draw global BitMap object containing last frame on the canvas if
> nothing has happened, otherwise:
>  3. Draw the part of the background currently visible, this draws over
> everything old
>  4. Loop through my objects, if any part of them is inside the view
> port draw them and let the canvas sort out what's needed and what's
> not
>  5. Store draw the update on the "static" background
>
> Something like this:
> private Bitmap bg = ... the large background image
> private Bitmap sprites = ... the animations
> private Bitmap screenBM = .. the "static" image
> private Canvas screenC = new Canvas (screenBM);
> private boolean noUp = false;
> private MyClass creatures = new MyClass[10];
>
> �...@override
>         public void run() {
>             Canvas c;
>             while (_run) {
>                 c = null;
>                 try
>                 {
>                    c = mSurfaceHolder.lockCanvas(null);
>                     synchronized (mSurfaceHolder) {
>                         updatePhysics (SystemClock.uptimeMillis (), c);
>
>                         if (noUp)
>                                 c.drawBitmap(cp, 0, 0, null); // redraw the 
> old
>                         else
>                                 draw (c);
>                     }
>                 }
>                 finally
>                 {
>                     if (c != null)
>                         mSurfaceHolder.unlockCanvasAndPost(c);
>                 }
>            }
>
>         }
>
>        public void draw (Canvas c)
>         {
>                 screenC.drawBitmap (bgImage, viewPort, mapScreen, null);
>                 Rect trans = new Rect (); // used to transform to the current 
> view port
>                 for (int i = 0; i < creatures.length; i++)
>                 {
>                         if (creatures[i] != null && !creatures[i].dead)
>                         {
>                                 trans.left = creatures[i].pos.left - 
> viewPort.left;
>                                 trans.right = creatures[i].pos.right - 
> viewPort.left;
>                                 trans.top = creatures[i].pos.top - 
> viewPort.top;
>                                 trans.bottom = creatures[i].pos.bottom - 
> viewPort.top;
>                                 if ( trans.left < mapScreen.right && 
> trans.right > mapScreen.left &&
>                                         trans.top < mapScreen.bottom && 
> trans.bottom > mapScreen.top)
>                                 {
>                                         
> screenC.drawBitmap(creatureAnimBitmap, frameCoords, trans, null);
>                                 }
>                         }
>                 }
>                 co.drawBitmap(screenBM, 0, 0, null);
>         }
>
> I'm sure this isn't a very effective method for handling this,
> especially not when the game physics is demanding and one wants a nice
> frame rate. What would be the more effective way to do this? I've
> tried figuring out how  "clipRect  (float left, float top, float
> right, float bottom, Region.Op op)" works but I haven't been very
> successful at that, not many examples out there explaining what it
> does exactly.
>
> My guess would be that I should keep track of all movement of my
> objects and have an int/float based array (to avoid the dreaded GC)
> with a rectangle covering the previous position and the current and
> just redraw that part.
>
> Or am I looking in the wrong direction? Is
> Canvas.save/translate/restore the way to go if I want it to be
> efficient? Or is it something completely different I should do?
>
> To sum up my rambling:
> 1. I understand Rects are inefficient and expensive, is that so?
> 2. What is the best way to handle things that would completely or
> partially be drawn outside the view port?
> 3. Is clipping, translate or just drawing pos based most efficient?
>
> 4. And since you've read through all this a little bonus question: Do
> people tend to have two threads, one for synchronized drawing and only
> doing that and one for physics or is one large thread doing both the
> way to go?
>
> Sorry for the bandwidth, the only thing missing is a 5 MB word
> document with an animated GIF in it, and thanks in advance
>
> Jon
>
> --
> You received this message because you are subscribed to the Google
> Groups "Android Developers" group.
> To post to this group, send email to [email protected]
> To unsubscribe from this group, send email to
> [email protected]
> For more options, visit this group 
> athttp://groups.google.com/group/android-developers?hl=en

-- 
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en

Reply via email to