|
@@ -1,5 +1,5 @@
|
|
|
-import { toValue, useElementSize, useFps, useMemory, useRafFn, useWindowSize } from '@vueuse/core'
|
|
|
-import { inject, provide, readonly, shallowRef, computed, ref, onUnmounted } from 'vue'
|
|
|
+import { toValue, useElementSize, useFps, useMemory, useRafFn, useWindowSize, refDebounced } from '@vueuse/core'
|
|
|
+import { inject, provide, readonly, shallowRef, computed, ref, onUnmounted, watchEffect } from 'vue'
|
|
|
import type { Camera, EventDispatcher, Scene, WebGLRenderer } from 'three'
|
|
|
import { Raycaster } from 'three'
|
|
|
import type { ComputedRef, DeepReadonly, MaybeRef, MaybeRefOrGetter, Ref, ShallowRef } from 'vue'
|
|
@@ -55,14 +55,23 @@ export function useTresContextProvider({
|
|
|
: useElementSize(toValue(canvas).parentElement),
|
|
|
)
|
|
|
|
|
|
- const width = computed(() => elementSize.value.width.value)
|
|
|
- const height = computed(() => elementSize.value.height.value)
|
|
|
+ const reactiveSize = shallowRef({
|
|
|
+ width: 0,
|
|
|
+ height: 0,
|
|
|
+ })
|
|
|
+ const debouncedReactiveSize = refDebounced(reactiveSize, 10)
|
|
|
+ const unWatchSize = watchEffect(() => {
|
|
|
+ reactiveSize.value = {
|
|
|
+ width: elementSize.value.width.value,
|
|
|
+ height: elementSize.value.height.value,
|
|
|
+ }
|
|
|
+ })
|
|
|
|
|
|
- const aspectRatio = computed(() => width.value / height.value)
|
|
|
+ const aspectRatio = computed(() => debouncedReactiveSize.value.width / debouncedReactiveSize.value.height)
|
|
|
|
|
|
const sizes = {
|
|
|
- height,
|
|
|
- width,
|
|
|
+ height: computed(() => debouncedReactiveSize.value.height),
|
|
|
+ width: computed(() => debouncedReactiveSize.value.width),
|
|
|
aspectRatio,
|
|
|
}
|
|
|
const localScene = shallowRef<Scene>(scene)
|
|
@@ -113,7 +122,7 @@ export function useTresContextProvider({
|
|
|
|
|
|
// Performance
|
|
|
const updateInterval = 100 // Update interval in milliseconds
|
|
|
- const fps = useFps({ every: updateInterval })
|
|
|
+ const fps = useFps({ every: updateInterval })
|
|
|
const { isSupported, memory } = useMemory({ interval: updateInterval })
|
|
|
const maxFrames = 160
|
|
|
let lastUpdateTime = performance.now()
|
|
@@ -125,7 +134,7 @@ export function useTresContextProvider({
|
|
|
if (toProvide.scene.value) {
|
|
|
toProvide.perf.memory.allocatedMem = calculateMemoryUsage(toProvide.scene.value as unknown as TresObject)
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
// Update memory usage
|
|
|
if (timestamp - lastUpdateTime >= updateInterval) {
|
|
|
lastUpdateTime = timestamp
|
|
@@ -147,9 +156,9 @@ export function useTresContextProvider({
|
|
|
toProvide.perf.memory.accumulator.shift()
|
|
|
}
|
|
|
|
|
|
- toProvide.perf.memory.currentMem
|
|
|
+ toProvide.perf.memory.currentMem
|
|
|
= toProvide.perf.memory.accumulator.reduce((a, b) => a + b, 0) / toProvide.perf.memory.accumulator.length
|
|
|
-
|
|
|
+
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -157,25 +166,26 @@ export function useTresContextProvider({
|
|
|
// Devtools
|
|
|
let accumulatedTime = 0
|
|
|
const interval = 1 // Interval in milliseconds, e.g., 1000 ms = 1 second
|
|
|
-
|
|
|
+
|
|
|
const { pause, resume } = useRafFn(({ delta }) => {
|
|
|
if (!window.__TRES__DEVTOOLS__) return
|
|
|
|
|
|
updatePerformanceData({ timestamp: performance.now() })
|
|
|
-
|
|
|
+
|
|
|
// Accumulate the delta time
|
|
|
accumulatedTime += delta
|
|
|
-
|
|
|
+
|
|
|
// Check if the accumulated time is greater than or equal to the interval
|
|
|
if (accumulatedTime >= interval) {
|
|
|
window.__TRES__DEVTOOLS__.cb(toProvide)
|
|
|
-
|
|
|
+
|
|
|
// Reset the accumulated time
|
|
|
accumulatedTime = 0
|
|
|
}
|
|
|
- }, { immediate: true })
|
|
|
-
|
|
|
+ }, { immediate: true })
|
|
|
+
|
|
|
onUnmounted(() => {
|
|
|
+ unWatchSize()
|
|
|
pause()
|
|
|
})
|
|
|
|