Comparing SnapRef v1b with Ref Adapter v2 and Role-Ref-KV on M1 Max Under Identical Conditions
Contents

Right before publishing my previous article comparing Anima Ref Adapter v2 and Role-Ref-KV, another adapter serving the same purpose was released.
It is SnapRef, designed to maintain a character’s features across different compositions and scenes from a single reference image.
The comparison table in its README reports numbers showing it is faster than Ref Adapter v2 and Role-Ref-KV, and closer to the ground truth image than v2.
However, those numbers were measured on an A100.
Numbers alone do not tell us what happens when tested across the same 8 conditions as before, or whether the features unique to SnapRef’s README function identically under Mac MPS.
Therefore, using the exact same reference images, prompts, and seeds as the previous article, I tested v1b using ComfyUI on an M1 Max 64GB setup.
Overview of SnapRef
| Item | Details |
|---|---|
| Author | 0ppxnhximxr on Hugging Face, ArcAnima on GitHub |
| Release Date | October 29, 2026 for both v1a and v1b |
| Components | Two nodes (SnapRef and SnapRef (Advanced)) plus LoRA-format weights |
| Training | 58,300 images generated with Anima (scenes3x4), 10,000 steps, Anima base v1.0 |
| License | Apache-2.0 for nodes, CircleStone Labs Non-Commercial License v1.2 for weights |
| Links | Hugging Face (v1b), Hugging Face (v1a), GitHub |
The underlying mechanism belongs to the same family as Ref Adapter v2 and Role-Ref-KV.
The reference image passes through the model once via a dedicated path, caching the key/value representations from the attention mechanism across each block, which are then read during each step of generation.
Since it wraps the model in ComfyUI, standard samplers can be used directly.
The differences between v1a and v1b are summarized below.
| Item | v1a | v1b |
|---|---|---|
| Rank (Reference / Generation) | 128 / 64 | 256 / 128 |
| Size (bf16) | 381,822,008 bytes | 910,324,208 bytes |
| Size (FP8) | 194,652,728 bytes | 460,246,968 bytes |
| Time per image on A100 (README) | 8.9 s | 9.9 s |
| DINOv2 similarity to ground truth (README) | 0.722 | 0.720 |
| CLIP similarity to prompt (README) | 0.249 | 0.256 |
The README describes v1b as having “double the rank” and recommends starting with v1a if undecided.
Examining the weight keys reveals that rank is not the only difference.
LoRA modules number 336 in v1a versus 392 in v1b, with v1b also applying to the mlp layers on the generation side.
The comparison table in the README also lists values for other adapters.
| Item | v1b | v1a | Ref Adapter v2 | Role-Ref-KV | Without Reference |
|---|---|---|---|---|---|
| Time per image on A100 | 9.9 s | 8.9 s | 14.4 s | 12.5 s | 7.7 s |
| DINOv2 similarity to ground truth | 0.720 | 0.722 | 0.675 | — | 0.493 |
The ground truth image is an average over 52 cases where the same character adopts a specified pose in a separate image.
Looking into the distributed scores_v1a_v1b.json, DINOv2 similarity directly against the reference image itself measures 0.552 for v2, 0.515 for v1a, and 0.510 for v1b, reversing the order.
The ranking flips depending on which metric is examined.
Recommended settings from the README:
| Item | Setting |
|---|---|
| Base Model | Anima base v1.0 |
| Sampler | euler or er_sde, simple, 28–30 steps |
cfg | 4.5 |
| Prompt | Quality tags + 1girl + solo + scene. Hair, clothes, and art style come from reference, so omit them |
| Resolution | Unspecified (workflow uses 832×1216) |
Test Environment
| Item | Details |
|---|---|
| Machine | MacBook Pro M1 Max 64GB (MPS) |
| UI | ComfyUI v0.33.3 |
| SnapRef | Commit 8e78def nodes and weights from Hugging Face. sha256 matches distributed SHA256SUMS |
| Resolution | 896×1152 (same as previous test). Variations noted in individual sections |
| Sampler | euler / simple |
| Seeds | 20261027 (added 20261028 and 20261029 for seed comparisons; 20261030 and 20261031 for speed tests) |
| Reference Images | Identical to previous article: Ref Adapter v2 sample ref_girl.jpg and Kana-chan full-body standing illustration |
| Comparison Baseline | Ref Adapter v2 and Role-Ref-KV. Images and numbers carried over from previous article, except speed tests re-run on the same day |
ref_guidance_on does not run out of the box on MPS.
It halted with Cannot convert a MPS Tensor to float64 dtype, so just as with Ref Adapter previously, I changed two lines of APG correction from .double() to .float().
The remainder of the node code was left intact, except for a temporary one-off test in the black image section.
The tested models covered the same 8 conditions as before, matching the recommended 30 steps and cfg 4.5 on Base.
| Label | Model | Steps / cfg |
|---|---|---|
| Base | anima-base-v1.0 | 30 / 4.5 |
| Aesthetic v1.1 | anima-aesthetic-v1.1 | 30 / 4.5 |
| 2.9B (remapped) | Anima-2.9B-preview-v1 | 30 / 4.5 |
| 2.9B (unmapped) | Anima-2.9B-preview-v1 | 30 / 4.5 |
| Turbo v1.1 | anima-turbo-v1.1 | 8 / 1.0 |
| Turbo v1.0 | anima-turbo-v1.0 | 8 / 1.0 |
| Base + Turbo LoRA | anima-base-v1.0 + anima-turbo-lora-v0.1 (1.0) | 8 / 1.0 |
| 2.9B unofficial Turbo | anima29b-p1-turbo1.1 | 8 / 1.0 |
The 2.9B remapping reindexes key numbers to skip the 12 interleaved blocks out of 40.
Since the node only applies LoRA to modules with existing keys, zero-padding like that required for Role-Ref-KV was unnecessary.
By default, SnapRef reads the reference only on the positive prompt side.
At cfg 1.0 for Turbo, model evaluation occurs once per step, whereas at cfg 4.5 it occurs twice.
Running with Official Settings
Tested on Base using the README prompt, workflow negative, 832×1216 resolution, 28 steps, and cfg 4.5.
| Reference | Time | Result |
|---|---|---|
| Kana-chan | 289.9 s | Sitting on a bench with crossed legs. Night street. Cowlick, blue scrunchie side ponytail, white shirt, red tie, black tights, and loafers preserved |
| ref_girl | 276.7 s | Sitting on a bench with crossed legs. Blonde hair with red streaks, pink eyes, black and white outfit |


