Skip to content

Commit 8bb06f6

Browse files
authored
perf: 降低鼠标移动处理的 CPU 消耗 (#458)
1 parent b6ad482 commit 8bb06f6

File tree

3 files changed

+33
-6
lines changed

3 files changed

+33
-6
lines changed

src/composables/useDevice.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ interface MouseButtonEvent {
1919
value: string
2020
}
2121

22-
interface MouseMoveValue {
22+
export interface MouseMoveValue {
2323
x: number
2424
y: number
2525
}

src/composables/useModel.ts

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
1+
import type { MouseMoveValue } from './useDevice.ts'
2+
import type { Monitor } from '@tauri-apps/api/window'
3+
14
import { LogicalSize, PhysicalSize } from '@tauri-apps/api/dpi'
25
import { resolveResource } from '@tauri-apps/api/path'
36
import { getCurrentWebviewWindow } from '@tauri-apps/api/webviewWindow'
7+
import { availableMonitors as getAvailableMonitors } from '@tauri-apps/api/window'
48
import { message } from 'ant-design-vue'
59
import { isNil, round } from 'es-toolkit'
6-
import { ref, watch } from 'vue'
10+
import { computed, onBeforeMount, ref, watch } from 'vue'
711

812
import live2d from '../utils/live2d'
913
import { getCursorMonitor } from '../utils/monitor'
@@ -22,6 +26,13 @@ export function useModel() {
2226
const modelStore = useModelStore()
2327
const catStore = useCatStore()
2428
const modelSize = ref<ModelSize>()
29+
const availableMonitors = ref<Monitor[]>([])
30+
31+
const isOnlySingleMonitor = computed(() => availableMonitors.value.length === 1)
32+
33+
onBeforeMount(async () => {
34+
availableMonitors.value = await getAvailableMonitors()
35+
})
2536

2637
watch(() => modelStore.currentModel, handleLoad, { deep: true, immediate: true })
2738

@@ -91,8 +102,14 @@ export function useModel() {
91102
live2d.setParameterValue(id, pressed ? max : min)
92103
}
93104

94-
async function handleMouseMove() {
95-
const monitor = await getCursorMonitor()
105+
async function _getCursorMonitor(mousePosition: MouseMoveValue) {
106+
return isOnlySingleMonitor.value
107+
? { ...availableMonitors.value[0], cursorPosition: mousePosition }
108+
: await getCursorMonitor()
109+
}
110+
111+
async function handleMouseMove(mousePosition: MouseMoveValue) {
112+
const monitor = await _getCursorMonitor(mousePosition)
96113

97114
if (!monitor) return
98115

src/pages/main/index.vue

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
<script setup lang="ts">
2+
import type { MouseMoveValue } from '@/composables/useDevice'
3+
24
import { convertFileSrc, invoke } from '@tauri-apps/api/core'
35
import { Menu } from '@tauri-apps/api/menu'
46
import { getCurrentWebviewWindow } from '@tauri-apps/api/webviewWindow'
57
import { exists } from '@tauri-apps/plugin-fs'
6-
import { useDebounceFn, useEventListener } from '@vueuse/core'
8+
import { useDebounceFn, useEventListener, useRafFn } from '@vueuse/core'
9+
import { isEqual } from 'es-toolkit'
710
import { onMounted, onUnmounted, ref, watch } from 'vue'
811
912
import { useDevice } from '@/composables/useDevice'
@@ -44,7 +47,14 @@ useEventListener('resize', () => {
4447
4548
watch(pressedMouses, handleMouseDown)
4649
47-
watch(mousePosition, handleMouseMove)
50+
useRafFn((() => {
51+
const cached: MouseMoveValue = { x: 0, y: 0 }
52+
return () => {
53+
if (isEqual(cached, mousePosition)) return
54+
Object.assign(cached, mousePosition)
55+
handleMouseMove(mousePosition)
56+
}
57+
})())
4858
4959
watch(pressedLeftKeys, (keys) => {
5060
handleKeyDown('left', keys.length > 0)

0 commit comments

Comments
 (0)