I am hoping to use the svg-android project to implement a dynamic SVG
viewer for files with fairly large amounts of detail.  My initial
smoke tests are promising as the SVG files I am using are rendered
correctly however performance is poor without any sophisticated
drawing optimizations.  I believe this is due to the usage of
Canvas.drawPicture (svg-android translates the SVG document structure
into a single Picture), preventing hardware acceleration on supporting
devices and possibly being implemented without efficient trimming of
areas outside the clip bounds.  Before I begin significant or
fundamental optimization however, I'd like to confirm a few things
about Android's rendering pipeline (both recent and older versions).
Hopefully this will allow me to utilize existing research already
conducted by the Android team or other community developers.
Specifically:

1. What performance gotchas may exist with simply constructing my own
macro notion of a Picture and replaying the raw Canvas operations on
draw?  That is, define a very simple op-code interpreted language in
which I can represent a Picture and simply "execute" it on draw myself
much like how I assume Picture is natively implemented.  Will this
alone be sufficient to permit hardware acceleration?  I'm assuming no
given that Android developers would have implemented drawPicture on
the hardware accelerated path if it were this simple, but I'd like to
understand why and if there may be anything I can do to mitigate the
issues in my specific case.

2. I believe an asynchronous tiling bitmap layer may be an appropriate
solution where sections of the SVG are dynamically rendered to off-
screen bitmaps and blitted on screen.  A separate renderer thread
would be used to manage writing to a cache of off-screen bitmaps.  Can
hardware acceleration help in some way with this off-screen rendering
or would it merely kick in with improved performance when blitting
those tiles to screen?  If no, I may be able to avoid the issues with
#1 entirely since hardware acceleration wasn't going to speed up the
off-screen rendering anyway.

3. What is the runtime nature of attempting to draw paths and
primitives (lines, rects, etc) that are entirely outside the canvas'
clipped bounds?  Is it necessary or appropriate for me to call
Canvas.quickReject myself or can I rely on this rejection happening at
a lower level automatically?  Can I expect that it behaves
consistently when drawing a Picture versus drawing a Path?  This is
especially important if I implement a tiling renderer as per #2 where
a large number of draw requests will be made for the full graphic to
render into discrete sections.  If Canvas cannot reasonably minimize
cycles for this case I will likely need to implement my own culling
optimizations.

If anyone has other suggestions for things I didn't consider please
feel free to let me know.  I'm hoping to drive toward an elegant and
efficient solution that works optimally on newer hardware but with
"acceptable" performance on other devices.

-- 
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

Reply via email to