TileSplit (Dynamic)
The tile machine behind SimpleTiles' famous upscale workflow
- image
- IMAGE
- TILE_CALC
TileSplit (Dynamic) is the node the SimpleTiles pack is actually known for. The whole pack is five tiny Python files, but this one is the tiling backbone of the "Infinite Enhance" Magnific-style upscale workflow that blew up on r/StableDiffusion in early 2024 - the author, u/Kinfolk0117, built the nodes that made it possible, and the person who published that workflow credited him by name.
Why do you need a node like this at all? When you generate or upscale something huge - 4K, or a 3000×2000 image - you can't just run the sampler on the whole thing. It eats VRAM, and IP-Adapter flat-out requires square conditioning images. The trick is tiled inference: split the image into overlapping tiles, run your sampler (plus ControlNet Tile or IP-Adapter) on each tile, then stitch them back. That's what Ultimate SD Upscale does at the "fancy" end, with sampling-time edge blending. SimpleTiles is deliberately dumber: it just splits and merges, and leaves the sampling to whatever nodes you wire between them. That's the point - it's the flexible skeleton, not the opinionated upscaler.
How it works
You give it an image, a tile size, an overlap, and it walks a grid across the image. Each step advances by tile size − overlap, so neighboring tiles share an overlap strip that the merge later feathers together. Two details make it actually work on arbitrary images, where the legacy TileSplit fails:
- The last row and column are clamped to the image edge, so you don't silently drop a partial tile on the right or bottom.
- Tiles are ordered by distance from the image center, center last. The merge processes in the same order, so the center tile lands on top and ends up the most refined. That's deliberate - your eye goes to the middle.
It also outputs a TILE_CALC object carrying the overlap, image size, and offset. That's the "dynamic" trick: pass that one object to TileMerge (Dynamic) and the merge knows the final dimensions without you doing any math.
The inputs that matter
There are only four, and they're all you'll set:
- tile_width / tile_height (default 512): the size of each tile. Your sampler's native resolution is the natural number.
- overlap (default 128): how many pixels tiles share. More overlap = smoother seams, more wasted work. Start at 128 for 512 tiles.
- offset (default 0): shifts the first row and column of tiles by a few pixels. Useful to avoid a seam running straight down the middle of the image. A small offset - say 64 - hides it.
Outputs and where they go
- IMAGE: the tile stack. Wire it into a KSampler (or an IP-Adapter + ControlNet Tile setup) and then into TileMerge (Dynamic).
- TILE_CALC: wire this straight from the split output into the merge input. Don't lose it - the merge infers the final size from it.
Installing it
Install once, use all five nodes. Via ComfyUI Manager: search for SimpleTiles. Or the manual way:
cd ComfyUI/custom_nodes
git clone https://github.com/kinfolk0117/ComfyUI_SimpleTiles
Then restart ComfyUI. There's no requirements.txt and no model downloads - it's pure PyTorch, which you already have. One search gotcha: because the author built this for tiled IP-Adapter, DynamicTileSplit is categorized under ipadapter in the node menu, not utils. If you can't find it, search the menu by name.
Common issues
- Don't expect updates. The pack has been in maintenance-free mode since early 2024 and it shows its LCM-era age. It's stable because it's simple, but nobody's actively developing it. The author's own advice: if you want the whole tiled-upscale experience with fancy blending, use ComfyUI TiledDiffusion or Ultimate SD Upscale instead. Use this pack when you want to build the loop yourself.
- Don't resize or rebatch the tiles between split and merge. The merge measures the tile size from the tensor it receives and recomputes tile positions, so if the tile dimensions changed, everything lands in the wrong place.
- Watch the offset. It has to match between split and merge (it travels inside the
TILE_CALC, so it will - as long as you don't hand-edit it).
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| tile_width | INT | 5121–10000 | — |
| tile_height | INT | 5121–10000 | — |
| overlap | INT | 1281–10000 | — |
| offset | INT | 00–10000 | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |
| TILE_CALC | TILE_CALC | — |