Prompt
masterpiece, best quality, score_7, safe, 1girl, solo, full body, sitting, crossed legs, bench, street, night
Negative:
worst quality, low quality, score_1, score_2, score_3, artist name, blurry, jpeg artifacts, chromatic aberration
I also ran the cake cafe scene with ref_girl under identical conditions to the previous article.
The output showed her bringing a fork to her mouth on a red sofa, preserving hair color, streaks, and clothing, taking 302.6 seconds.



Results Across Base, Aesthetic v1.1, and 2.9B
Unless specified otherwise, subsequent sections use Kana-chan’s standing reference and the negative prompt from the previous article.
| Condition | Time (Running / Cake) | Running | Cake |
|---|---|---|---|
| Base | 312.0 s / 316.1 s | Running facing away. Castle and grass field | Bringing fork to mouth on red sofa. Matches reference |
| Aesthetic v1.1 | 316.0 s / 315.9 s | Facing away with nearly identical composition to Base | Identical scene. Matches reference |
| 2.9B (remapped) | 441.4 s / 445.6 s | Running facing mostly forward. Matches reference | Nearly identical composition to Base |
| 2.9B (unmapped) | 435.1 s / 434.3 s | Retains standing posture from reference. Blurred background with white haze around figure | Retains standing posture. Cup and cake float semi-transparently |








For the cake scene, all three functional conditions produced the cowlick, side ponytail on the right, white shirt, and red tie faithful to the reference.
The slight orange tint in the hair observed with Role-Ref-KV in the previous cake test did not appear here.
2.9B failed to function without remapping.
Rather than collapsing into a grid pattern like v2 did, the figure remained sharp in the original standing pose while the prompt’s scene was scarcely reflected.
In the running scene, Base and Aesthetic faced backward.
Since the prompt lacked directional constraints, this was not inherently incorrect, but since v2 and Role-Ref-KV previously faced forward with the same seed, I investigated the orientation further in a later section.
Prompts
Running Scene:
masterpiece, best quality, score_7, newest, highres, absurdres, safe, 1girl, solo, full body, running, wind, hair blowing, dynamic pose, fantasy landscape, castle in background, sunset sky, dramatic clouds, grass field
Cake Scene:
masterpiece, best quality, score_7, newest, highres, absurdres, safe, 1girl, solo, upper body, sitting, eating, cake, cafe, indoors
Negative:
worst quality, low quality, score_1, score_2, score_3, blurry, jpeg artifacts, chromatic aberration, bad anatomy, bad hands, extra arms, extra fingers, missing fingers, text, watermark, signature, artist name, multiple views, split screen, comic, 2koma, 4koma
Results on Turbo Models
| Condition | Time (Running / Cake) | Running | Cake |
|---|---|---|---|
| Turbo v1.1 | 64.3 s / 62.4 s | Running facing forward, right hand to head. Matches reference | Red sofa by window. Arm covers most of tie |
| Turbo v1.0 | 64.3 s / 61.3 s | Running facing forward, arms wide. Matches reference | Hand to cheek. Most of tie hidden |
| Base + Turbo LoRA | 63.3 s / 62.3 s | Running facing forward, clenching right hand. Matches reference | Composition close to Turbo v1.1 |
| 2.9B unofficial Turbo | 88.4 s / 87.4 s | Nearly identical composition to Turbo v1.1 | Nearly identical composition to Turbo v1.1 |








All four Turbo conditions faced forward in the running scene, avoiding the backward orientation seen on Base.
While the README targets Anima base v1.0, SnapRef operated seamlessly across full Turbo models, Turbo LoRA, and remapped 2.9B alike.
The red tie being occluded by an arm in the cake scene was an artifact of composition and remained visible under settings explored in the next section.
Testing 4-Panel Collapse with ref_guidance 4.5
In earlier testing, the pilot adapter split into 4-panel comic layouts when run at cfg 1.0 and ref_guidance 4.5 on Turbo.
Ref Adapter v2 avoided 4-panel splits but suffered desaturated colors.
Since SnapRef provides ref_guidance_on, I generated the cake scene under identical settings.
| Condition | Time | Result |
|---|---|---|
| Turbo v1.1 | 98.5 s | Single image. Tie visible. Colors not muted |
| Turbo v1.0 | 96.5 s | Single image. Tie visible. Colors not muted |
| Base + Turbo LoRA | 96.5 s | Single image. Shirt chest slightly blown out |
| 2.9B unofficial Turbo | 138.8 s | Single image. Shirt chest slightly blown out |




None of the four conditions split into multiple panels.
Evaluating the model twice per step increased runtime by roughly 1.5x, though with a single seed it is difficult to separate deliberate effect from random variance.
I also tested ref_guidance_on on Base.
The README notes that values of 6–8 increase reference adherence, taking ~1.4x runtime, and that ref_end 0.6 provides faster execution with nearly identical visual results.
| Condition | Time | Result |
|---|---|---|
| Off (Default) | 316.1 s | Tie visible. Light brown hair |
| ref_guidance 4.5 | 480.8 s | Composition shifts slightly. Colors not muted |
| ref_guidance 7 | 480.7 s | Colors not muted. Tie visible |
| ref_guidance 7, ref_end 0.6 | 432.2 s | Nearly identical image to ref_guidance 7 |
| Turbo v1.1, ref_guidance 2 (Reference) | 96.0 s | Single image. Tie visible |




Measured times on M1 Max were roughly 1.5x of baseline with guidance disabled, and just under 1.4x even with ref_end 0.6.
The claim that ref_end 0.6 yields nearly identical images held true in practice.
Testing Lying and Overhead Compositions
| Condition | Time | Result |
|---|---|---|
| Turbo v1.1 | 60.5 s | Lying on back in grassy field with white flowers, knees raised. Head at top of frame. Loafers visible |
| Base | 316.0 s | Lying on back in grassy field with yellow and white flowers, knees raised. Head at top of frame. Loafers visible |


From a single frontal standing reference, the character features were preserved cleanly across both supine and overhead perspective shifts.
Prompt
masterpiece, best quality, score_7, newest, highres, absurdres, safe, 1girl, solo, full body, lying on back, on grass, from above, looking at viewer, flowers, daytime
Evaluating Seed Variation in the Running Scene
Adding seeds 20261028 and 20261029, I tested across the 4 Turbo setups alongside Base and remapped 2.9B.
| Condition | s20261027 | s20261028 | s20261029 |
|---|---|---|---|
| Turbo v1.1 | Forward | Forward | Forward |
| Turbo v1.0 | Forward | Forward | Forward |
| Base + Turbo LoRA | Forward | Forward | Forward |
| 2.9B unofficial Turbo | Forward | Forward | Forward |
| Base | Facing away | Facing away, smaller figure | Facing away |
| 2.9B (remapped) | Forward | Facing away, smaller figure | Forward |


















