|
@@ -1,8 +1,9 @@
|
|
-import { toValue, useElementSize, useWindowSize } from '@vueuse/core'
|
|
|
|
-import { inject, provide, readonly, shallowRef, computed, ref } from 'vue'
|
|
|
|
|
|
+import { toValue, useElementSize, useFps, useMemory, useRafFn, useWindowSize } from '@vueuse/core'
|
|
|
|
+import { inject, provide, readonly, shallowRef, computed, ref, onUnmounted } from 'vue'
|
|
import type { Camera, EventDispatcher, Scene, WebGLRenderer } from 'three'
|
|
import type { Camera, EventDispatcher, Scene, WebGLRenderer } from 'three'
|
|
import { Raycaster } from 'three'
|
|
import { Raycaster } from 'three'
|
|
import type { ComputedRef, DeepReadonly, MaybeRef, MaybeRefOrGetter, Ref, ShallowRef } from 'vue'
|
|
import type { ComputedRef, DeepReadonly, MaybeRef, MaybeRefOrGetter, Ref, ShallowRef } from 'vue'
|
|
|
|
+import { calculateMemoryUsage } from '../../utils/perf'
|
|
import { useCamera } from '../useCamera'
|
|
import { useCamera } from '../useCamera'
|
|
import type { UseRendererOptions } from '../useRenderer'
|
|
import type { UseRendererOptions } from '../useRenderer'
|
|
import { useRenderer } from '../useRenderer'
|
|
import { useRenderer } from '../useRenderer'
|
|
@@ -17,6 +18,18 @@ export interface TresContext {
|
|
controls: Ref<(EventDispatcher & { enabled: boolean }) | null>
|
|
controls: Ref<(EventDispatcher & { enabled: boolean }) | null>
|
|
renderer: ShallowRef<WebGLRenderer>
|
|
renderer: ShallowRef<WebGLRenderer>
|
|
raycaster: ShallowRef<Raycaster>
|
|
raycaster: ShallowRef<Raycaster>
|
|
|
|
+ perf: {
|
|
|
|
+ maxFrames: number
|
|
|
|
+ fps: {
|
|
|
|
+ value: number
|
|
|
|
+ accumulator: number[]
|
|
|
|
+ }
|
|
|
|
+ memory: {
|
|
|
|
+ currentMem: number
|
|
|
|
+ allocatedMem: number
|
|
|
|
+ accumulator: number[]
|
|
|
|
+ }
|
|
|
|
+ }
|
|
registerCamera: (camera: Camera) => void
|
|
registerCamera: (camera: Camera) => void
|
|
setCameraActive: (cameraOrUuid: Camera | string) => void
|
|
setCameraActive: (cameraOrUuid: Camera | string) => void
|
|
deregisterCamera: (camera: Camera) => void
|
|
deregisterCamera: (camera: Camera) => void
|
|
@@ -78,6 +91,18 @@ export function useTresContextProvider({
|
|
renderer,
|
|
renderer,
|
|
raycaster: shallowRef(new Raycaster()),
|
|
raycaster: shallowRef(new Raycaster()),
|
|
controls: ref(null),
|
|
controls: ref(null),
|
|
|
|
+ perf: {
|
|
|
|
+ maxFrames: 160,
|
|
|
|
+ fps: {
|
|
|
|
+ value: 0,
|
|
|
|
+ accumulator: [],
|
|
|
|
+ },
|
|
|
|
+ memory: {
|
|
|
|
+ currentMem: 0,
|
|
|
|
+ allocatedMem: 0,
|
|
|
|
+ accumulator: [],
|
|
|
|
+ },
|
|
|
|
+ },
|
|
extend,
|
|
extend,
|
|
registerCamera,
|
|
registerCamera,
|
|
setCameraActive,
|
|
setCameraActive,
|
|
@@ -85,6 +110,75 @@ export function useTresContextProvider({
|
|
}
|
|
}
|
|
|
|
|
|
provide('useTres', toProvide)
|
|
provide('useTres', toProvide)
|
|
|
|
+
|
|
|
|
+ // Performance
|
|
|
|
+ const updateInterval = 100 // Update interval in milliseconds
|
|
|
|
+ const fps = useFps({ every: updateInterval })
|
|
|
|
+ const { isSupported, memory } = useMemory({ interval: updateInterval })
|
|
|
|
+ const maxFrames = 160
|
|
|
|
+ let lastUpdateTime = performance.now()
|
|
|
|
+
|
|
|
|
+ const updatePerformanceData = ({ timestamp }: { timestamp: number }) => {
|
|
|
|
+
|
|
|
|
+ // Update WebGL Memory Usage (Placeholder for actual logic)
|
|
|
|
+ // perf.memory.value = calculateMemoryUsage(gl)
|
|
|
|
+ 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
|
|
|
|
+
|
|
|
|
+ // Update FPS
|
|
|
|
+ toProvide.perf.fps.accumulator.push(fps.value as never)
|
|
|
|
+
|
|
|
|
+ if (toProvide.perf.fps.accumulator.length > maxFrames) {
|
|
|
|
+ toProvide.perf.fps.accumulator.shift()
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ toProvide.perf.fps.value = fps.value
|
|
|
|
+
|
|
|
|
+ // Update memory
|
|
|
|
+ if (isSupported.value && memory.value) {
|
|
|
|
+ toProvide.perf.memory.accumulator.push(memory.value.usedJSHeapSize / 1024 / 1024 as never)
|
|
|
|
+
|
|
|
|
+ if (toProvide.perf.memory.accumulator.length > maxFrames) {
|
|
|
|
+ toProvide.perf.memory.accumulator.shift()
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ toProvide.perf.memory.currentMem
|
|
|
|
+ = toProvide.perf.memory.accumulator.reduce((a, b) => a + b, 0) / toProvide.perf.memory.accumulator.length
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 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 })
|
|
|
|
+
|
|
|
|
+ onUnmounted(() => {
|
|
|
|
+ pause()
|
|
|
|
+ })
|
|
|
|
+
|
|
return toProvide
|
|
return toProvide
|
|
}
|
|
}
|
|
|
|
|