Class SoLDMGlobalResourceParameters
- java.lang.Object
-
- com.openinventor.inventor.Inventor
-
- com.openinventor.ldm.SoLDMGlobalResourceParameters
-
public class SoLDMGlobalResourceParameters extends Inventor
Global resource parameters for LDM. This class contains functions for controlling global resource parameters for the LDM module.For extensions that use the LDM module, particularly VolumeViz, these parameters can have a significant effect on resource usage (primarily memory) and rendering performance.
Memory management
This class allows the application to specify how much CPU and GPU memory VolumeViz can use to load data and textures. By default the main memory and texture memory limits are set to a percentage of the total available system and GPU memory (see the
setMaxMainMemory()
andsetMaxTexMemory()
methods). Applications can use theSoCpuDevice
andSoGLDevice
classes to query the total and available memory on the CPU and GPU. There is an additional memory allocation for the BufferObject cache described below. How VolumeViz uses CPU memory depends on the data source (tiled or not tiled), the tile cache policy (seeSoLDMResourceParameters.tileCachePolicy
field) and theSoPreferences
variable LDM_USE_IN_MEM_COMPRESSION.Tiles:
VolumeViz uses a data manager called LDM to manage volume data. LDM manages volume data in chunks called “tiles”. If the volume size is larger than the tile size, then there are two classes of tile: full-resolution tiles containing actual data values and low-resolution tiles containing sub-sampled data values. The application may have native data that is already tiled or the data may be pre-processed to create tiles and store them in the LDM file format. In an LDM format file the tiles may optionally be compressed to save disk space and memory, but in this case, the tiles must be expanded before sending to the GPU. If the data is not tiled, for example disk formats like DICOM and SEGY or an in-memory volume, then tiles must be created in memory at runtime.Tile size:
Note that the default tile size is small and generally you wll get better performance with non-tiled data by explicitly setting a larger tile size (see the ldmResourceParameters field andSoLDMResourceParameters.tileDimension
). If the volume size is 512^3 or less then the tile size may be set to the volume size to avoid the overhead of tiling. Do not set the tile size larger than 512 for a volume data set. However, if the volume is actually a large "image", i.e. the Z dimension is 1, then setting the tile size to 1024 may improve performance.Caches:
LDM allocates CPU memory for the CPU Tile Cache and the secondary BufferObject cache. The CPU tile cache is normally as large as needed or other memory requirements allow. If the volume is larger than the available or allowed CPU memory, then LDM keeps the “most important” tiles in memory (importance is determined by various heuristics set in this class and inSoLDMResourceParameters
). The BufferObject cache is normally small and is used to temporarily store tiles that are created by LDM at run-time.- CPU Tile Cache (main memory)
VolumeViz uses this amount of CPU memory as the primary cache for LDM data tiles. The main memory limit is set in megabytes using thesetMaxMainMemory()
method. If the data set is small enough to fit in system memory, then generally the memory limit should be set high enough to allow this. If the data set is larger than system memory, then the memory limit should be set as high as possible without impacting the application's other needs for memory. If the tile size is (for example) 64 and each voxel is a float value, then each tile requires approximately 1 MB of system memory. However since Open Inventor 8.5, the system memory requirement is reduced for compressed LDM tiles (stored compressed) and for uniform tiles (stored as a single value).
When there are multiple LDM data sets, by default each data set receivesgetMaxMainMemory()
divided by the number of datasets. Each time a new data set is created the per-dataset value is recomputed and some memory is taken away from existing data sets. Note: This default allocation of memory to multiple data sets is not optimal if the data sets have significantly different sizes. For example the memory required for a height field is normally much less than for a volume. In this case the application can explicitly allocate memory to each data set using the maxMainMemory field of theSoLDMResourceParameters
object associated with the data set (see theSoDataSet.ldmResourceParameters
field). - GPU Tile Cache (texture memory)
VolumeViz uses this amount of GPU memory to cache LDM data tiles on the GPU. The texture memory limit is set in megabytes using thesetMaxTexMemory()
method. This value can also be set separately for each data set usingSoLDMResourceParameters
.Warning Some systems integrate GPU memory with CPU memory. In this case, if you allocate 4GB of CPU memory and 4GB of GPU memory, the system may see a total of 8GB private memory used by the process, leading to out-of-memory errors or swapping issues. If you face such issues, you should ensure that max CPU memory + max GPU memory is less than the total available CPU memory in your machine.
- BufferObject cache
In some cases LDM needs to create tiles on-the-fly at runtime. To reduce memory usage and avoid duplicating application data, these created tiles are considered temporary and are stored in the BufferObject cache. This is a secondary cache that is separate from, and in addition to, the CPU tile cache (main memory). How the BufferObject cache is used depends on the data source (tiled or not) and the tile caching policy (seeSoLDMResourceParameters.tileCachePolicy
).
For example when compressed tiles are loaded from an LDM format file, they are stored in the CPU tile cache still compressed (to reduce the memory requirement). When the tile data is needed to send data to the GPU, a temporary uncompressed tile is created and stored in the BufferObject cache. The BufferObject cache is also used to expand uniform tiles, which are stored in the LDM file and in memory as a single value.
For non-tiled data (e.g. SEGY or DICOM or in-memory volume), depending on the tile cache policy, tiles are created from the source data when needed to send data to the GPU and temporarily stored in the BufferObject cache.
The BufferObject cache size can only be set using theSoPreferences
variable OIV_BUFFER_OBJECT_CACHE_SIZE. The size is set in number of tiles (not amount of memory) so the actual size of this cache depends on both the tile size and the data type size, i.e. it is larger for floating point data than for byte data. The default size is 50 tiles. The BufferObject cache size can only be set globally, not for each data set. The BufferObject cache was added in Open Inventor version 8.5.
- See Also:
SoDataSet
,SoVolumeData
,SoLDMResourceParameters
- CPU Tile Cache (main memory)
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static interface
SoLDMGlobalResourceParameters.LoadListener
Loading callback for LDM mode.static class
SoLDMGlobalResourceParameters.VisualFeedbackParams
Visual feedback modes.-
Nested classes/interfaces inherited from class com.openinventor.inventor.Inventor
Inventor.ConstructorCommand
-
-
Field Summary
-
Fields inherited from class com.openinventor.inventor.Inventor
VERBOSE_LEVEL, ZeroHandle
-
-
Method Summary
All Methods Static Methods Concrete Methods Deprecated Methods Modifier and Type Method Description static void
addLoadListener(SoLDMGlobalResourceParameters.LoadListener listener)
Sets a callback to be called with the loading state.static long
getDefaultMaxMainMem()
Returns the default maximum system (CPU) memory in MB.static long
getDefaultMaxTexMem()
Returns the default maximum GPU memory in MB.static boolean
getIgnoreFullyTransparentTiles()
Returns the IgnoreFullyTransparentTiles flag.static int
getLoadNotificationRate()
Returns the load notification rate.static long
getMax2DTexMemory()
Get the maximum number of 2D textures allowed to be loaded.static int
getMaxMainMemory()
Returns the maximum main memory in MB for all the VolumeViz data sets.static int
getMaxTexMemory()
Returns the maximum texture memory in MB for all the VolumeViz data sets.static boolean
getMoveLowResolution()
Deprecated.As of Open Inventor 9610.static int
getNumIO()
Returns the current number of loading threads.static boolean
getScreenResolutionCulling()
Returns the screen resolution culling state.static boolean
getSliceEqualResolution()
Returns the slice equal resolution flag.static int
getTex2LoadRate()
Returns the maximum number of 2D textures allowed to be loaded into texture memory per frame for all the VolumeViz data sets.static int
getTex3LoadRate()
Returns the maximum number of tiles (3D textures) allowed to be downloaded into texture (GPU) memory per frame for all the VolumeViz data sets.static boolean
getViewCulling()
Returns the view culling flag.static boolean
getViewpointRefinement()
Returns the viewpoint refinement flag.static boolean
getVisualFeedbackParam(SoLDMGlobalResourceParameters.VisualFeedbackParams param)
Returns the state of the specified visual feedback parameter.static void
removeLoadListener(SoLDMGlobalResourceParameters.LoadListener listener)
static void
setIgnoreFullyTransparentTiles(boolean state)
Sets the IgnoreFullyTransparentTiles flag.static void
setLoadNotificationRate(int name_14997)
Sets the load notification rate (number of tiles).static void
setMax2DTexMemory(long maxMemory)
Sets the maximum 2D texture GPU memory in MB allowed to be loaded for all VolumeViz data sets.static void
setMaxMainMemory(int maxMainMemory)
Sets the maximum main (CPU) memory, in MB, to use for all VolumeViz data sets.static void
setMaxTexMemory(int maxTexMemory)
Sets the maximum texture (GPU) memory, in MB, for all VolumeViz data sets.static void
setMoveLowResolution(boolean state)
Deprecated.As of Open Inventor 9610.static void
setNumIO(int numIO)
Sets how many simultaneous tile loading threads to use if multi I/O mode is on (it is on when LDM mode is on).static void
setScreenResolutionCulling(boolean flag)
Sets the screen resolution culling flag.static void
setSliceEqualResolution(boolean state)
Calls setSliceEqualResolution(state, true).static void
setSliceEqualResolution(boolean state, boolean forceRedraw)
Sets the slice equal resolution flag.static void
setTex2LoadRate(int loadRate)
Sets the maximum number of 2D textures allowed to be downloaded into texture (GPU) memory per frame (render traversal) for all the VolumeViz data sets.static void
setTex3LoadRate(int loadRate)
Sets the maximum number of 3D textures allowed to be downloaded into texture (GPU) memory, per frame (render traversal), for all VolumeViz data sets.static void
setViewCulling(boolean state)
Calls setViewCulling(state, true).static void
setViewCulling(boolean state, boolean forceRedraw)
Sets the view culling flag.static void
setViewpointRefinement(boolean state)
Sets the viewpoint refinement flag.static void
setVisualFeedbackParam(SoLDMGlobalResourceParameters.VisualFeedbackParams param, boolean state)
Sets the specified visual feedback parameter to true or false.-
Methods inherited from class com.openinventor.inventor.Inventor
dispose, getNativeResourceHandle
-
-
-
-
Method Detail
-
addLoadListener
public static void addLoadListener(SoLDMGlobalResourceParameters.LoadListener listener)
Sets a callback to be called with the loading state. The callback function is called with TRUE when the process starts loading, and with FALSE when loading is complete. NOTE: This feature is available with VolumeVizLDM only.
-
removeLoadListener
public static void removeLoadListener(SoLDMGlobalResourceParameters.LoadListener listener)
-
setViewCulling
public static void setViewCulling(boolean state)
Calls setViewCulling(state, true).
-
setSliceEqualResolution
public static void setSliceEqualResolution(boolean state)
Calls setSliceEqualResolution(state, true).
-
setMax2DTexMemory
public static void setMax2DTexMemory(long maxMemory)
Sets the maximum 2D texture GPU memory in MB allowed to be loaded for all VolumeViz data sets.
The sum of 2D texture memory allowed per data set (see SoLDMResourceParameters.max2DTextures field) must be less than or equal to this value. The total amount of GPU memory allowed is set using thesetMaxTexMemory
method. This method limits the amount of GPU memory that can be used by (for example)SoOrthoSlice
andSoVolumeSkin
nodes. This can be useful when combining slices and volume rendering because the 3D textures used by volume rendering require much more GPU memory. Default is 5% of GPU memory available at application startup.
-
getMaxTexMemory
public static int getMaxTexMemory()
Returns the maximum texture memory in MB for all the VolumeViz data sets. SeesetMaxTexMemory
.
-
getMax2DTexMemory
public static long getMax2DTexMemory()
Get the maximum number of 2D textures allowed to be loaded. SeesetMax2DTexMemory
.
-
getTex3LoadRate
public static int getTex3LoadRate()
Returns the maximum number of tiles (3D textures) allowed to be downloaded into texture (GPU) memory per frame for all the VolumeViz data sets. SeesetTex3LoadRate()
.
-
getDefaultMaxMainMem
public static long getDefaultMaxMainMem()
Returns the default maximum system (CPU) memory in MB.
-
setTex3LoadRate
public static void setTex3LoadRate(int loadRate)
Sets the maximum number of 3D textures allowed to be downloaded into texture (GPU) memory, per frame (render traversal), for all VolumeViz data sets.
You can set this parameter separately for each data set using field SoLDMResourceParameter.tex3LoadRate. Default is 10 3D textures (effectively 3 tiles) per render traversal.Each tile needed for volume rendering (
SoVolumeRender
) and volume geometry must be transfered to GPU memory as a 3D texture. So, for example, transfering 1000 tiles at the default loadRate (10) requires 100 frames. (How many seconds this takes depends on the frames per second possible, which in turn depends on many factors including the complexity of the scene graph.) Increasing the loadRate value reduces the number of frames required to reach maximum resolution. But the render traversal has to wait for the data transfer to finish, so each frame may take longer to render, increasing the total time to reach maximum resolution.
-
getMoveLowResolution
@Deprecated public static boolean getMoveLowResolution()
Deprecated.As of Open Inventor 9610. No longer used. Use SoLDMResourceParameters' TileCachePolicies field instead.Returns the move low resolution flag. SeesetMoveLowResolution()
.Warning Deprecated since Open Inventor 9610. No longer used. Use
SoLDMResourceParameters
' TileCachePolicies field instead.
-
setMaxMainMemory
public static void setMaxMainMemory(int maxMainMemory)
Sets the maximum main (CPU) memory, in MB, to use for all VolumeViz data sets.
You can also set the maximum main memory for each data set separately using the maxMainMemory field of the data set'sSoLDMResourceParameters
object (seeSoDataSet.ldmResourceParameters
). The sum of all per data set values must be less than or equal to the value set here.Default (since Open Inventor 8.1) is 50% of total CPU memory up to 70% of free memory. See
SoCpuDevice
to query available CPU memory.
-
getScreenResolutionCulling
public static boolean getScreenResolutionCulling()
Returns the screen resolution culling state. SeesetScreenResolutionCulling()
.
-
setMaxTexMemory
public static void setMaxTexMemory(int maxTexMemory)
Sets the maximum texture (GPU) memory, in MB, for all VolumeViz data sets.
You can also set the maximum texture memory for each data set separately using the maxTexMemory field of the data set'sSoLDMResourceParameters
object (seeSoDataSet.ldmResourceParameters
). The sum of all per data set values must be less than or equal to the value set here.Default is 75% of GPU memory available at application startup. See
SoGLDevice
to query available GPU memory.
-
setMoveLowResolution
@Deprecated public static void setMoveLowResolution(boolean state)
Deprecated.As of Open Inventor 9610. No longer used. Use SoLDMResourceParameters' TileCachePolicies field instead.Sets the low resolution when moving flag. Default is false. When true, lower resolution tiles are automatically used while the camera is moving (e.g. when user is panning and rotating.Warning Deprecated since Open Inventor 9610. No longer used. Use
SoLDMResourceParameters
' TileCachePolicies field instead.
-
getMaxMainMemory
public static int getMaxMainMemory()
Returns the maximum main memory in MB for all the VolumeViz data sets. SeesetMaxMainMemory
.
-
getDefaultMaxTexMem
public static long getDefaultMaxTexMem()
Returns the default maximum GPU memory in MB.
-
setViewpointRefinement
public static void setViewpointRefinement(boolean state)
Sets the viewpoint refinement flag. Default is true. When true, tile refinement depends on the viewpoint. In other words, tiles closer to the camera have higher priority and higher resolution data will be loaded for closer tiles first. This can be useful for large volumes that cannot be completely loaded in memory.
-
setViewCulling
public static void setViewCulling(boolean state, boolean forceRedraw)
Sets the view culling flag. Default is true. When true, only tiles that are inside the view frustum (i.e. visible) will be loaded and conversely tiles that are outside the view frustum may be discarded.
-
getViewpointRefinement
public static boolean getViewpointRefinement()
Returns the viewpoint refinement flag. SeesetViewpointRefinement()
.
-
getVisualFeedbackParam
public static boolean getVisualFeedbackParam(SoLDMGlobalResourceParameters.VisualFeedbackParams param)
Returns the state of the specified visual feedback parameter.
-
setIgnoreFullyTransparentTiles
public static void setIgnoreFullyTransparentTiles(boolean state)
Sets the IgnoreFullyTransparentTiles flag. Default is false. When true, tiles for which all voxels between their min and max values are fully transparent (alpha = 0) will not be refined. In other words a low resolution version will always be used. This can reduce memory requirements for volumes with significant "empty space".
-
setScreenResolutionCulling
public static void setScreenResolutionCulling(boolean flag)
Sets the screen resolution culling flag. Default is false. When true, only tiles for which the projection of a voxel is greater than or equal to 1 pixel on screen will be loaded. This avoids unnecessary loading of high resolution data for large volumes. However if you "zoom out" from a volume, it does not force lower resolution tiles to be used (high resolution tiles already in memory will still be used). If necessary use theSoLDMResourceParameters.fixedResolution
field to force use of lower resolution tiles.
-
getIgnoreFullyTransparentTiles
public static boolean getIgnoreFullyTransparentTiles()
Returns the IgnoreFullyTransparentTiles flag. SeesetIgnoreFullyTransparentTiles()
.
-
getViewCulling
public static boolean getViewCulling()
Returns the view culling flag. SeesetViewCulling()
.
-
setVisualFeedbackParam
public static void setVisualFeedbackParam(SoLDMGlobalResourceParameters.VisualFeedbackParams param, boolean state)
Sets the specified visual feedback parameter to true or false.
-
getTex2LoadRate
public static int getTex2LoadRate()
Returns the maximum number of 2D textures allowed to be loaded into texture memory per frame for all the VolumeViz data sets. SeesetTex2LoadRate()
.
-
setLoadNotificationRate
public static void setLoadNotificationRate(int name_14997)
Sets the load notification rate (number of tiles). When rate new tiles have been loaded in main memory, a redraw will be scheduled. This is useful because tiles are loaded asynchronously using multiple threads. The default is 50 tiles. Which means, for example, if each voxel is one byte and the tileSize is 64x64x64, a redraw will be scheduled whenever 13 MB of data has been loaded.
-
setTex2LoadRate
public static void setTex2LoadRate(int loadRate)
Sets the maximum number of 2D textures allowed to be downloaded into texture (GPU) memory per frame (render traversal) for all the VolumeViz data sets.
You can set this parameter separately for each data set using field SoLDMResourceParameter.tex2LoadRate. Default is 640 2D textures per frame.Each tile needed to render a slice (
SoOrthoSlice
,SoVolumeSkin
, etc) must be loaded into GPU memory as a 2D texture. Increasing the loadRate value reduces the number of frames required to reach maximum resolution. But the render traversal has to wait for the data transfer to finish, so each frame may take longer to render, increasing the total time to reach maximum resolution.
-
getLoadNotificationRate
public static int getLoadNotificationRate()
Returns the load notification rate. SeesetLoadNotificationRate()
.
-
getNumIO
public static int getNumIO()
Returns the current number of loading threads. SeesetNumIO()
.
-
setSliceEqualResolution
public static void setSliceEqualResolution(boolean state, boolean forceRedraw)
Sets the slice equal resolution flag. Default is false. When true, slice primitives, e.g.SoOrthoSlice
andSoObliqueSlice
, are always rendered using a set of tiles at the same resolution level. This avoids potentially distracting visual effects caused by mixing tiles of different resolution on the same slice. But it means that the slice will be rendered at a lower resolution if it is not possible to load every tile needed for the higher resolution. When false and viewpoint refinement is enabled, higher resolution tiles will be loaded for portions of the slice closer to the camera even if it is not possible to load every high resolution tile.An alternative strategy is to enable the
SoSlice.largeSliceSupport
field. When large slice support is enabled, if all the required full resolution tiles have already been loaded, then the slice data is taken from LDM cache memory as usual. But if some required tiles are not currently in memory, the full resolution slice data will be loaded directly from the volume reader without loading the complete tiles. This reduces disk I/O and reduces the amount of system memory required to display the slice at full resolution, so larger (or more) slices can be displayed.
-
setNumIO
public static void setNumIO(int numIO)
Sets how many simultaneous tile loading threads to use if multi I/O mode is on (it is on when LDM mode is on). The IVVR_NUM_LOADERS preference (see SoPreference) lets you choose the initial number of loading threads at launch. Changing this preference at runtime will not affect the actual number of loading threads, use this method instead. If this preference is not set, the default is 4.The IVVR_MAX_NUM_LOADERS preference lets you set a maximum number of tile loading threads. If this method is called with a larger number, the number of loading threads will be set to the maximum instead. If this preference is not set, the maximum is 20.
-
getSliceEqualResolution
public static boolean getSliceEqualResolution()
Returns the slice equal resolution flag. SeesetSliceEqualResolution()
.
-
-