Across all 18 generations, visible hairstyle and clothing traits strictly followed the reference.
In the 14 forward-facing images, the side ponytail, white shirt, red tie, and black tights were consistently rendered. The 4 backward-facing outputs also retained the scrunchie, ponytail, and tights.
Unlike Role-Ref-KV previously, there were no seeds where the ponytail or tie disappeared.
Conversely, Base faced away across all 3 seeds, whereas v2 and Role-Ref-KV had both faced forward under these exact seeds.
Isolating Why Base Runs Facing Away
To determine whether facing away was an idiosyncrasy of v1b or Base itself, additional seeds and conditions were tested.
| Condition | s20261027 | s20261028 | s20261029 | s20261030 | s20261031 |
|---|---|---|---|---|---|
| v1b | Facing away | Facing away | Facing away | Facing away | Facing away |
| v1a | Forward | Facing away | Forward | Forward | — |
| v1b FP8 | Facing away | — | — | — | — |
| Without reference | — | — | — | Facing away | Facing away |
| Ref Adapter v2 | Forward | Forward | Forward | Forward | — |
| Role-Ref-KV | Forward | Forward | Forward | Forward | — |






Base without any reference faced backward on both seeds, indicating that facing backward under this prompt is an inherent bias of Base itself.
Unlike v2 or Role-Ref-KV, which are strongly pulled toward the frontal composition of the reference illustration, v1b did not overwrite the model’s compositional bias.
This aligns with the README’s description that SnapRef “extracts appearance rather than copying composition,” though the sample size remains limited.
Increasing reference strength did not alter orientation, whereas adding looking at viewer to the prompt immediately restored a frontal view.
| Condition (s20261027) | Time | Result |
|---|---|---|
| strength 1 | 293.9 s | Facing away |
| ref_guidance 7 | 481.6 s | Facing away |
looking at viewer added | 316.0 s | Forward |



Comparing v1a, v1b, and FP8
| Condition | v1b | v1a | v1b FP8 |
|---|---|---|---|
| Turbo v1.1 Running s20261027 | Matches reference | Matches reference | Nearly identical to v1b |
| Turbo v1.1 Running s20261028 | Matches reference | Short sleeves, black tights become thigh-highs | — |
| Turbo v1.1 Running s20261029 | Matches reference | One leg appears with knee-high sock | — |
| Turbo v1.1 Cake | Tie hidden by arm | Tie visible. Chest pocket added | Nearly identical to v1b |
| Base Running s20261027 | Facing away | Forward, matches reference | Facing away, nearly identical to v1b |
| Base Cake | Matches reference | Matches reference. Two cups appear | Nearly identical to v1b |












Across the 3 seeds of the Turbo v1.1 running scene, v1a exhibited clothing drift twice, compared to 0 for v1b.
While README reported similar ground truth similarity metrics, in this reference and seed set, v1b retained clothing details more faithfully.
FP8 halved file size and produced “virtually identical images” as claimed in the README.
Pixel-level absolute difference against bf16 averaged 1.8–3.0 on a 0–255 scale.
The composition remained unchanged, differing only subtly in fine detail.
Generation speed was 56.5–58.6 s (Turbo) and around 312 s (Base), practically identical to bf16.
Since ComfyUI was launched with --bf16-unet, the exact precision used internally during FP8 computation was not examined.
Effects of the strength Parameter
strength in the Advanced node operates on a logarithmic scale, altering key weights from the reference.
The tooltip indicates that +1 multiplies influence by ~2.7x, while -1 divides by ~2.7x.
The README suggests values between 1 and 2 when seeking to enhance fine details (accessories, sleeves, decorations).
| strength | Turbo v1.1 Running | Turbo v1.1 Cake | Base Cake |
|---|---|---|---|
| -1 | Smiling, high stride. Tie and tights preserved | Hand to cheek. Scrunchie becomes darker | Hair shifts toward orange |
| 0 (Default) | Hand to head. Large running motion | Fork to mouth. Tie obscured by arm | Light brown hair |
| 1 | Arms lowered, stiffer expression. Smaller motion | Tie starts to become visible | Saturation slightly reduced |
| 2 | Closer to standing pose than 1 | Straight posture facing front. Full tie visible | Saturation drops, grayish tone. Cowlick clipped at top. Buildings in background |












As strength increased, the pose converged toward the standing reference, dampening running dynamics and expressive variety.
At 2 on Base, colors became washed out.
Because Kana-chan’s illustration lacks intricate adornments, whether fine details actually increase could not be established with this reference.
Adjusting strength did not increase runtime.
Turbo v1.1 cake took 56.5 s, running took 45.4–45.5 s, and Base cake took 301.8–302.0 s, showing no penalty compared to 0.
Although the README states that “strength and weighting no longer slow things down,” the tooltip still bears an outdated “~1.3x slower” note.
Even though MPS falls back to a masked path without fast fused kernels, execution speed was unaffected.
Note that the simpler SnapRef node uses a different scale for strength: 1 corresponds to training default, 0 is off, and 2 is 2x, without logarithmic scaling.
A value of 1.0 in SnapRef produced an identical image to 0 in Advanced.
The README’s recommendation to “try 1 to 2” applies to the Advanced node; a setting of 2 in simple SnapRef corresponds to roughly 0.7 in Advanced.
fidelity Behaves as a Binary Toggle on Mac
fidelity lowers reference adherence in favor of prompt compliance. Inspecting the node’s code reveals distinct execution between CUDA and non-CUDA environments.
On CUDA, the negative prompt side attends to the reference weighted by 1 - fidelity, relying on optimized kernels.
On non-CUDA systems, any value below 1 acts as a fallback where the negative side fully attends to the reference.
Testing on the Base cake scene confirmed this behavior:
| Condition | Time | Result |
|---|---|---|
| fidelity 1.0 (Default) | 316.1 s | Light brown hair |
| fidelity 0.5 | 354.5 s | Darker orange hair. Scrunchie becomes purplish |
| fidelity 0.0 | 346.5 s | Pixel-for-pixel identical to fidelity 0.5 |
ref_in_uncond On | 347.4 s | Pixel-for-pixel identical to fidelity 0.5 |
| Turbo v1.1, fidelity 0.5 | 60.6 s | Pixel-for-pixel identical to fidelity 1.0 |


In line with the implementation, setting 0.5 or 0.0 on Mac produced the exact same output as enabling ref_in_uncond, with no intermediate gradients.
Turbo at cfg 1 does not compute the unconditional side, so fidelity settings produced no effect.
Changing Art Style with mode: char
mode: cs extracts both character and art style from the reference by default, while char aims to extract character only.
The README highlights pairing char with artist tags.
Here, I tested general style tags rather than specific artists.
| Condition | cs | char |
|---|---|---|
| Base, no style tag | Identical to default | Hair sheen and lineart shift slightly |
Base, watercolor (medium) | Barely changes | Does not become watercolor; hair becomes bright orange, window frame yellow |
Base, 1990s (style), retro artstyle | Barely changes | Dark brown hair, thicker lines, retro anime aesthetic |
Turbo v1.1, watercolor (medium) | Barely changes | Does not become watercolor; subtle lighting highlights added |




Under cs, adding style tags barely altered the visual output.
Under char, stylistic tags took effect, though watercolor altered character hair color rather than producing a watercolor texture.
The “What’s next” section of the README notes plans to strengthen mode char in v2a.
Generating Two Characters from a Single Stitched Reference
Following the README’s guidance, I stitched two full-body character illustrations side by side into a single reference image, generating at 1216×832.
| Condition | Time | Left (Kana-chan) | Right (Blonde) |
|---|---|---|---|
| Turbo v1.1 s20261027 | 57.6 s | Tie turns into ribbon. Skirt becomes plaid | Matches reference |
| Turbo v1.1 s20261028 | 48.5 s | Tie turns into ribbon | Matches reference |
| Turbo v1.1 s20261029 | 48.5 s | Tie turns into ribbon | Matches reference |
| Base s20261027 | 314.1 s | Tie preserved. Skirt becomes plaid | Gains side ponytail |
| Base s20261028 | 303.0 s | Tie turns into ribbon | Gains side ponytail |





All 5 outputs successfully produced both characters without swapping horizontal placement or hair colors, preserving black tights and white socks.
However, Kana-chan’s necktie turned into a ribbon matching the right character in 4 of 5 outputs.
On Base, the right character also acquired Kana-chan’s side ponytail.
While the README mentions that “attributes not clearly discernible in the reference may bleed between characters,” attribute mixing occurred even for distinct elements like ties and skirts.
Prompt
masterpiece, best quality, score_7, newest, highres, absurdres, safe, 2girls, brown hair girl on the left, blonde girl on the right, standing side by side, full body, looking at viewer, park, day
Adjusting strength on Stitched References Produces Black Images
Attempting to curb attribute bleeding by raising strength to 2 unexpectedly produced completely black images.
Varying the seed, switching to Base, or setting strength to 1 or -1 yielded identical black results.
Conversely, the same reference image generated normally when strength was left at 0.
Isolating the trigger revealed that having two characters was irrelevant; the failure hinged strictly on the reference image resolution.
The node scales reference images to ~1MP or less in multiples of 16.
A 1664×1216 image downscales to 1184×864.
A single Kana-chan illustration padded to that same resolution also failed to render, whereas other aspect ratios succeeded.
| Reference Size | Output Size | Token Count (Ref + Out) | Multiple of 16? | strength >= 1 |
|---|---|---|---|---|
| 832×1216 | 896×1152 | 3,952 + 4,032 = 7,984 | Yes | Normal |
| 1216×832 | 896×1152 | 3,952 + 4,032 = 7,984 | Yes | Normal |
| 1024×1024 | 896×1152 | 4,096 + 4,032 = 8,128 | Yes | Normal |
| 832×640 | 896×1152 | 2,080 + 4,032 = 6,112 | Yes | Normal |
| 640×832 | 896×1152 | 2,080 + 4,032 = 6,112 | Yes | Normal |
| 832×1216 | 1216×832 | 3,952 + 3,952 = 7,904 | Yes | Normal |
| 1184×864 | 896×1152 | 3,996 + 4,032 = 8,028 | No | Black |
| 864×1184 | 896×1152 | 3,996 + 4,032 = 8,028 | No | Black |
| 1184×864 | 1216×832 | 3,996 + 3,952 = 7,948 | No | Black |
Each 16 pixels correspond to 1 token.
The _masked_attention path on MPS pads key counts to multiples of 16, setting the padded mask region to float("-inf").
At strength 0, this masked path is bypassed, preventing black images.
Changing that mask value from -inf to -1e4 and re-running with an 1184×864 reference at strength 2 (seed 20261027) resolved the black image issue.
Although top and bottom white padding bands appeared, the tie, ribbon, plain skirt, and plaid skirt rendered faithfully for both characters.
However, passing identically sized random tensors through PyTorch attention alone did not trigger NaN, so the exact underlying cause of the failure under -inf remains unisolated.
The code modification was reverted after testing.
To avoid this issue without editing node source code, simply resize the reference so that the total token count forms a multiple of 16.
Padding the two-character reference to 1216×832 allowed generation to proceed cleanly at both strength 1 and 2.
| Condition | Time | Left (Kana-chan) | Right (Blonde) |
|---|---|---|---|
| strength 0 | 56.5 s | Tie turns into ribbon. Skirt becomes plaid | Matches reference |
| strength 1 | 47.5 s | Tie preserved | Matches reference |
| strength 2 | 47.4 s | Thin tie | Gains side ponytail. Feet clipped white |
| strength 2, s20261028 | 44.4 s | Tie turns into ribbon | Gains side ponytail |




Preserving the tie succeeded in only one image at strength 1 and reverted at strength 2, indicating that adjusting strength is not a reliable safeguard against attribute bleeding.
The black image mention in the README refers to an fp16-related bug, which is distinct from this phenomenon.
Since CUDA takes an alternate fused execution path, this black image appears specific to environments like MPS where fused attention kernels are unavailable.
Adjusting strength away from 1 in the simple SnapRef node or modifying multi-reference weight routes through the same code path and may trigger identical failures depending on reference dimensions.
Using Multiple References for the Same Character
A node update on November 1 introduced support for up to 3 references for a single character.
The README highlights pairing a bust-up reference with a full-body reference.
I tested this using Kana-chan’s bust-up portrait alongside her full-body standing illustration.
The bust-up portrait features a blazer and ribbon, contrasting with the full-body’s white shirt and tie, making it straightforward to identify which reference influenced the output.


| Condition (Turbo v1.1) | Running | Time | Cake | Time |
|---|---|---|---|---|
| Bust-up only | Blazer and ribbon. Plaid skirt with bare legs and single sock, unreferenced | 53.5 s | Blazer and ribbon | 53.6 s |
Bust + Full (separate) | Blazer and ribbon. Plain skirt, black tights, loafers | 69.7 s | Blazer and ribbon | 69.7 s |
Bust + Full (stitch) | Blazer and ribbon. Plain skirt, black tights, loafers | 57.5 s | Blazer and ribbon | 57.6 s |
Bust weight 0.4 | White shirt and tie | 64.7 s | — | — |
Full-body weight 0.4 | — | — | Blazer and ribbon | 63.7 s |
| Full-body first, Bust second | — | — | Blazer and ribbon | 69.6 s |








