Thanks. It does as of API level 12 (Android 3.2.) I would recommend you switch > to using hardware AA lines if possible (all devices that shipped with > API level 11 should have now be upgraded to 12.) Make sure to use > drawLines() as well to batch the geometry.
Unfortunately both devices I have (HTC Jetstream and Lenovo ThinkPad Tablet) are still on API 11...and at least in the case of the ThinkPad Tablet, what I've heard is that they're skipping API 12 and going straight to ICS which won't be out until March or later... As for using Canvas.drawLines(), the width of the lines I am drawing is constantly changing (based on the pressure level provided by the active pen on the tablets I mentioned above). With hardware acceleration, is it practical to make (a lot) of draw lines calls (changing the stroke width of the provided Paint in between calls), instead of creating a Bitmap cache and updating just the region of the Bitmap that changed? I don't know enough about graphics (and how the DisplayList stuff works) to see how (or if) this is faster. What about when invalidating the entire Canvas (such as when scrolling), is it faster to redraw the entire canvas via drawLines() or to just translate a Bitmap cache? My gut wants to say that the Bitmap is faster...but I really don't know (remember it could potentially be *a lot* of lines...depending on how much the user draws). I know for sure using a Bitmap cache is faster than drawing everything in software (using Skia) since I have observed it (and that at least makes sense to me). It would be nice if there were a drawLines() that took an array of line widths as a parameter instead of using the stroke width in the provided Paint object :) Since you are doing your own buffering I would recommend you keep > track of the dirty region yourself. Note that you could instead set > your View's layer type to be LAYER_TYPE_SOFTWARE. If you do so, the > View will be drawn into a Bitmap for you *and* the clip rect in > onDraw() will be the same as when you call invalidate(Rect). > Note however that the rendering engine will have to upload the entire > bitmap as a texture which can be expensive. I started with using LAYER_TYPE_SOFTWARE, but I was running into problems where calling invalidate(Rect) still set the clip in onDraw() to the entire Canvas (http://stackoverflow.com/q/8686525/287575). So I decided to try implementing the drawing cache myself and test enabling hardware acceleration to keep all overlapping views from being invalidated just because one of them is. I also tried keeping track of the dirty region myself and setting the clip to the dirty region in onDraw() (with hardware acceleration enabled) but then I was *only* seeing the dirty region being drawn each time...as if the Canvas was being cleared by the framework each time (that's what I meant by a "blank Canvas" in one of my previous posts). Thanks, Andrew On Fri, Jan 20, 2012 at 1:51 PM, Romain Guy <[email protected]> wrote: > > The reason for this is one of the things I'm drawing in the View are > lines > > (potentially lots of them), and hardware acceleration does not support AA > > for drawing lines. > > It does as of API level 12 (Android 3.2.) I would recommend you switch > to using hardware AA lines if possible (all devices that shipped with > API level 11 should have now be upgraded to 12.) Make sure to use > drawLines() as well to batch the geometry. > > > So, I draw everything to a Bitmap cache and simply update > > a section of the Bitmap cache when the View's data is updated, then I > call > > invalidate(Rect) hoping to only update the View's Canvas with that > portion > > of the Bitmap cache that was updated. But I end up redrawing the entire > > Canvas every time. This ends up being a lot slower than doing the same > > technique without hardware acceleration enabled. > > Since you are doing your own buffering I would recommend you keep > track of the dirty region yourself. Note that you could instead set > your View's layer type to be LAYER_TYPE_SOFTWARE. If you do so, the > View will be drawn into a Bitmap for you *and* the clip rect in > onDraw() will be the same as when you call invalidate(Rect). > > Note however that the rendering engine will have to upload the entire > bitmap as a texture which can be expensive. > > -- > Romain Guy > Android framework engineer > [email protected] > > -- > 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 > -- 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

