• Register

You play as a lonely traveler who explores fantasy worlds made of cubes (voxels). On you way, you will meet different creatures (some of them are friendly, some - hostile), visit various biomes and locations, find dungeons and treasures. The world, quests, items, dialogues with npcs are procedurally generated (just like in Minecraft and similar games!) Unlike many other action RPGs, there are no pre-defined classes. Instead, there is one big talent tree: you can choise whatever you want along the game. You can come up with completely insane combinations, like warrior-healer, tanky fire mage or necromancer with bow - anything you can think of. TL;DR, main game features: - Voxel-based graphics - Random world, quests, NPC dialogues, etc - No class system, talent tree instead There are also: - Crafting system - Dungeons with bosses (and loot! :D) - Multiplayer (up to 5 people) - YOU CAN EVEN RIDE ANIMALS! WHAT ELSE YOU MIGHT NEED?

Post tutorial Report RSS Infinite chunk generation in Unity (4 million blocks - 40 fps)

Here are some things we learned from our experience of designing fast, smooth and efficient chunk-based terrain generator.

Posted by on - Intermediate Client Side Coding

Voxel-based games become more and more popular these days. It's not surprising, because voxel-based games allow such things as completely dynamic world and procedural world generation. Also, games made of cubes (e.g. Minecraft) look simple yet pretty.
The most important part of a voxel-based game is world. For our project, "The Traveler", terrain generation is critical because the idea of the game is based on travelling and exploration.
Here are some things we learned from our experience of designing fast, smooth and efficient chunk-based terrain generator. Even though we developed this system a year ago and the game itself now looks completely different, basic principles are the same.

#1: Create a mesh for each chunk

Basically, this is the most valuable thing you need to know. Why? At first, our chunk generation used separate colored cubes for the terrain. Results weren’t that good : about 40 fps with only ~5000 blocks(your results may vary). When our team applied a separate mesh generation for each chunk performance skyrocketed to the amount you see in the title.
How is that done? There is a wonderful tutorial on this matter from this guy. To sum up, what you need is:
  1. World controller script, which will control the generation, enabling and disabling the chunks.
  2. Chunk script itself, which will create and hold information about blocks, terrain height(using Perlin noise, supplied with unity or your algorithm of choice), chunks’ mesh and other stuff you will need along the dev process.
  3. Block script, where you will generate vertices(points of mesh), colors, triangles and apply block’s part of the mesh to chunk’s mesh.

4 million upclose2

A photo of terrain generated using perlin noise in our game called “The Traveler”.

#2: Make as many things multithreaded as possible

Yes, you may argue that Unity itself is not entirely multithreaded and its’ API is not thread safe, some of the parts of mesh creation can be made in a seprate thread, provided it does not call any Unity API functions.
Why is it important? As I’ve said, Unity does not fully use all of cores of your CPU, so having CPU working on 50% of its power rather than 20% (depends on the number of cores) will considerably boost your performance. Also, you should bear in mind that thread creation itself has some performance overhead, so the benefits of having multiple threads are more clear when using big chunk sizes.

4 million blocks

Partly generated terrain which consists of around 3 million blocks.

Conclusion

That's all for now. If you have questions, feel free to leave a comment. Also, if you like voxel-based games, you might want to play "The Traveler". Fortunately, we are starting a closed beta-test soon and you can sign up at our website to get an invite. Have a good day! :)

Post a comment

Your comment will be anonymous unless you join the community. Or sign in with your social account: