Sarnoth, I appreciate you taking the time to comment.
Does that matter - if the thread isn't different? Just in case there were problems with the thread, I rewrote the program not to use a second thread and just execute the drawing loop in the view. In the code sample, I also changed draw() to drawSprites(), as I described in an earlier post. Neither of these things helped. ====== Begin Code ====== package com.baltz.scorched; import android.content.Context; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.util.AttributeSet; import android.util.Log; import android.view.SurfaceHolder; import android.view.SurfaceView; class ScorchedView extends SurfaceView implements SurfaceHolder.Callback { private Context context; private SurfaceHolder holder; private Bitmap backgroundImage; private Bitmap foregroundImage; private Bitmap spriteImage; private Resources resources; private ScorchedTerrain terrain; private Engine engine; public ScorchedView(Context c, AttributeSet attrs) { super(c, attrs); // register our interest in hearing about changes to our surface holder = getHolder(); holder.addCallback(this); context = c; resources = context.getResources(); // load background image as a Bitmap instead of a Dable b/c // we don't need to transform it and it's faster to d this way backgroundImage = BitmapFactory.decodeResource(resources, R.drawable.earthrise); foregroundImage = BitmapFactory.decodeResource(resources, R.drawable.foreground1); spriteImage = BitmapFactory.decodeResource(resources, R.drawable.sprite1); terrain = new ScorchedTerrain(foregroundImage); engine = new Engine(); Body body; body = new Body(spriteImage); body.setLocation(50, 50); engine.addBody(body); body = new Body(spriteImage); body.setLocation(40, 100); engine.addBody(body); } /* Callback invoked when the surface dimensions change. */ public void surfaceChanged(SurfaceHolder h, int format, int width, int height) { holder = h; } /* * Callback invoked when the Surface has been created and is ready to be * used. */ public void surfaceCreated(SurfaceHolder h) { holder = h; gameLoop(); } /* * Callback invoked when the Surface has been destroyed and must no longer * be touched. WARNING: after this method returns, the Surface/ Canvas must * never be touched again! */ public void surfaceDestroyed(SurfaceHolder holder) { } private void gameLoop(){ Canvas canvas; int i=0; while(i<30){ canvas = null; try { canvas = holder.lockCanvas(null); engine.update(); drawSprites(canvas); } finally { // do this in a finally so that if an exception is thrown // during the above, we don't leave the Surface in an // inconsistent state if (canvas != null) { Log.w("dbg", "unlocking canvas" + i); holder.unlockCanvasAndPost(canvas); } } try{ Thread.currentThread().sleep(300); } catch(Exception e){ } i++; } } /** * Draws the sprites and background to the provided * Canvas. */ public void drawSprites(Canvas canvas) { // Draw the background image. Operations on the Canvas accumulate // so this is like clearing the screen. canvas.drawBitmap(backgroundImage, 0, 0, null); //draw the up-to-date, deformed foreground terrain.draw(canvas); //draw all bodies (players, projectiles, etc) on the screen engine.drawAll(canvas); } } On Apr 15, 4:47 pm, Sarnoth <jesse.st...@gmail.com> wrote: > I can't really say without seeing more of the code, but based on your > description of the problem I wonder if your thread is in fact a > separate thread or if the run method is simply being executed in the > main UI thread. Something worth checking. You can log > Thread.currentThread().getName() from inside your run method and from > inside your activity's onCreate method to make sure they are > different. > > On Apr 15, 9:57 am, Warren <warrenba...@gmail.com> wrote: > > > I may have found my problem. > > > The SurfaceView class implements a function called draw(Canvas). > > > I unwittingly created my own function draw() with the same signature, > > overriding the original. I'm guessing that the SurfaceView probably > > calls draw() duringunlockCanvasAndPost(). But instead of executing > > its original draw() method and doing what it is supposed to do, it > > calls my function - simply overwriting the canvas buffer without > > affecting the Surface at all... thus theblackscreen. I'm still > > confused about why it eventually shows. Perhaps some final cleanup > > code... > > > I will test this tonight when I have access to my development computer > > and post my findings. > > > On Apr 15, 8:48 am, Warren <warrenba...@gmail.com> wrote: > > > > Thanks for the comment ellipsoidmobile. > > > > If I remove the sleep, I still don't see anything until the very end. > > > I don't need that sleep in there for the application. I only put it in > > > so that, hopefully, I could see what was happening a little better. > > > > Also, I thought that the SurfaceView allowed you to write to the > > >screenat your own pace, whatever that may be. So in this case, there > > > would be nothing "from the outside" that's causing ascreenrefresh. > > > Thescreenshould stay how I left it until I post a new canvas. Am I > > > misunderstanding this? > > > > What really confuses me is why the last call tounlockCanvasAndPost() > > > does work. It seems like if an error prevented the first calls from > > > functioning, then it would also prevent the last. > > > > On Apr 15, 3:09 am, "ellipsoidmob...@googlemail.com" > > > > <ellipsoidmob...@googlemail.com> wrote: > > > > The problem is your line Thread.currentThread().sleep(1000);//sleep > > > > for 1000 ms > > > > > I believe with SurfaceView you have to draw your whole view on > > > > everyscreenrefresh. You just need to loop as fast as possible and the > > > > system will throttle the speed in the calls to lockCanvas(). By > > > > sleeping for 1 second you are failing to provide a canvas for every > > > > refresh so thescreenappears blank. > > > > > What I don't know is whether there is any guidance on how quickly you > > > > have to get through your loop, i.e. what the maximum refresh rate is --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---