Adding the full-body reference successfully completed the lower-body attire (plain skirt, black tights, loafers), which had hallucinated unreferenced clothes when using the bust-up image alone.
The approach advocated by the README functioned as advertised.
All configurations generated a single character without duplicating into two figures.
When combining two references with conflicting outfits, the blazer from the bust-up image took precedence across both scenes when weights were equal.
Reversing the slot order yielded identical dominance, requiring the bust-up image weight to be reduced to 0.4 before the full-body shirt and tie emerged.
Images occupying a larger relative proportion of the character’s facial area may exert stronger attention pull.
On Base, separate mode required 350.4 s, roughly 40 seconds longer than a single reference.
Combining with 3D Poses
In previous work, pairing Ref Adapter with LLLite required routing through CharRef-LLLite.
Because SnapRef maintains separate reference key/value caches without interleaving reference tokens into the generation-side sequence, stock nodes seemed likely to work.
I compared ComfyUI’s standard AnimaLLLiteApply against CharRef-LLLite’s ExperimentalAnimaLLLiteRefApply.
Pose input used the same 3dpose_example.png at 768×1152 with an LLLite strength of 1.0.
| Condition | s20261027 | s20261028 | s20261029 |
|---|---|---|---|
| Stock LLLite + SnapRef | Seated with one knee raised, hands on floor. Barefoot | Seated on white bench. Loafers visible | Seated on wooden bench. Loafers visible |
| CharRef-LLLite + SnapRef | Pixel-for-pixel identical to stock | Pixel-for-pixel identical to stock | Pixel-for-pixel identical to stock |






Stock nodes reproduced the target pose accurately, matching CharRef-LLLite pixel-for-pixel across all 3 seeds.
SnapRef eliminates the need for specialized adapter bridge nodes.
Generation time on Turbo was 45.3–45.4 s, noticeably faster than the 86.4 s required previously with v2.
Base (30 steps, cfg 4.5) also adhered strictly to the pose in 272.5 s, rendering loafers cleanly.
The missing shoes occurred only on Turbo seed 20261027, which had similarly lost shoes in the previous v2 evaluation.
Prompt
masterpiece, best quality, score_7, newest, highres, absurdres, safe, 1girl, solo, full body, sitting, looking at viewer, simple background
Testing Known Limitations from the README
The README highlights two specific limitations: scene prompts overriding attire (such as beach forcing swimwear) and outdoor full-body shots rendering white floors underfoot, which supposedly resolves by explicitly prompting ground textures.
| Condition | Time | Result |
|---|---|---|
beach Base | 313.1 s | Swimwear did not appear. Shirt changed to short sleeves. Sand is flat and white |
beach Base, strength 2 | 293.8 s | Restores long sleeves. Colors washed out |
beach Turbo v1.1 | 60.6 s | Swimwear did not appear. Remains long-sleeved. Detailed beach background |
beach Turbo v1.1, strength 2 | 48.5 s | Swimwear did not appear. Remains long-sleeved |
outdoors Base | 314.1 s | Coastal backdrop. Bright, flat ground underfoot |
outdoors, grass Base | 305.0 s | Round patch of grass underfoot against a white background |






