Compositions & pre-comps
A composition is a canvas with a size, a frame rate, a duration and a background — and a stack of layers inside it. A project can hold several.
Creating one
The first composition is created on the dashboard, along with the project. You choose its size, frame rate and duration there, from a shared preset catalogue that the viewport header also uses — so the two can never disagree about what “1080p” means.
Further compositions are created and managed from the Project panel (Window → Project): create, open, rename, duplicate, delete.
There is deliberately no New Composition… item in the editor menus. One home per action is a design rule here.
Composition settings
Ctrl/⌘ + K.
| Field | Notes |
|---|---|
| Name | — |
| Width × Height | Any size; presets available |
| Frame rate | Also writes into the timeline controller, so the time domain stays consistent |
| Duration | Same |
| Background colour | What the composition renders on |
| Pasteboard colour | Under Environment — the surround outside the composition frame |
Pre-composing
Ctrl/⌘ + Shift + C wraps the current selection into a nested composition.
Use it to:
- treat a group of layers as one thing for transform, opacity or blend purposes,
- apply an effect to the group as a whole rather than to each layer,
- reuse a chunk of animation in several places,
- get a time axis you can remap independently.
Nested rendering is real
A pre-comp’s subtree renders to its own framebuffer and composites as one unit. That is what makes group opacity, group blend modes and group effects behave correctly over nested animation, instead of applying per-layer and looking wrong wherever layers overlap.
Time remapping
Keyframe the internal time of the nested content, independently of the parent composition’s time. That gives you:
- holds — freeze the nested animation on a frame,
- reverses — run it backwards,
- speed ramps — accelerate and decelerate the nested animation.
Toggle it from the Precomp section of the Settings panel.
Keyframes are written and read on the layer-local time axis. Time remap is precisely why that distinction exists — see the time-axis rule in Keyframes.
Composition instances
Insert composition A into composition B from the Insert menu → Composition instance. The same composition can be instanced more than once, and AE-style stacking rules apply.
An instance is a reference, not a copy: change the source composition and every instance follows.
The composition boundary
A placed composition is sealed. It renders through its own recursive snapshot pass, which means it resolves its own camera, depth of field, 3D sort, solo scope and frame size — not the host’s.
That boundary is what makes the following true:
- An instance renders at its own size, at the instance’s transform. A 1080 × 1920 comp placed in a 1920 × 1080 master used to arrive as a host-sized carrier with its content 420 px below the frame, so mixing aspect ratios threw content silently out of shot.
- A 3D layer two comps deep is projected through its own composition’s camera, not through whatever camera the outermost composition happened to own.
- Parenting is bounded by the composition. A layer cannot be parented across the boundary, and neither can a camera or a light.
Reference cycles are guarded, and two placements of one composition cannot collide on texture keys or matte source ids.
Collapse Transformations
AE’s sunburst switch. With it on, the placed composition’s layers are spliced into the host so they meet the host’s camera, depth sort and lights — and are deliberately not cropped to their own frame.
Off is the sealed behaviour described above. The two are genuinely different renderings, not a quality setting.
Continuous Rasterization
Vector content — text, SVG, and shapes with real geometry — can be re-rasterised at the scale it is actually being drawn at, instead of being rasterised once and magnified.
It shares AE’s sunburst column with Collapse Transformations (one meaning per layer type) but is a separate property, because a placed composition can want Collapse while its vector children individually want CR.
It is opt-in, per layer. Bitmaps and flat rects are excluded, and the snapshot builder re-checks rather than trusting the flag, so a stray property cannot allocate a raster that could not look better.
What it actually fixes
The effective on-screen scale already reached the rasteriser before this existed — a layer at 800%, a layer parented to an 800% null, and a 3D layer pushed toward the camera all arrive correctly magnified. The rasteriser also already drew at the raw requested scale, uncapped.
The two real defects are narrower:
- The cache key collides above 4×. Scale 6 rasterised at 1200 px, then scale 12 came back a cache hit and reused it. Past 4× every scale shares one key, so whichever rasterised first wins and zooming further never re-rasterises — a logo goes soft as a camera dollies in and stays soft.
- Nothing was bounded. A 2048 px box at 32× asks for a 65536 px texture, past every GPU limit, so it fails to allocate rather than degrading.
CR on fixes both: the drawn size and the cache key are quantised to the same
extended power-of-two ladder so they agree, and the tier is bounded by the
GPU’s real maxTextureSize (WebGL2 can report 4096) and a 16-megapixel budget. A
1× → 32× zoom produces six distinct rasters with CR on, against one stale
identity above 4× with it off.
CR has no quality lever and no draft interaction, deliberately. Because CR off already draws at the raw scale, capping CR’s tier below the requested scale made CR on softer than CR off — 800 px against 3200 px at scale 16. It is a correctness and cacheability feature, not a spend-more-pixels one.
CR off keeps the old behaviour verbatim, defects included, so every existing project is byte-identical. Opting a layer in is the supported way to get the correct behaviour.
Vector content inside a collapsed pre-comp needs no special case: the spliced clone carries the original layer’s property.
Size presets
Both the dashboard and the viewport header read one shared, grouped catalogue. Changing the composition size from the header is the same operation as choosing it at creation time.