1"use strict";(globalThis.webpackChunkvrgs_docs_v_3_1=globalThis.webpackChunkvrgs_docs_v_3_1||[]).push([[3429],{47693(e,n,t){t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>o,default:()=>c,frontMatter:()=>l,metadata:()=>i,toc:()=>d});const i=JSON.parse('{"id":"general/setup-system/large-models","title":"Working with Large Models","description":"Why a big model runs slowly in VRGS and what to do about it \u2014 finding the real bottleneck first, then the levers that actually help, from LOD and tiling through memory residency, point-cloud filtering, display settings and the renderer choice.","source":"@site/versioned_docs/version-3.4/general/setup-system/large-models.md","sourceDirName":"general/setup-system","slug":"/general/setup-system/large-models","permalink":"/docs/general/setup-system/large-models","draft":false,"unlisted":false,"editUrl":"https://github.com/vrgeoscience/vrgs_docs_v3/tree/master/versioned_docs/version-3.4/general/setup-system/large-models.md","tags":[],"version":"3.4","sidebarPosition":1.5,"frontMatter":{"id":"large-models","title":"Working with Large Models","sidebar_label":"Working with Large Models","description":"Why a big model runs slowly in VRGS and what to do about it \u2014 finding the real bottleneck first, then the levers that actually help, from LOD and tiling through memory residency, point-cloud filtering, display settings and the renderer choice.","keywords":["performance","large models","level of detail","LOD","tiled mesh","streaming","frame rate","VRAM","memory","point cloud"],"sidebar_position":1.5},"sidebar":"docs","previous":{"title":"Hardware Requirements","permalink":"/docs/general/setup-system/hardware-requirements"},"next":{"title":"Graphics Settings","permalink":"/docs/general/setup-system/multi-gpu-systems"}}');var s=t(74848),r=t(28453);const l={id:"large-models",title:"Working with Large Models",sidebar_label:"Working with Large Models",description:"Why a big model runs slowly in VRGS and what to do about it \u2014 finding the real bottleneck first, then the levers that actually help, from LOD and tiling through memory residency, point-cloud filtering, display settings and the renderer choice.",keywords:["performance","large models","level of detail","LOD","tiled mesh","streaming","frame rate","VRAM","memory","point cloud"],sidebar_position:1.5},o=void 0,a={},d=[{value:"Work out what is actually slow",id:"work-out-what-is-actually-slow",level:2},{value:"Too many triangles",id:"too-many-triangles",level:2},{value:"Level of Detail",id:"level-of-detail",level:3},{value:"Tiles",id:"tiles",level:3},{value:"Too much texture",id:"too-much-texture",level:2},{value:"Turn off what you are not using",id:"turn-off-what-you-are-not-using",level:2},{value:"Memory",id:"memory",level:2},{value:"Picking and interpretation are slow",id:"picking-and-interpretation-are-slow",level:2},{value:"Point clouds",id:"point-clouds",level:2},{value:"Streaming and tiles",id:"streaming-and-tiles",level:2},{value:"Navigation aids (OpenGL view)",id:"navigation-aids-opengl-view",level:2},{value:"The renderer",id:"the-renderer",level:2},{value:"When it was fine yesterday",id:"when-it-was-fine-yesterday",level:2},{value:"Quick reference",id:"quick-reference",level:2},{value:"See also",id:"see-also",level:2}];function h(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",li:"li",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(n.p,{children:['Large models are the single most common source of "VRGS feels slow". The\nfrustrating part is that ',(0,s.jsx)(n.em,{children:"slow"})," has at least five different causes, and the fix\nfor one makes another worse. Decimating a model does nothing if the problem is\ntexture memory. Generating LOD does nothing if the problem is that picking is\nslow. Buying a bigger GPU does nothing if the model is streaming off a network\ndrive."]}),"\n",(0,s.jsxs)(n.p,{children:["This guide is about ",(0,s.jsx)(n.strong,{children:"finding out which problem you have"}),", and then fixing that\none."]}),"\n",(0,s.jsx)(n.admonition,{title:"Preparation comes first",type:"info",children:(0,s.jsxs)(n.p,{children:["If the model has just arrived and has never been cleaned, start with\n",(0,s.jsx)(n.a,{href:"/docs/general/meshes-point-clouds/model-preparation",children:"Preparing a Model for Interpretation"}),".\nA model full of degenerate triangles and duplicate vertices is slow for reasons\nthat no display setting will fix."]})}),"\n",(0,s.jsx)(n.h2,{id:"work-out-what-is-actually-slow",children:"Work out what is actually slow"}),"\n",(0,s.jsx)(n.p,{children:"Before changing anything, decide which of these describes your problem. They\nhave different answers."}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"What you see"}),(0,s.jsx)(n.th,{children:"What is probably wrong"}),(0,s.jsx)(n.th,{children:"Go to"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsxs)(n.td,{children:["The view stutters while you ",(0,s.jsx)(n.strong,{children:"rotate or pan"}),", but is fine when still"]}),(0,s.jsx)(n.td,{children:"Too much geometry drawn per frame"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.a,{href:"#too-many-triangles",children:"Too many triangles"})})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsxs)(n.td,{children:["The view is slow ",(0,s.jsx)(n.strong,{children:"even when nothing moves"})]}),(0,s.jsx)(n.td,{children:"Textures or effects, not geometry"}),(0,s.jsxs)(n.td,{children:[(0,s.jsx)(n.a,{href:"#too-much-texture",children:"Too much texture"})," and ",(0,s.jsx)(n.a,{href:"#turn-off-what-you-are-not-using",children:"Turn off what you are not using"})]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsxs)(n.td,{children:["Everything is fine until you ",(0,s.jsx)(n.strong,{children:"click on the model"})]}),(0,s.jsx)(n.td,{children:"Spatial index, not rendering"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.a,{href:"#picking-and-interpretation-are-slow",children:"Picking and interpretation are slow"})})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsxs)(n.td,{children:["Detail ",(0,s.jsx)(n.strong,{children:"pops in late"})," as you navigate"]}),(0,s.jsx)(n.td,{children:"Streaming, not raw performance"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.a,{href:"#streaming-and-tiles",children:"Streaming and tiles"})})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsxs)(n.td,{children:["VRGS uses ",(0,s.jsx)(n.strong,{children:"all your RAM"})," and then crawls"]}),(0,s.jsx)(n.td,{children:"Residency and how much is loaded"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.a,{href:"#memory",children:"Memory"})})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsxs)(n.td,{children:["It was fine yesterday and is slow ",(0,s.jsx)(n.strong,{children:"today"})]}),(0,s.jsx)(n.td,{children:"Something in the project changed \u2014 a new dataset, or the wrong GPU"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.a,{href:"#when-it-was-fine-yesterday",children:"When it was fine yesterday"})})]})]})]}),"\n",(0,s.jsx)(n.p,{children:"Two quick measurements are worth taking before you start:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Triangle count."})," Select the mesh and read it from its properties. A few\nmillion triangles is comfortable on most machines; tens of millions needs the\ntechniques below; hundreds of millions needs tiling."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Which GPU is doing the work."})," Open Task Manager \u2192 ",(0,s.jsx)(n.strong,{children:"Performance"})," while\nVRGS is running. If the ",(0,s.jsx)(n.em,{children:"integrated"})," GPU is busy and the dedicated one is\nidle, nothing else in this guide matters until you fix that \u2014 see\n",(0,s.jsx)(n.a,{href:"/docs/general/setup-system/multi-gpu-systems",children:"Graphics Settings"}),"."]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"too-many-triangles",children:"Too many triangles"}),"\n",(0,s.jsx)(n.p,{children:"There are three different answers here and they are not interchangeable."}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Technique"}),(0,s.jsx)(n.th,{children:"What it does"}),(0,s.jsx)(n.th,{children:"Cost"}),(0,s.jsx)(n.th,{children:"Use when"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.strong,{children:"Decimate"})}),(0,s.jsx)(n.td,{children:"Permanently removes triangles"}),(0,s.jsx)(n.td,{children:"Detail is gone for good"}),(0,s.jsx)(n.td,{children:"The model is genuinely more detailed than the work needs"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.strong,{children:"Level of Detail (LOD)"})}
1),(0,s.jsx)(n.td,{children:"Keeps the full model, draws a simpler version when far away"}),(0,s.jsx)(n.td,{children:"Disk space, one-off processing"}),(0,s.jsx)(n.td,{children:"You want full detail up close and speed at range \u2014 most cases"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.strong,{children:"Tiles"})}),(0,s.jsx)(n.td,{children:"Splits the model into pieces that load and draw independently"}),(0,s.jsx)(n.td,{children:"Restructures the model"}),(0,s.jsx)(n.td,{children:"The model is too big to hold in memory at all"})]})]})]}),"\n",(0,s.jsx)(n.h3,{id:"level-of-detail",children:"Level of Detail"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Right-click the mesh \u2192 Optimization \u2192 Level of Detail (LOD) \u2192 Generate."})}),"\n",(0,s.jsxs)(n.p,{children:["VRGS then builds progressively simpler copies of the mesh. As the camera moves\naway, it swaps to a simpler one. The switch is driven by ",(0,s.jsx)(n.strong,{children:"average triangle\nsize on screen"}),': when the current level\'s triangles shrink to about one pixel,\nthe next level takes over. Choosing the threshold this way is what stops LOD\nchanges from visibly "popping".']}),"\n",(0,s.jsxs)(n.p,{children:["To see it working, switch on ",(0,s.jsx)(n.strong,{children:"Wireframe"})," in the triangulated mesh group\nproperties and navigate towards and away from the model \u2014 the triangle density\nvisibly changes at each transition."]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Optimization \u2192 Level of Detail (LOD) \u2192 Remove"})," deletes the layers again."]}),"\n",(0,s.jsx)(n.admonition,{title:"Generate LOD last",type:"caution",children:(0,s.jsx)(n.p,{children:"Decimating, remeshing or otherwise editing the geometry after generating LOD\ninvalidates the layers \u2014 you have to generate them again. Make LOD the final\nstep of preparation."})}),"\n",(0,s.jsx)(n.h3,{id:"tiles",children:"Tiles"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Right-click the mesh \u2192 Convert To \u2192 Tiles."})}),"\n",(0,s.jsx)(n.p,{children:"Tiling splits one mesh into many independent pieces, each with its own geometry\nand its own level of detail, loaded only when it is on screen. This is what\nmakes very large models workable: VRGS never has the whole thing resident."}),"\n",(0,s.jsxs)(n.p,{children:["Tiled models carry a ",(0,s.jsx)(n.strong,{children:"LOD Factor"})," property \u2014 a scaling factor on the distance\nat which each tile refines. Lower values switch to coarser tiles sooner, which\nis faster but shows the change more; higher values keep detail further out at\nthe cost of frame rate. Leave it alone unless you have a specific problem."]}),"\n",(0,s.jsxs)(n.p,{children:["Streamed 3D-tile services (Cesium 3D Tiles, ArcGIS I3S/SLPK) have their own\nequivalents. I3S datasets add ",(0,s.jsx)(n.strong,{children:"I3S LOD Scale Factor"}),", which divides the\nper-node pixel thresholds published in the dataset, and ",(0,s.jsx)(n.strong,{children:"I3S Fallback Pixel\nDiameter"})," for nodes whose LOD metric is missing or invalid."]}),"\n",(0,s.jsx)(n.h2,{id:"too-much-texture",children:"Too much texture"}),"\n",(0,s.jsx)(n.p,{children:"A model can be modest in triangles and still bring a GPU to its knees if it\ncarries several gigabyte-scale textures. Symptoms: the view is slow even when\ncompletely still, and slowness scales with how much of the model is visible\nrather than with how fast you are moving."}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Check the texture, not the mesh."})," A 30-million-triangle mesh with one 8k\ntexture is usually lighter than a 5-million-triangle mesh with forty of them."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Prefer shared textures over per-tile atlases."})," When converting to tiles,\nVRGS asks whether to build a texture atlas per tile. Keeping the shared\ntextures is normally the better answer \u2014 an atlas per tile multiplies total\ntexture memory."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Bake the texture to vertices"})," (",(0,s.jsx)(n.strong,{children:"Textures \u2192 Bake to Vertices"}),") if you only\nneed the colour for context rather than for detailed interpretation. Per-vertex\ncolour costs no texture memory at all."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Hide the texture-heavy layers you are not interpreting on."})," See below."]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"turn-off-what-you-are-not-using",children:"Turn off what you are not using"}),"\n",(0,s.jsxs)(n.p,{children:["Several display options are free-looking but expensive. All of these are in the\n",(0,s.jsx)(n.a,{href:"/docs/general/viewing-collaboration/display-properties",children:"Display Properties"})," panel."]}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Setting"}),(0,s.jsx)(n.th,{children:"Cost"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.strong,{children:"Enable Shadows"})}),(0,s.jsx)(n.td,{children:"Ray-traced on the GPU. Genuinely expensive, and only w
1orks on the Vulkan view with a ray-tracing-capable GPU."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.strong,{children:"Enable Ambient Occlusion"})}),(0,s.jsx)(n.td,{children:"Hardware-traced rays every frame, independent of shadows."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsxs)(n.td,{children:[(0,s.jsx)(n.strong,{children:"Bloom"}),", ",(0,s.jsx)(n.strong,{children:"Procedural Clouds"}),", ",(0,s.jsx)(n.strong,{children:"Time of Day Sun"})]}),(0,s.jsx)(n.td,{children:"Cosmetic full-screen work. Fine on a fast machine, the first things to turn off on a slow one."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsxs)(n.td,{children:[(0,s.jsx)(n.strong,{children:"Eye-Dome Lighting"})," / ",(0,s.jsx)(n.strong,{children:"Curvature Shading"})]}),(0,s.jsxs)(n.td,{children:["Cheaper than shadows, but still per-pixel. Worth keeping \u2014 they often let you turn textures ",(0,s.jsx)(n.em,{children:"off"})," and still read the structure."]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.strong,{children:"Full-Resolution Tiles While Interpreting"})}),(0,s.jsx)(n.td,{children:"Forces tiled models to maximum detail while you interpret. Accurate picking, but it defeats LOD exactly when the model is under load. Turn it off on a very large model."})]})]})]}),"\n",(0,s.jsxs)(n.p,{children:["The cheapest performance win of all is not drawing things: switch off datasets\nin the project tree that you are not currently working with, and save the\ncombinations you use as ",(0,s.jsx)(n.strong,{children:"scenes"})," so you can get back to them."]}),"\n",(0,s.jsx)(n.h2,{id:"memory",children:"Memory"}),"\n",(0,s.jsx)(n.p,{children:"Two commands on the mesh and point-cloud context menus control what is loaded."}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Optimization \u2192 Load Into Memory"})," makes the object fully resident instead of\nstreamed. Faster to work on and to interpret against; costs RAM proportional\nto the object's size. Some operations require it, which is why they grey out\nuntil you run it."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Hide (Keep in Memory)"})," on the item menu is the counterpart: stop drawing an\nobject without unloading it, so showing it again is instant. Use it for the\nmodel you keep switching between, and a plain visibility toggle for one you\nwill not need again this session."]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"If VRGS is using all available RAM and paging to disk, no rendering setting will\nhelp \u2014 reduce what is resident, or tile the model so it does not have to be."}),"\n",(0,s.jsxs)(n.p,{children:["Streamed online tiles are separate again: their memory budget is\n",(0,s.jsx)(n.strong,{children:"Max Cache (MB)"})," under ",(0,s.jsx)(n.em,{children:"Cesium 3D Tiles \u2192 Memory & Performance"}),", with a local\ndisk cache of roughly 1\u20132 GB under ",(0,s.jsx)(n.code,{children:"%LOCALAPPDATA%"}),"."]}),"\n",(0,s.jsx)(n.h2,{id:"picking-and-interpretation-are-slow",children:"Picking and interpretation are slow"}),"\n",(0,s.jsxs)(n.p,{children:["If navigation is smooth but ",(0,s.jsx)(n.em,{children:"clicking"})," on the model is not, the problem is the\nspatial partition tree, not the renderer. Every pick, snap, intersection and\ninterpretation query goes through it."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Right-click the mesh \u2192 Optimization \u2192 Rebuild Partition Tree."})}),"\n",(0,s.jsx)(n.p,{children:"Rebuild it after any significant edit to the geometry \u2014 decimation, cleaning,\nmerging or a coordinate conversion all leave the old index describing a model\nthat no longer exists."}),"\n",(0,s.jsx)(n.p,{children:"Two other things to check:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["On a very large tiled model, ",(0,s.jsx)(n.strong,{children:"Full-Resolution Tiles While Interpreting"})," makes\npicking accurate but slow. It is a genuine trade-off, not a bug."]}),"\n",(0,s.jsxs)(n.li,{children:["The ",(0,s.jsx)(n.a,{href:"/docs/general/interpretation/basic-interpretation",children:"Basic Interpretation"})," tools\npick against whatever is visible. Hiding datasets you are not interpreting on\nmakes picking faster as well as rendering."]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"point-clouds",children:"Point clouds"}),"\n",(0,s.jsx)(n.p,{children:"Point clouds have their own level of detail with per-region frustum culling, so\na large cloud does not need convert
1ing to anything \u2014 but it does respond to\nbeing thinned."}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Command"}),(0,s.jsx)(n.th,{children:"What it does"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.strong,{children:"Filters \u2192 Voxel 2D"})}),(0,s.jsx)(n.td,{children:"Keeps one point per X-Y cell. Good for ground/terrain clouds where vertical density is wasted."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.strong,{children:"Filters \u2192 Voxel 3D"})}),(0,s.jsx)(n.td,{children:"Keeps one point per 3D cell. The general-purpose thinning filter."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.strong,{children:"Reduce Overlap"})}),(0,s.jsx)(n.td,{children:"Removes the redundancy where scan positions cover the same ground several times. Often the biggest single win on a multi-scan survey."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.strong,{children:"Clip Range"})}),(0,s.jsx)(n.td,{children:"Discards points beyond a range from the scanner \u2014 usually the noisy, sparse ones."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.strong,{children:"Operations \u2192 Generate Level of Detail (LOD)"})}),(0,s.jsx)(n.td,{children:"Builds the cloud's LOD layers."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.strong,{children:"Reload Original"})}),(0,s.jsx)(n.td,{children:"Undoes all of it and starts again."})]})]})]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Eye-Dome Lighting"})," deserves a special mention for point clouds: it makes an\nun-coloured or thinned cloud far more readable, which often means you can work\nat a lower point density than you thought."]}),"\n",(0,s.jsx)(n.h2,{id:"streaming-and-tiles",children:"Streaming and tiles"}),"\n",(0,s.jsxs)(n.p,{children:["If detail arrives late rather than never, you are tuning streaming, not\nperformance. The ",(0,s.jsx)(n.em,{children:"Cesium 3D Tiles"})," section of the display properties has the\ncontrols, and the trade-off runs in one direction:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["For the ",(0,s.jsx)(n.strong,{children:"sharpest"})," result on a fast machine and connection: lower\n",(0,s.jsx)(n.strong,{children:"Quality (Screen-Space Error)"}),", raise ",(0,s.jsx)(n.strong,{children:"Max Cache (MB)"})," and\n",(0,s.jsx)(n.strong,{children:"Max Concurrent Downloads"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["For the ",(0,s.jsx)(n.strong,{children:"smoothest"})," experience on a slow link: raise the screen-space error\nand switch on ",(0,s.jsx)(n.strong,{children:"Preload Ancestors"}),", ",(0,s.jsx)(n.strong,{children:"Preload Siblings"})," and ",(0,s.jsx)(n.strong,{children:"Prevent\nHoles"}),", so something is always drawn while the better version loads."]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Frame Budget (ms)"})," caps how long each frame may spend uploading newly arrived\ntiles. Lower it if the view hitches while tiles stream in; raise it if you would\nrather they appeared faster."]}),"\n",(0,s.jsx)(n.h2,{id:"navigation-aids-opengl-view",children:"Navigation aids (OpenGL view)"}),"\n",(0,s.jsxs)(n.p,{children:["The 3D model's ",(0,s.jsx)(n.strong,{children:"Display"})," menu carries three options aimed squarely at large\nmodels:"]}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Command"}),(0,s.jsx)(n.th,{children:"What it does"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.strong,{children:"Filter on Move"})}),(0,s.jsx)(n.td,{children:"Draw a decimated version of the scene while the camera is moving, and the full version once it stops. On by default \u2014 it is why navigation stays responsive on a model that is heavy when still."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.strong,{children:"Distance Filtering"})}),(0,s.jsxs)(n.td,{children:["Stop drawing geometry beyond a distance from the camera. Switching it on also switches ",(0,s.jsx)(n.em,{children:"Filter on Move"})," on, and sets the cut-off from the project's own extent."]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.strong,{children:"Auto Set Centre"})}),(0,s.jsx)(n.td,{children:"Automatically re-centre the view on new objects and polyline interpretations as they are created. Not a performance setting, but on a big model it saves a great deal of navigating."})]})]})]}),"\n",(0,s.jsx)(n.admonition,{title:"These three are OpenGL-view commands",type:"note",children:(0,s.jsx)(n.p,{children:"They are handled by the OpenGL view only, so they have no effect in a Vulkan\nview (the default). The Vulkan view's equivalent is the per-object LOD and\ntiling described above, which works whether the camera is moving or not."})}),"\n",(0,s.jsx)(n.h2,{id:"the-renderer",children:"The renderer"}),"\n",(0,s.jsxs)(n.p,{children:["VRGS renders through ",(0,s.jsx)(n.strong,{children:"Vulkan"})," (the default) or ",(0,s.jsx)(n.strong,{children:"OpenGL"}),". Both are fully\nsupported, but they are not identical:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Vulkan"})," is the default, is required for ",(0,s.jsx)(n.a,{href:"/docs/general/viewing-collaboration/vr-user-guide",children:"VR"}),",\nand is where ray-traced shadows, ambient occlusion and the post-processing\neffects live."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"OpenGL"})," handles a few commands the Vulkan view does not, and can be worth\ntrying if you hit a driver-specific rendering problem."]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["Change it in ",(0,s.jsx)(n.strong,{children:"Project Properties \u2192 Advanced & Diagnostics \u2192 Use Vulkan\nRenderer"}),", or from the command line with ",(0,s.jsx)(n.code,{children:"-vulkan"})," / ",(0,s.jsx)(n.code,{children:"-opengl"}),"."]}),"\n",(0,s.jsx)(n.admonition,{title:"Restart to apply",type:"caution",children:(0,s.jsx)(n.p,{children:"The renderer setting takes effect the next time VRGS starts. It does not switch\nthe live 3D view."})}),"\n",(0,s.jsx)(n.h2,{id:"when-it-was-fine-yesterday",children:"When it was fine yesterday"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Windows moved VRGS to the integrated GPU."})," The most common cause by far\nafter a driver or Windows update. Check Task Manager and set VRGS to ",(0,s.jsx)(n.em,{children:"High\nPerformance"})," \u2014 ",(0,s.jsx)(n.a,{href:"/docs/general/setup-system/multi-gpu-systems",children:"Graphics Settings"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"A driver update."})," Both directions happen. Note which driver was good."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"The project grew."})," Something imported since is now being drawn every frame.\nSwitch datasets off one at a time to find it."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"The project database has bloated."})," Lots of editing and deleting leaves dead\nspace. Set ",(0,s.jsx)(n.strong,{children:"Vacuum On Next Reload"})," in\n",(0,s.jsx)(n.a,{href:"/docs/general/setup-system/project-properties",children:"Project Properties"})," and reload."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"The data is on a network drive."})," Streaming a large model over a network\nshare is slow in a way no setting fixes. Copy it locally."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"An AI or analysis job is running in the background."})," Check the messages\npanel."]}),"\n"]}
1),"\n",(0,s.jsx)(n.h2,{id:"quick-reference",children:"Quick reference"}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Symptom"}),(0,s.jsx)(n.th,{children:"First thing to try"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Stutters while navigating"}),(0,s.jsxs)(n.td,{children:["Generate LOD; check ",(0,s.jsx)(n.em,{children:"Filter on Move"})," is on"]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Slow when still"}),(0,s.jsx)(n.td,{children:"Turn off shadows and ambient occlusion"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Slow with one specific model"}),(0,s.jsxs)(n.td,{children:["Check its triangle count ",(0,s.jsx)(n.em,{children:"and"})," its texture count"]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Slow to click on"}),(0,s.jsx)(n.td,{children:"Rebuild Partition Tree"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Runs out of memory"}),(0,s.jsx)(n.td,{children:"Convert to Tiles; unload what you are not using"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Detail arrives late"}),(0,s.jsx)(n.td,{children:"Raise Screen-Space Error; enable the preload options"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Point cloud is heavy"}),(0,s.jsx)(n.td,{children:"Reduce Overlap, then Voxel 3D"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Slow on a laptop"}),(0,s.jsx)(n.td,{children:"Confirm the dedicated GPU is being used"})]})]})]}),"\n",(0,s.jsx)(n.h2,{id:"see-also",children:"See also"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"/docs/general/meshes-point-clouds/model-preparation",children:"Preparing a Model for Interpretation"})," \u2014 cleaning and sizing a model before it reaches this stage."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"/docs/general/setup-system/hardware-requirements",children:"Hardware Requirements"})," \u2014 what the hardware can reasonably be expected to do."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"/docs/general/setup-system/multi-gpu-systems",children:"Graphics Settings"})," \u2014 making Windows use the right GPU."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"/docs/general/viewing-collaboration/display-properties",children:"Display Properties"})," \u2014 the full reference for every setting mentioned here."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"/docs/general/setup-system/project-properties",children:"Project Properties"})," \u2014 renderer, mesh storage and database maintenance."]}),"\n"]})]})}function c(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},28453(e,n,t){t.d(n,{R:()=>l,x:()=>o});var i=t(96540);const s={},r=i.createContext(s);function l(e){const n=i.useContext(r);return i.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:l(e.components),i.createElement(r.Provider,{value:n},e.children)}}}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.