Fix tileset style recompilation edge cases #9223
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Fixed two cases where styles would be reapplied needlessly every frame
tileset.preloadWhenHidden
is true andtileset.show
is falsetileset.style
is set to an identical style. This wasn't the original bug I was looking into but it was a slowdown waiting to be noticed.There was some code in
Cesium3DTileStyleEngine
that only resetstyleDirty
during the render pass. This is bad because the render pass doesn't get called at all iftileset.preloadWhenHidden
is true andtileset.show
is false and so the style would forever be dirty, which causes shader recompilations to happen for each tile every frame.The proper way to do pass-invariant updates is with
postPassesUpdate
. It ended up being a pretty simple fix.For testing:
preloadWhenHidden
Sandcastle - observe thatcontent.applyStyle(this._style);
is no longer called every frame.Both added unit tests will fail in
master
and pass in this branch.I haven't yet tested this in the application code where this was first noticed, but maybe @IanLilleyT can take over that. Then we could also do a performance comparison.
CC @mramato @IanLilleyT