checkpoint improved framerate

This commit is contained in:
nofunstudio
2025-02-02 18:17:59 -07:00
parent c2876f5a6b
commit b20d5d91f8
3 changed files with 11 additions and 68 deletions
Binary file not shown.
+6 -41
View File
@@ -137,22 +137,13 @@ class IframeView:
},
"hidden": {
"unique_id": "UNIQUE_ID",
"color": "TEXTURE",
"canny": "TEXTURE",
"depth": "TEXTURE",
"normal": "TEXTURE",
"animationFrames": "TEXTURE_SEQUENCE",
},
}
RETURN_TYPES = (
"IMAGE", "IMAGE", "IMAGE", "IMAGE", # base outputs
"IMAGE", "IMAGE", "IMAGE", "IMAGE", # animation outputs (one per channel)
)
RETURN_NAMES = (
"color", "canny", "depth", "normal",
"animation_color", "animation_canny", "animation_depth", "animation_normal",
)
# Only return animation textures now.
RETURN_TYPES = ("IMAGE", "IMAGE", "IMAGE", "IMAGE")
RETURN_NAMES = ("animation_color", "animation_canny", "animation_depth", "animation_normal")
FUNCTION = "process_iframe"
CATEGORY = "lth"
@@ -164,32 +155,19 @@ class IframeView:
scene_state,
frame_count,
unique_id,
color=None,
canny=None,
depth=None,
normal=None,
animationFrames=None,
):
start_time = time.time()
print("[process_iframe] Starting asynchronous processing at", start_time)
print("frame_count:", frame_count)
unique_id = str(unique_id)
# Process base textures first.
color_tensor = process_texture_data(color)
canny_tensor = process_texture_data(canny)
depth_tensor = process_texture_data(depth)
normal_tensor = process_texture_data(normal)
# Use provided hidden animation frames if available; otherwise, use fallback.
if animationFrames is not None and len(animationFrames) >= frame_count:
print("[process_iframe] Using provided animationFrames from hidden data.")
else:
print("[process_iframe] Animation frames not provided or incomplete; using fallback.")
animationFrames = await wait_for_capture_completion(unique_id, frame_count)
# Process each frame's texture into a tensor.
# Process each frame's texture into a tensor for animation outputs.
color_frames = [
process_texture_data(frame["textures"]["color"])
for frame in animationFrames
@@ -211,22 +189,17 @@ class IframeView:
if "textures" in frame and "normal" in frame["textures"]
]
# Convert the processed frames into batched tensors.
animation_color = torch.stack(color_frames, dim=0) if color_frames else None
animation_canny = torch.stack(canny_frames, dim=0) if canny_frames else None
animation_depth = torch.stack(depth_frames, dim=0) if depth_frames else None
animation_normal = torch.stack(normal_frames, dim=0) if normal_frames else None
# Clear the local reference to the heavy animationFrames data.
# This lets garbage-collection release the base64 strings from memory.
# Clear the heavy animationFrames data.
animationFrames = None
elapsed = time.time() - start_time
print(f"[process_iframe] Asynchronous processing completed in {elapsed:.4f} seconds.")
return (
color_tensor, canny_tensor, depth_tensor, normal_tensor,
animation_color, animation_canny, animation_depth, animation_normal,
)
return (animation_color, animation_canny, animation_depth, animation_normal)
def process_iframe(
self,
@@ -236,10 +209,6 @@ class IframeView:
scene_state,
frame_count,
unique_id,
color=None,
canny=None,
depth=None,
normal=None,
animationFrames=None,
):
return asyncio.run(
@@ -250,10 +219,6 @@ class IframeView:
scene_state,
frame_count,
unique_id,
color,
canny,
depth,
normal,
animationFrames,
)
)
+5 -27
View File
@@ -130,16 +130,6 @@ async function widgetIframe(node, nodeData, inputData, app) {
}
}
window.addEventListener("message", (event) => {
if (event.data && event.data.type === "TEXTURE_OUTPUT") {
console.log(
"[iframe_view] Received TEXTURE_OUTPUT message:",
event.data.data
);
handleTextureOutput(event.data.data);
}
});
// Updated handleTextureOutput: Capture frames until target is reached, then aggregate them.
function handleTextureOutput(data) {
if (node.isCaptureComplete) return;
@@ -246,10 +236,11 @@ async function widgetIframe(node, nodeData, inputData, app) {
sendParamsToIframe();
};
// Override the default setHiddenWidgetValue to also update our global TEXTURE_STORE.
// Modified setHiddenWidgetValue to only handle "unique_id" and "animationFrames"
node.setHiddenWidgetValue = function (name, value) {
if (name !== "unique_id" && name !== "animationFrames") return;
console.log(
"[setHiddenWidgetValue] Setting texture data for",
"[setHiddenWidgetValue] Setting hidden widget for",
name,
"at",
Date.now()
@@ -259,7 +250,6 @@ async function widgetIframe(node, nodeData, inputData, app) {
widgetEntry.value = value;
console.log(`[setHiddenWidgetValue] Updated widget '${name}' to:`, value);
} else {
// Create the widget if it does not exist.
widgetEntry = { name, value, isHidden: true };
this.widgets.push(widgetEntry);
console.log(
@@ -294,25 +284,13 @@ async function widgetIframe(node, nodeData, inputData, app) {
console.log("[cleanup] Cleaned up resources for node:", node.unique_id);
};
// Updated onSerialize: Strip out the heavy "data" field to avoid localStorage quota problems.
// Updated onSerialize: Only serialize the animationFrames hidden widget.
node.onSerialize = (nodeData) => {
// Always ensure a hidden data object exists
nodeData.hidden = nodeData.hidden || {};
// Serialize the basic texture keys (keep any properties like base64 data)
const textureKeys = ["color", "canny", "depth", "normal"];
textureKeys.forEach((key) => {
const widgetEntry = node.widgets.find((w) => w.name === key);
if (widgetEntry && widgetEntry.value) {
nodeData.hidden[key] = widgetEntry.value;
}
});
// Serialize the animation frames in full.
const animWidget = node.widgets.find((w) => w.name === "animationFrames");
nodeData.hidden["animationFrames"] =
animWidget && animWidget.value ? animWidget.value : [];
console.log("[onSerialize] Serialized animation frames:", nodeData.hidden);
console.log("[onSerialize] Serialized hidden data:", nodeData.hidden);
};
// Update triggerCapture to reset the frame buffer state and cache the dynamic frame count.