From 1204a654c602250b3a4aaa97b964d99a2a2906c3 Mon Sep 17 00:00:00 2001 From: keiya sasaki Date: Thu, 23 Feb 2023 17:32:21 +0900 Subject: [PATCH] perf: improve 3dtiles features calculation on reearth/core (#489) --- .../engines/Cesium/Feature/Tileset/hooks.ts | 26 +++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/src/core/engines/Cesium/Feature/Tileset/hooks.ts b/src/core/engines/Cesium/Feature/Tileset/hooks.ts index 1fad29e180..7424628c08 100644 --- a/src/core/engines/Cesium/Feature/Tileset/hooks.ts +++ b/src/core/engines/Cesium/Feature/Tileset/hooks.ts @@ -176,16 +176,38 @@ const useFeature = ({ const tileAppearance = useMemo(() => extractSimpleLayer(layer)?.["3dtiles"], [layer]); const tileAppearanceShow = tileAppearance?.show; const tileAppearanceColor = tileAppearance?.color; + + // If styles are updated while features are calculating, + // we stop calculating features, and reassign styles. + const shouldSkipComputing = useRef(false); useEffect(() => { - cachedFeaturesRef.current.map(f => { + shouldSkipComputing.current = true; + }, [tileAppearanceShow, tileAppearanceColor]); + + const computeFeatures = useCallback(() => { + for (const f of cachedFeaturesRef.current) { + if (shouldSkipComputing.current) { + break; + } + const properties = f.feature.properties; if (properties.show !== tileAppearanceShow || properties.color !== tileAppearanceColor) { f.feature.properties.color = tileAppearanceColor; f.feature.properties.show = tileAppearanceShow; attachComputedFeature(f); } - }); + } }, [tileAppearanceShow, tileAppearanceColor, attachComputedFeature]); + + useEffect(() => { + computeFeatures(); + + // Computation is stopped, start re-calculating. + if (shouldSkipComputing.current) { + shouldSkipComputing.current = false; + computeFeatures(); + } + }, [computeFeatures]); }; export const useHooks = ({