KnowledgeHub
Questions
Tags
Users
Search
Alex Rivera
|
Logout
Edit Question
Title
Body
I am working on a live wallpaper with a scrolling background. I have two bitmap objects which I alternate between in order to keep the previously drawn pixels for the next frame. I draw a new line at the top of the canvas, then call drawBitmap to copy the rest of the pixels onto the canvas. I am using a Runnable object to do the heavy lifting. It does all copying and calculations required and then locks the canvas, enters a synchronous block on the holder, and makes a single call to Canvas.drawBitmap(bitmap,rect,rect,paint). Occasionally there will be a white flash on the screen, which seems to correlate with high CPU activity. In using traceview, I found that the drawBitmap operation, specifically Canvas.native_drawBitmap(), is taking much longer than normal. Typically it completes in 2-4msec, but when I see a white flash, it can take anywhere from 10 to 100 msec. private void draw() { SurfaceHolder holder = getSurfaceHolder(); Canvas canvas = null; prepareFrame(); try { canvas = holder.lockCanvas(); synchronized (holder) { if (canvas != null) { drawFrame(canvas); } } } catch (Exception e) { e.printStackTrace(); } finally { if (canvas != null) holder.unlockCanvasAndPost(canvas); } afterDrawFrame(); handler.removeCallbacks(drawRunner); if (visible) { handler.post(drawRunner); } } The draw() function is called in the run() of the Runnable. private void prepareFrame() { num++; if (num%2 == 0) { mainBmp = mainBmp1; mainCan.setBitmap(mainBmp1); mainCan.drawBitmap(mainBmp2, source, destination, null); } else { mainBmp = mainBmp2; mainCan.setBitmap(mainBmp2); mainCan.drawBitmap(mainBmp1, source, destination, null); } } The prepareFrame() function is h
Tags (comma-separated)
Save Edits
Cancel