Actually it's RGB_565, but yeah this is the format of the G1 screen so you really really want to work with things in that format when possible.
On Thu, Feb 26, 2009 at 1:37 PM, Sarnoth <jesse.st...@gmail.com> wrote: > > I've been playing around with various drawing techniques myself and > came across a few things that might help you (and others). It seems > that the preferred color mode of the G1 is RGB_454 if you don't > specify another type for your surface, and it runs much faster in this > mode. When drawing on such a surface it is much faster if your bitmaps > are RGB_454 or ARGB_4444. To take advantage of this as much as > possible I keep an in-memory RGB_454 bitmap the size of the screen > that has the background and anything that is relatively static already > drawn on it. Drawing the entire screen from the static bitmap only > takes 3ms which leaves plenty of time to draw your dynamic pieces on > top and you don't even have to worry about fencing off dirty > rectangles (although I'm sure that would help speed things up even > more). > > On Feb 26, 11:58 am, snctln <catlin.s...@gmail.com> wrote: > > Thank you very much for this reply, your advice about not using a high > > quality png seemed to make all of the difference... My problem wasn't > > with the png really but was more the way that I was working with the > > png > > > > I was loading the png into a bitmap, and then resizing that bitmap as > > needed for the background, BUT I was going about it all wrong.... > > > > Old Attempt > > m_backgroundBmp = Bitmap.createBitmap(backgroundWidth, > > backgroundHeight, Bitmap.Config.ARGB_8888); > > m_backgroundPngDrawable.setBounds(backgroundRect); > > Canvas c = new Canvas(backgroundBmp); > > m_backgroundPngDrawable.draw(c); > > > > New Attempt (from lunarlander) > > m_backgroundBmp = BitmapFactory.decodeResource(context.getResources(), > > R.drawable.background); > > m_backgroundBmp = Bitmap.createScaledBitmap(m_backgroundBmp , > > backgroundWidth, backgroundHeight, true); > > > > I didn't change any of my actual drawing code, just this bitmap > > loading/sizing code, and I went from about 24 fps to 60 fps, I guess > > that is teh difference between with with a 24 bit bitmap and a 32 bit > > bitmap > > > > I know I need to do some more profiling and work on my timestep code, > > but this definitely helps a lot, thanks. > > > > So in summary I am still not sure why I was seeing flickering when > > using very small rectangles, probably just errors in my code and not > > drawing the whole rectangle I guess. > > > > I am using the lockCanvas(dirtyRect) on a large region of the screen > > and am getting a nice performance increase over redrawing the whole > > screen > > > > Thanks again > > > > ---snctln > > > > On Feb 26, 3:05 am, Stoyan Damov <stoyan.da...@gmail.com> wrote: > > > > > On Thu, Feb 26, 2009 at 5:53 AM, snctln <catlin.s...@gmail.com> wrote: > > > > > > Stoyan, > > > > > > I appreciate the reply (especially because I believe we have > competing > > > > games up on the paid market). > > > > > np :) It's not that I'm sharing a trade secret here. > > > > > > I will go back and look at my code again, I am probably doing it > > > > wrong... > > > > > > currently I have 4 approaches to updating the screen > > > > > > Approach #1 - (Original Approach) Update the whole surface, this > works > > > > ok (30 fps) when I just have a solid color background , but once I > add > > > > in a complex bitmap to the background the performance falls to about > > > > 18-20 fps > > > > > Are you doing too many updates (as opposed to drawings)? 30 fps > > > doesn't look right. > > > With < 50 blocks and music (not sfx) turned off I'd get ~60 fps. Now > > > here's a trade secret ;) -- careful with the background, I wouldn't > > > use a high quality .png. > > > You need to time the time you spend in updates and the time in drawing > > > - if it's something like ~70 (drawing) / ~30 (updates) you'll probably > > > get high fps. > > > > > > Approach #2 - Specify A large dirty rect that encompasses all > possible > > > > areas of update (things that can change multiple times a second), > this > > > > yields great results for solid color background (60 fps), but still > > > > only gives me 24fps or so for a complex bitmap background > > > > > This is the approach I use although a bit modified because of the > > > specifics of my game - I have 2 dirty rectangles which I switch every > > > now and then - one is bigger than the other and encompasses it. > > > > > > Approach #3 - Draw the current screen state to a bitmap member > > > > variable, and make multiple calls to lockCanvas(DirtyRect) and > specify > > > > only the areas that have changed and then do a drawBitmap and copy > the > > > > regions from the screen bitmap member variable to the canvas, this > > > > approach seems to be the worst as it has the most flicker and > > > > artifacts > > > > > I wouldn't do that. How many fps have you squeezed using this approach > > > (if you do use it)? > > > > > > Approach #4 - Draw to a bitmap like in approach #3, but rather than > > > > doing multiple lockCanvas calls, just add all of the rectangles > > > > together to get one large rectangle that encompasses all of the areas > > > > that need to be updated and call lock canvas on that then draw to > that > > > > area from the bitmap, this seems to work better the #3 but stil > leaves > > > > artifacts.... > > > > > Haven't tried that either. > > > > > > Did you take any of these approaches? > > > > > > I probably have holes in my code and will be going over it all > > > > tonight. > > > > > You need to profile your game - basically my advice to anyone doing > > > optimizations is to think instead of looking at profiling tools > > > output, but every once in a while (including a case w/ my game on > > > Android) you can see stuff in the profile output which you couldn't > > > have possibly expected. > > > > > > thanks again for the reply > > > > > You're welcome > > > > > > ---snctln > > > > > > On Feb 25, 7:34 pm, Stoyan Damov <stoyan.da...@gmail.com> wrote: > > > >> I can't give you a solution - there's no problem. The bug was, I > said > > > >> in the post link you pasted, in my code - I was not drawing what I > had > > > >> to. Basically, if you follow the single rule (draw all pixels on the > > > >> invalidated rectangle) you'll be fine. > > > > > >> Just sprinkle a few log statements to see what your'e supposed to > draw > > > >> and where are you drawing it and you'll see your mistake. > > > > > >> Cheers > > > > > >> On Wed, Feb 25, 2009 at 10:45 PM, snctln <catlin.s...@gmail.com> > wrote: > > > > > >> > So I am trying to do all I can to increase the FPS on one my > games. > > > > > >> > When trying to draw a bitmap to the background of a canvas, and > then > > > >> > call unlockAndPost() on that canvas the fps rate goes down about > 30% > > > >> > So I am trying to work with thelockCanvas(dirtyRect) function, but > it > > > >> > doesn't seem to behave the way I would think it should. > > > > > >> > It seems as though this function works, but it is just about > useless > > > >> > because of the double buffer nature of the surfaceHolder, ie i can > > > >> > redraw an area on one buffer, but because it only invalidates one > of > > > >> > the buffers some artifacts are seen when the next buffer draws. > > > > > >> > Here are the posts describing the double buffer nature of > > > >> > surfaceHolder, but they don't seem to answer my question > > > >> > - > > > >> > > http://groups.google.com/group/android-developers/browse_thread/threa... > > > >> > - > > > >> > > http://groups.google.com/group/android-developers/browse_thread/threa... > > > > > >> > and this posts mentions the exact same problem I am having but > doesn't > > > >> > have a solution posted > > > >> > - > > > >> > > http://groups.google.com/group/android-developers/browse_thread/threa... > > > > > >> > So my question is, what am I doing wrong? Is there a reason why > > > >> > calling unlock and Post on a canvas that has a bitmap drawn on 70% > of > > > >> > the background get drawn slower than a canvas that just wipes the > > > >> > screen clear with a call to drawColor(color)? What is the proper > way > > > >> > to call locakCanvas(dirtyRect) so that both buffers are updated? > > > > > >> > thanks for any answers, suggestions, or pointers > > > > > >> > ---snctln > > > >> >www.snctln.com > > > -- Dianne Hackborn Android framework engineer hack...@android.com Note: please don't send private questions to me, as I don't have time to provide private support. All such questions should be posted on public forums, where I and others can see and answer them. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Android Developers" group. To post to this group, send email to android-developers@googlegroups.com To unsubscribe from this group, send email to android-developers-unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/android-developers?hl=en -~----------~----~----~----~------~----~------~--~---