Your large assembly rendering issues require comprehensive optimization across all five performance dimensions you’ve identified.
Level-of-Detail Rendering: The viewer must use adaptive LOD based on component distance and screen size. Edit viewerconfig.xml to enable automatic LOD switching:
<lod enabled="true" mode="adaptive">
<level distance="0-20" quality="high" triangleRatio="1.0"/>
<level distance="20-50" quality="medium" triangleRatio="0.3"/>
<level distance="50+" quality="low" triangleRatio="0.05"/>
</lod>
This reduces distant component geometry by 95%, dramatically cutting triangle count.
Progressive Loading: Enable streaming geometry load to prioritize visible components. Set in viewer preferences:
viewer.progressive.enabled=true
viewer.progressive.chunkSize=500
viewer.progressive.priorityMode=VISIBILITY
This loads 500 components at a time, prioritizing those in current viewport, reducing initial load from 12 minutes to under 2 minutes.
Assembly Simplification: Your rules aren’t applying because they need context binding. Create a visualization context specifically for large assemblies in Visualization Admin:
- Context name: LargeAssemblyView
- Component threshold: 2000+ parts triggers automatic simplification
- Simplification rule: Replace fasteners/hardware with representative markers
- Sub-assembly substitution: Render sub-assemblies as single bounding volumes until expanded
Bind this context to assemblies via classification rules based on component count.
GPU Memory Allocation: The 8.2GB allocation means full geometry loading. Implement memory budgeting:
viewer.gpu.memoryBudget=2048
viewer.gpu.geometryCache=1024
viewer.gpu.textureCache=512
This caps GPU usage at 2GB, forcing the viewer to use LOD and streaming to stay within budget.
Geometry Caching: Your cache invalidation is too aggressive. Modify cache retention:
viewer.cache.retentionTime=300000
viewer.cache.similarityThreshold=0.85
viewer.cache.maxSize=4096
This keeps cached geometry for 5 minutes and reuses cache when view changes are less than 15%, preventing constant re-rendering.
Additional optimization: Enable occlusion culling (viewer.occlusion.enabled=true) to avoid rendering hidden components entirely. After implementing these changes, test with your largest assembly and monitor triangle count - target should be under 15M with smooth 30+ FPS interaction.
This draft is based on general ENOVIA knowledge. It has not been verified against your specific version and environment. Practitioners: verify the steps and share your experience below.