You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
When rendering a large model (~7K individual renderables) on a mid range devices (2 to 3 years old) the performance has been degraded to the point it becomes unusable.
Affected devices:
Samsung S6 Tab (2019)
Samsung A9+ tab (2023)
Samsung S22 Ultra (2022) - Surprised to see low performance on this device
OnePlus 6T (2018)
Have no problem on Pixel 8 & 7. Even models with over 10K renderables perform smoothly without any dynamic resolution option.
Recording of a model with 7K renderables on Samsung S6 Tab (same result on all affected devices, worst on OnePlus) in the sample gltf viewer (modified dynamic resolution settings)
Screen_recording_20240809_062749.mp4
ModelView initialization, NOTE: On Pixel 8/7 I don't have to increase the memory configs, even larger models render just fine with the default config which makes me wonder if Filament increases the memory config (such as commandBufferSize) based on GPU ?
privateval modelViewer:ModelViewer=ModelViewer(
surfaceView = surfaceView,
manipulator = cameraManipulator,
engine =Engine.Builder().config(
Engine.Config().apply {
// Remember to change the configs in release/config file
commandBufferSizeMB =34*3// to keep it 3 times larger than minCommand as per doc
perRenderPassArenaSizeMB =32+2// keep it roughly 1MB larger per doc
minCommandBufferSizeMB =32
perFrameCommandsSizeMB =32
driverHandleArenaSizeMB =40
}
).build()
)
Dynamic resolution settings,
privatefundisablePostProcessing() {
modelViewer.view.run {
// I initially disabled post processing following the suggestion from https://github.com/google/filament/discussions/4965// but dynamicResolution is also part of post processing and wouldn't work if post processing is disabled. So I disabled all set...Enabled functions in View class (only two as of now)// isPostProcessingEnabled = false
setShadowingEnabled(false)
setScreenSpaceRefractionEnabled(false)
// on mobile, better use lower quality color buffer
renderQuality = renderQuality.apply {
hdrColorBuffer =View.QualityLevel.LOW
}
// dynamic resolution often helps a lot
dynamicResolutionOptions = dynamicResolutionOptions.apply {
enabled =true
quality =View.QualityLevel.LOW
minScale =0.1f
maxScale =0.8f
sharpness =0.5f
}
}
}
On Web we use XeoKit which also uses something like dynamicResolution. In addition to lowering the quality it doesn't render renderables that are far from camera & almost not visible, when interacting with the model and renders everything once we stop interacting. Is there anything else I can do to improve performance? Am not a graphics developer so sorry if my questions are silly 🙏 how about enabling face culling during the time of interaction or render only the entities that the camera can see (are these happening by default already ?)
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
-
When rendering a large model (~7K individual renderables) on a mid range devices (2 to 3 years old) the performance has been degraded to the point it becomes unusable.
Affected devices:
Samsung S6 Tab (2019)
Samsung A9+ tab (2023)
Samsung S22 Ultra (2022) - Surprised to see low performance on this device
OnePlus 6T (2018)
Have no problem on Pixel 8 & 7. Even models with over 10K renderables perform smoothly without any dynamic resolution option.
Recording of a model with 7K renderables on Samsung S6 Tab (same result on all affected devices, worst on OnePlus) in the sample gltf viewer (modified dynamic resolution settings)
Screen_recording_20240809_062749.mp4
ModelView initialization,
NOTE: On Pixel 8/7 I don't have to increase the memory configs, even larger models render just fine with the default config which makes me wonder if Filament increases the memory config (such as commandBufferSize) based on GPU ?
Dynamic resolution settings,
On Web we use XeoKit which also uses something like dynamicResolution. In addition to lowering the quality it doesn't render renderables that are far from camera & almost not visible, when interacting with the model and renders everything once we stop interacting. Is there anything else I can do to improve performance? Am not a graphics developer so sorry if my questions are silly 🙏 how about enabling face culling during the time of interaction or render only the entities that the camera can see (are these happening by default already ?)
Beta Was this translation helpful? Give feedback.
All reactions