From 4a0a882de1db8b9dc652cba2c1945f6e74bdb8a8 Mon Sep 17 00:00:00 2001 From: Kuingsmile Date: Thu, 23 May 2024 16:43:48 +0800 Subject: [PATCH] :zap: Perf(custom): improve the performance of clipboard watching --- src/main/utils/clipboardPoll.ts | 46 ++++++++++++++++----------------- 1 file changed, 22 insertions(+), 24 deletions(-) diff --git a/src/main/utils/clipboardPoll.ts b/src/main/utils/clipboardPoll.ts index 4582ff60..aa38e990 100644 --- a/src/main/utils/clipboardPoll.ts +++ b/src/main/utils/clipboardPoll.ts @@ -1,51 +1,49 @@ -import { clipboard, nativeImage } from 'electron' +import { clipboard } from 'electron' import { EventEmitter } from 'events' +import crypto from 'crypto' +import logger from '../apis/core/picgo/logger' class ClipboardWatcher extends EventEmitter { - lastImage: Electron.NativeImage | null timer: NodeJS.Timeout | null + lastImageHash: string | null constructor () { super() - this.lastImage = null + this.lastImageHash = null this.timer = null } startListening (watchDelay = 500) { - this.stopListening() - - const image = clipboard.readImage() - if (!image.isEmpty()) { - const dataUrl = image.toDataURL() - this.lastImage = nativeImage.createFromDataURL(dataUrl) - } + this.stopListening(false) this.timer = setInterval(() => { const image = clipboard.readImage() - if (image.isEmpty()) { + if (image.isEmpty()) return + + const currentImageHash = this.getImageHash(image) + if (this.lastImageHash === null || this.lastImageHash === currentImageHash) { + this.lastImageHash = currentImageHash return } - const dataUrl = image.toDataURL() - const currentImage = nativeImage.createFromDataURL(dataUrl) - - if (this.lastImage) { - const lastDataUrl = this.lastImage.toDataURL() - if (lastDataUrl === dataUrl) { - return - } - } - - this.lastImage = currentImage - this.emit('change', currentImage) + this.lastImageHash = currentImageHash + this.emit('change') }, watchDelay) + logger.info('Start to watch clipboard') } - stopListening () { + stopListening (isLog = true) { if (this.timer) { clearInterval(this.timer) this.timer = null + this.lastImageHash = null } + isLog && logger.info('Stop to watch clipboard') + } + + getImageHash (image: Electron.NativeImage): string { + const buffer = image.toBitmap() + return crypto.createHash('md5').update(buffer).digest('hex') } }