= Optimizer Options =
[[TracNav(TracNav/SupportTOC)]]
Options for optimizer can be passed as argument to optimize, or are read from the environment variable OSG_OPTIMIZER. !OsgViewer also allows command line specification of these options.
== FLATTEN_STATIC_TRANSFORMS ==
Flatten Static Transform nodes by applying their transform to the geometry on the leaves of the scene graph, then removing the now redundant transforms. The geometry is now directly placed at the resulting positions.
The "data variance" above the geometry needs to be set to static with "setDataVariance(osg::Object::STATIC)"
Example from osg mailing list:
{{{
///before optimization FLATTEN_STATIC_TRANSFORMS
///left out several properties for clarity
Group {
DataVariance STATIC
num_children 1
PositionAttitudeTransform {
DataVariance STATIC
referenceFrame RELATIVE
position 0 0 0
attitude 0 0 0 1
scale 1 5 10
pivotPoint 0 0 0
num_children 1
Geode {
DataVariance DYNAMIC
num_drawables 1
Geometry {
DataVariance DYNAMIC
useDisplayList TRUE
useVertexBufferObjects FALSE
PrimitiveSets 1
{
DrawArrays QUADS 0 4
}
VertexArray UniqueID Vec3Array_2 VA 4
{
0 -0.5 -0.5
0 0.5 -0.5
0 0.5 0.5
0 -0.5 0.5
}
}
}
}
}
///after optimization FLATTEN_STATIC_TRANSFORMS
///left out several properties for clarity
Group {
DataVariance STATIC
num_children 1
Group {
DataVariance STATIC
num_children 1
Geode {
DataVariance DYNAMIC
num_drawables 1
Geometry {
DataVariance DYNAMIC
useDisplayList TRUE
useVertexBufferObjects FALSE
PrimitiveSets 1
{
DrawArrays QUADS 0 4
}
VertexArray UniqueID Vec3Array_2 Vec3Array 4
{
0 -2.5 -5
0 2.5 -5
0 2.5 5
0 -2.5 5
}
}
}
}
}
}}}
== REMOVE_REDUNDANT_NODES ==
Removes empty nodes and drawables, such as:
* geodes with 0 drawables
* drawables representing an empty geometry
* groups with 0 children
Removes redundant nodes, such as:
* groups with 1 child
* (world) identity (static) transforms
== REMOVE_LOADED_PROXY_NODES ==
Replaces or removes all proxy nodes where the number of children equals the corresponding files in the proxy node. All files are loaded into the scene graph.
If there is information in a !ProxyNode that needs to be stored (such as callbacks) the !ProxyNode is replaced by a Group. Otherwise the children of the !ProxyNode are put under the !ProxyNodeâ€™s parents.
== COMBINE_ADJACENT_LODS ==
If a group has more than two LODs (PagedLODS are neglected), their ranges and children are put together under a single LOD.
{{{
//before optimization COMBINE_ADJACENT_LODS
Group {
DataVariance DYNAMIC
num_children 2
LOD {
DataVariance DYNAMIC
Radius -1
RangeMode DISTANCE_FROM_EYE_POINT
RangeList 1 {
0 1000
}
num_children 1
Geode {
//left out geode 1
}
}
}
LOD {
DataVariance DYNAMIC
Radius -1
RangeMode DISTANCE_FROM_EYE_POINT
RangeList 1 {
1000 2000
}
num_children 1
Geode {
//left out geode 2
}
}
}
//after optimization COMBINE_ADJACENT_LODS
Group {
DataVariance DYNAMIC
num_children 1
LOD {
DataVariance DYNAMIC
name "newLOD"
Center 0 0 0
Radius -1
RangeMode DISTANCE_FROM_EYE_POINT
RangeList 2 {
0 1000
1000 2000
}
num_children 2
Geode {
//left out geode 1
}
}
Geode {
//left out geode 2
}
}
}
}}}
== SHARE_DUPLICATE_STATE ==
Optimize State in the scene graph by removing duplicate state, replacing it with shared instances, both for !StateAttributes and whole !StateSets.
The optimizer collects all static statesets from nodes and drawables. Checks all !StateSets, !StateAttributes and Uniforms for duplicates (checks objects with == operator) and replaces them with the pointer to a unique one.
== MERGE_GEOMETRY ==
Collects all the geodes. It combines the drawables of these geodes (that do not share vertex arrays) until they reach a #vertices threshold (default set to 1000) CHECK_GEOMETRY
The optimizer class computeCorrectBindingsAndArraySizes for all drawables. This checks the normal, color, fog, texture and vertex binding for a drawable.
== SPATIALIZE_GROUPS ==
Spatialize scene (groups) into a balanced quad/oct tree. It creates an octree if the z-distances are large enough. Improves culling
== COPY_SHARED_NODES ==
Copy any shared subgraphs, enabling flattening of static transforms. Optimizer collects all nodes and replaced them with a deep copy of itself.
== TRISTRIP_GEOMETRY ==
A tri stripping visitor for converting Geometry surface primitives into tri strips. A tri strip is made of a series of adjacent triangles developed iteratively from one triangle by adding a vertex and sharing two vertices with a triangle already in the strip. The current implemention is based upon Tanguy Fautre's triangulation code, which is implemented in osgUtil::!TriStripVisitor. This converts mesh primitives in the Geometries into Tri Strips. It does not convert 2D primitives such as points, lines and linestrips.
== TESSELATE_GEOMETRY ==
Tesselate all geodes, to remove POLYGONS.
== OPTIMIZE_TEXTURE_SETTINGS ==
Sets the following value for all textures setUnRefImageDataAfterApply(true),
which comes down to the apply() function unreferencing the image data. If enabled, and the image data is only referened by this texture, apply() will delete the image data.
== MERGE_GEODES ==
The optimizer merges all duplicate geodes (same address) under a group by adding the drawables of all geodes into the first and putting that one as single geode in the group.
== FLATTEN_BILLBOARDS ==
Flatten !MatrixTransform/!Billboard pairs. For every billboard, it moves up the scene graph. IF the parent of the billboard is a matrix transform, and IF the parent of that matrix transform is a group, and IF the matrix does not cause translation nor rotation, THEN the matrix transforms will be applied to the drawables of the billboard and the matrix transforms will be replaced by the new billboards.
== CHECK_GEOMETRY ==
TODO
== TEXTURE_ATLAS_BUILDER ==
Texture Atlas Builder creates a set of textures/images which each contain multiple images. Texture Atlases are used to make it possible to use much wider batching of data.
== STATIC_OBJECT_DETECTION ==
Optimize the setting of !StateSet and Geometry objects in scene so that they have a STATIC !DataVariance when they don't have any callbacks associated with them.
== FLATTEN_STATIC_TRANSFORMS_DUPLICATING_SHARED_SUBGRAPHS ==
!FlattenStaticTransformsDuplicatingSharedSubgraphsVisitor is similar to !FlattenStaticTransformsVisitor in that is designed to remove static transforms from the scene graph,
pushing down the transforms to the geometry leaves of the scene graph, but with the difference that any subgraphs that are shared between different transforms of duplicated and flatten individually.
This results in more static transforms being removed, but also means that more data is generated, and as a result may not always be the most appropriate flatten visitor to use.
== INDEX_MESH ==
INDEX_MESH transforms polygonal geometry into an indexed triangle mesh with shared vertex attributes. Quads, triangle strips, triangle fans, and polygons are replaced by triangles. The result is in the !DrawElements form that stores indices into arrays of vertex attributes. This optimization can reduce the storage space of a mesh and collapse several primitive sets into one.
== VERTEX_POSTTRANSFORM ==
Optimize the order of triangles in a !DrawElements mesh to reduce cache misses in the GPU post-transform cache. This can significantly improve rendering time; see [http://shiny-dynamics.blogspot.com/2010/03/vertex-cache-optimization-for-osg.html this blog entry] for details.
== VERTEX_PRETRANSFORM ==
Change the order of vertex attributes to reflect their first use in the triangles of a mesh so that vertices that are used in early triangles come first in the vertex attribute arrays. This optimizes cache misses in the GPU pre-transform cache. This optimization should usually be run together with VERTEX_POSTTRANSFORM.