[Papervision3D] Optimizing performance: anything else I can do?
apinstein at mac.com
Fri May 8 21:11:34 PDT 2009
First of all, thanks for Papervision, it is great. Good docs, good
community, good product.
We have built a virtual tour viewer based on Papervision and of course
I'm trying to squeeze out as much performance as possible. Here's the
[there's a bunch of panos starting with the 3d image]
Of course performance is pretty good at reasonable screen sizes, but
at full screen especially on large monitors things drop to 10-12 fps
or worse on modern hardware.
I have read as much as I possibly can (20+ hours) about Flash
performance, Papervision performance, etc. I have spent another 20 or
so hours trying various techniques. Here's a summary of what we've done:
1. No interactive viewports.
2. Flash quality medium (can't go lower; too much aliasing)
3. Minimized polygons (I even wrote a custom cylinder subclass with
specialized tessellation to remove polygons).
4. Using even less polygons, but using precise=true, precision=8
(pretty much required to get good subjective quality). This was faster
than precise=false with enough polygons to improve quality to
5. We have only 1 camera pointing at 1 object. There are typically
about 500 polys in full-screen mode.
6. Mipmap-friendly dimensions (of course this only matters at smaller
viewport sizes since we don't ever see our textures from far away)
Since our product is a "High-Definition" tour player we unfortunately
can't compromise on the things that matter most (smoothing, stage
quality, polygons/distortion correction). I am just trying to make
sure I've done everything I can.
I have even bought the Flash profiler and compiled against the pv3d
source to profile the app.
The thing that surprised me the most about this is that about 80% of
cpu time is in [render]. I cannot find an acceptable explanation of
how Flash internals works that would cause this to be so slow. I
routinely watch full-screen movie trailers in flash and they are able
to keep high framerates, so I wonder why if PV3D rendering takes only
20% CPU why can't [render] keep up with 80% headroom?
The only suggestion that's been made to me is to reduce the main
texture size (right now a very big one, using BitmapDataUnlimited it's
7200x1200 max). I have played with setting different materials with
geometry.faces[i].material and have had some success.
Here is a link to one where I have sliced the texture into 3
BitmapMaterials instead of 1 giant BitmapMaterial:
It seems little faster, but it's hard to tell for sure. In any case I
still have outstanding problems with the seams which I'd need to fix
to be able to use this. [btw anyone know how to fix that problem?]
The problem is, I don't understand *why* this is faster. The input
bitmap data is exactly the same, so why should this affect speed?
Without understanding why this matters, I can't decide the most
appropriate way to slice things up. Should I use 2 slices? 16 slices?
100? Do the pixel dimensions of the slices matter? Should I use tiling
to arrange the multiple textures, or custom UV mapping? How will that
I have a decent background in optimization. I understand lock
contention, competing resources, profilers, general code
optimizations, etc. I've used profilers on about 5 different platforms
for over 10 years. I just don't have enough visibility into how Flash
and/or Papervision work to make further improvements or understand why
I cannot get further performance.
I am definitely willing to put in more time to making improvements in
my code and even the PV3D source if needed, but at this point I am
just guessing and need some direction!
Thanks in advance.
More information about the Papervision3D