Across 4 generations with a single seed, swimwear never appeared.
The shift from long to short sleeves on Base represented the extent of clothing override.
Adding grass created an isolated circular patch of lawn beneath the character rather than rendering an integrated terrain.
The README’s claim that prompting ground textures resolves floor artifacts did not hold true in this instance.
Evaluating simplification of minor details or brightening on dark-skinned references was omitted due to the lack of suitable reference assets.
Prompts
beach Scene:
masterpiece, best quality, score_7, newest, highres, absurdres, safe, 1girl, solo, full body, standing, beach, ocean, day
outdoors Scene:
masterpiece, best quality, score_7, newest, highres, absurdres, safe, 1girl, solo, full body, standing, looking at viewer, outdoors, day
Generation Speed Benchmarks
Measured generation times for 896×1152 images on M1 Max 64GB.
Tests were run consecutively on the same day in the running scene across rotating seeds.
| Condition | Turbo v1.1 (8 steps, cfg 1) | Base (30 steps, cfg 4.5) |
|---|---|---|
| Without reference | 38.4–42.4 s | 259.5–263.6 s |
| SnapRef v1b | 51.5–56.5 s | 307.9–312.1 s |
| SnapRef v1a | 50.5–55.6 s | 298.0 s |
| Ref Adapter v2 | 56.6–57.5 s (ref_guidance 1.0) | 475.4 s (ref_guidance 4.5) |
| Role-Ref-KV | 91.9–92.0 s (8 steps) | 297.9 s (28 steps) |
Additional benchmark figures:
| Condition | Time |
|---|---|
| SnapRef v1b, Base / Aesthetic (all seeds) | 293.9–316.1 s |
| SnapRef v1b, 2.9B (remapped) | 438.2–445.6 s |
| SnapRef v1b, Turbo setups (3 conditions) | 49.4–64.3 s |
| SnapRef v1b, 2.9B unofficial Turbo | 82.6–88.7 s |
| Turbo setups (3 conditions), ref_guidance 4.5 | 96.5–98.5 s |
| 2.9B unofficial Turbo, ref_guidance 4.5 | 138.8 s |
The reference overhead on Base was approximately 50 seconds, or ~1.2x of the unguided baseline.
This aligns closely with the ~1.3x overhead reported on A100 in the README (9.9 s vs. 7.7 s).
On Base, v1b required roughly two-thirds the time of v2, matching the ratio in the README (9.9 s vs. 14.4 s).
Because Role-Ref-KV operates at a recommended 28 steps, its total runtime was comparable to v1b.
Per-step execution averaged ~10.3 s for v1b and ~10.6 s for Role-Ref-KV, showing negligible difference.
While README benchmarks on A100 showed v1b at 9.9 s versus Role-Ref-KV at 12.5 s, that margin did not materialize on Mac.
On Turbo, however, because Role-Ref-KV evaluates twice per step even at cfg 1, v1b was roughly 1.7x faster.
Performance relative to v2 was virtually identical.
The difference between v1a and v1b on Turbo was around 1 second, within the margin of seed variation.
On Base, v1a clocked in at 298.0–308.3 s, running only ~1–5% faster than v1b.
Unexamined Scenarios
- The fp16 black image issue marked as resolved in the README (launching with
--bf16-unetbypasses reproduction conditions) - Combinations with Anzhc/sorryhyun Mod Guidance or Spectrum
- FP8 quantized Anima base
- Adjusting
ref_caption,use_batch,correction’srescale, orref_megapixels - General CUDA-specific behavior (including intermediate fidelity steps and black image constraints)
- Photorealistic, dark-skinned, or heavily accessorized reference images
- Peak VRAM footprint comparisons
Seed counts ranged between 1 and 5 per condition, focused on Kana-chan and ref_girl.
Phrases indicating that an issue “did not occur” are bound strictly to this evaluation scope.
Practical Recommendations
| Use Case | Recommended Option |
|---|---|
| Generating under recommended Base settings | SnapRef v1b. Faster than v2, retaining hairstyle and clothing across 3 seeds. Directional prompts should be added explicitly for active scenes |
| Fast generation on Turbo models | SnapRef v1b or Ref Adapter v2 (ref_guidance 1.0). Generation speed is virtually identical, running ~1.7x faster than Role-Ref-KV |
| Reducing disk footprint | SnapRef v1b FP8 (460MB). Visual composition is identical to bf16 |
| Deciding between v1a and v1b | In our tests, v1b maintained attire more reliably. Choose v1a if smaller file size is prioritized |
| Pairing with 3D poses | SnapRef + standard LLLite nodes. No specialized bridge nodes required |
| Combining bust-up and full-body references | SnapRef image_2. Lower-body attire accurately follows reference |
| Two characters | Feasible with SnapRef v1b, though neckwear and hairstyles may bleed. Ensure reference resolutions avoid black image token bounds on Mac when adjusting strength or weight |
| 2.9B models | SnapRef functions with simple key remapping. Zero-padding is unnecessary |
Reference Links
- snapref-v1b (Hugging Face)
- snapref-v1a (Hugging Face)
- SnapRef (GitHub)
- ComfyUI-Anima-Ref-Adapter (GitHub)
- Anima-Role-Ref-KV (Hugging Face)
- ComfyUI-Anima-CharRef-LLLite (GitHub)
- Anima_ControlNet-LLLite (Hugging Face)
- Anima (Hugging Face)
- Anima-2.9B (Hugging Face)
- anima29b-turbo-unofficial (Hugging Face)
- Comparing Anima Ref Adapter v2 and Role-Ref-KV
- Testing Base-Dedicated Anima Ref Adapter on Turbo, Aesthetic, and 2.9B