Making a massive scene workable in Blender

I’m trying to build a scene that is going to get up to tens of millions of polygons, and with only a hundred thousand it’s bogging down the display and rendering of the scene. What methods are available to cut the scene up?

The scene is a massive library, on three floors (with all three floors at least partially visible), several “features” that extend through all three floors (including a waterfall, a very large pendulum, and hanging light globes, to name a few), and massive numbers of bookshelves with a wide variety of reading spaces in between.

I’m not concerned with which rendering engine to use in this case, all I want to do is show the scene. I suspect it may need to be cut up into several different scenes and composited together afterwards, or rendered as a form of line art and hand-drawn and -shaded later, or whatever else works. I’m open to all suggestions at this point, as I’m not sure what the best course of action is for this.

The Cycles engine should be able to render all of those polygons without a lot of slowdown (the main factors being lighting and shading effects). BI meanwhile will choke because of its rasterization nature.

If you want to show the whole thing as something interactive, that’s something you won’t be able to do with that many polygons unless you design it in an optimized way for running in the BGE (like using LOD).

Oh, definitely a still image only, not interactive or a movie.

Are there any tricks for improving Cycles performance? Like limiting how far each light-ray travels?

1). Lower the min bounces parameter to something like 5
2). Use the Correlated Multi-Jitter sampling algorithm (less noise than Sobol)
3). Use the indirect clamping value (reduces noise)
4). Make use of the max bounces parameter for lamps (decreases render time).
5). Use portal lights once 2.75 comes out (reduces noise from environments not using MIS).
6). Turn on MIS for strong light sources and turn it off for weak and/or really big ones (reduces noise).
7). If making use of layers, make use of the max samples override value for some may need less to converge (decreases render time).
8). Make use of the ‘filter glossy’ value (reduces caustic noise without eliminating caustics completely)
9). Reduce the amount of diffuse bounces compared to those for glossy and transmission (decreases render time)
10). Use small tiles for CPU rendering and large tiles for GPU rendering (decreases render time).

Unfortunately I’ve been running into other issues aside from Cycles performance, and that’s editing performance.

A relatively detail-free and cut-down version of the scene I’m working on with 1.4M vertices and almost 1.5M faces takes up almost half a gig of system memory to store for editing, before I hit render. The vast majority of the faces are the bookcases, which are constructed with a Mirror and half-a-dozen Arrays.

After I hit render, I’m not quite sure what happens, but almost half of my maxed-out 4GB gets used and the system slows down still further.

I can’t further extend the amount of RAM I have without replacing the motherboard, and then I basically need to build a new system anyways, so I’m slowly saving up for a new relatively powerful system.

Did you try seperating you scene into different layers and then using render layers to render out certain parts of your scene individually? This way blender does not have to calculate your scene all at once and you can combine you render layers in the compositor.

“Officially”, I haven’t even started the scene yet, merely done a couple of relatively high polycount mockups to prototype how the scene will eventually look, and, to a certain extent, perform for editing and rendering.
(though I’ll likely be able to use what I have thus far as a basis for the final scene, if I ever to that point)

With about a million polygons (still nowhere near a quarter the estimated size of the final scene), editing has slowed down a bunch, in particular object selection, and vertex selection on large, dense models, so I’ll likely have to cut the levels apart along layers and render layers, and cut the larger scene down on a sort of grid pattern. Fortunately, we have twenty layers, and if it’s not possible to have that many render layers, I can at least cut editing issues down by using loads of layers.

I guess I should just push my way onwards and come back when I have a problem, eh?

Don’t duplicate things with the array modifier directly, that isn’t what it’s for. It produces a full mesh copy which will kill your RAM. Use duplis or particles, they’re much more efficient for Blender to work with and will export to most renderers (Cycles included) as instances. If you find the array modifier is handy for placing your copies, you can use it with a duplivert/dupliface mesh. For example, you can make a single plane, add an array modifier to space the planes where you want each bookcase, then parent the bookcase to the plane and enable duplifaces for the plane.

Also, don’t rely on linked copies (alt+D) for instancing either. They’re only instances when the copies don’t have modifiers. If you need instances (and if you have many copies, you definitely do) use duplis/particles and get them properly.

Make use of linked groups too. Those are also a form of duplis (dupligroups). A particular group’s meshes only need to be loaded at render time once, no matter how many copies of it you make. Things like chairs, light fixtures, maybe a templated bookshelf you’re using multiple times? Build it in its own file, put everything in a group, and link in that group. Linking groups instead of storing everything in a single local file will also speed up your load and save times, and generally make the file more manageable.

If you’re having trouble with viewport performance, you can use scene layers to hide objects you aren’t working with atm. You don’t necessarily have to use multiple actual render layers. You only need to bring those in if your renderer can’t load the whole final shot at once. You can also set individual objects to draw as bounding boxes. It’s in the object tab, under “maximum draw type” Note that with group instances you can set this for all objects in the instance at once, which is another benefit of them.

If I was going to use dupli-something, which would be best for allowing me to position bookcases facing different directions? Is there an option for duplilines? Or should I stick with groups for the best flexibility?