From 5bf4d3794983c8daeab8f2b7df420fc154709266 Mon Sep 17 00:00:00 2001 From: psychedelicious <4822129+psychedelicious@users.noreply.github.com> Date: Tue, 30 Apr 2024 09:49:01 +1000 Subject: [PATCH] perf(ui): reduce control image processing to when it is needed Only should reprocess if the processor settings or the image has changed. --- .../listeners/controlNetAutoProcess.ts | 6 ++++++ .../controlAdapters/store/controlAdaptersSlice.ts | 15 ++++++++------- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/controlNetAutoProcess.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/controlNetAutoProcess.ts index e52df30681..14af0246a2 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/controlNetAutoProcess.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/controlNetAutoProcess.ts @@ -12,6 +12,7 @@ import { selectControlAdapterById, } from 'features/controlAdapters/store/controlAdaptersSlice'; import { isControlNetOrT2IAdapter } from 'features/controlAdapters/store/types'; +import { isEqual } from 'lodash-es'; type AnyControlAdapterParamChangeAction = | ReturnType @@ -52,6 +53,11 @@ const predicate: AnyListenerPredicate = (action, state, prevState) => return false; } + if (prevCA.controlImage === ca.controlImage && isEqual(prevCA.processorNode, ca.processorNode)) { + // Don't re-process if the processor hasn't changed + return false; + } + const isProcessorSelected = processorType !== 'none'; const hasControlImage = Boolean(controlImage); diff --git a/invokeai/frontend/web/src/features/controlAdapters/store/controlAdaptersSlice.ts b/invokeai/frontend/web/src/features/controlAdapters/store/controlAdaptersSlice.ts index a5d6a185db..0c1ac20200 100644 --- a/invokeai/frontend/web/src/features/controlAdapters/store/controlAdaptersSlice.ts +++ b/invokeai/frontend/web/src/features/controlAdapters/store/controlAdaptersSlice.ts @@ -248,22 +248,23 @@ export const controlAdaptersSlice = createSlice({ return; } - const update: Update = { - id, - changes: { model, shouldAutoConfig: true }, - }; - - update.changes.processedControlImage = null; - if (modelConfig.type === 'ip_adapter') { // should never happen... return; } + // We always update the model + const update: Update = { id, changes: { model } }; + + // Build the default processor for this model const processor = buildControlAdapterProcessor(modelConfig); if (processor.processorType !== cn.processorNode.type) { + // If the processor type has changed, update the processor node + update.changes.shouldAutoConfig = true; + update.changes.processedControlImage = null; update.changes.processorType = processor.processorType; update.changes.processorNode = processor.processorNode; + if (cn.controlImageDimensions) { const minDim = Math.min(cn.controlImageDimensions.width, cn.controlImageDimensions.height); if ('detect_resolution' in update.changes.processorNode) {