Search Unity

  1. Megacity Metro Demo now available. Download now.
    Dismiss Notice
  2. Unity support for visionOS is now available. Learn more in our blog post.
    Dismiss Notice

Creating big multi-tile maps with streaming, new veg tools, etc.

Discussion in 'Editor & General Support' started by gecko, Jul 10, 2018.

  1. gecko

    gecko

    Joined:
    Aug 10, 2006
    Posts:
    2,240
    I've been working for many months now on some big game worlds, trying to figure out the best tools and workflow for large maps. I had assumed this was pretty well established by now and have been surprised at how much I've had to puzzle through to figure out best procedures. So I'm starting this thread to share notes with others grappling with the same challenge and hopefully we can help each other figure out the best way to do this. (Note: I understand that Unity 2018.3 will have some significant improvements to terrain, though they're a bit vague at this point and I am not too confident that they'll be ready for production in 2018.3, and we can't wait for 2019.1.)

    Here's what I'm doing:

    Terrain
    I'm making a (new version of a) game set in Yellowstone National. Park; we'll have three areas represented in the game, each 7x7km in extent. We use World Composer to pull down the map data, then refine the heightmap with World Creator, and then use Terrain Composer 2 to paint splats and lay down grass, while also splitting it into an 8x8 multi-terrain array.) Because these are realworld locations, we can't design the maps for optimal performance -- most places on the maps have very long (10-30+ km) sightlines, so we can't use clever methods to limit the player's views. Then we use MicroSplat because it offers incredible features and performance.

    Streaming Setup
    Then I generated low-rez LOD meshes for all the terrain tiles and set everything up with World Streamer to load 9 Unity terrain tiles around player, and then load the low-rez terrain LOD meshes for all other grid cells. I’ve only done a little bit of performance testing with that, but even in a build, I’m finding that FPS drops to 5-10 for several very noticeable seconds each time stuff loads/unloads. I hope/assume there are ways to optimize that, but haven’t looked into it yet.

    Vegetation
    I want to use VS for trees for obvious reasons, and particularly because of the awesome integration with MicroSplat (especially for distant tree shadows, the lack of which has been a big concern of mine). However, since my maps have long sightlines, I need trees on the mesh LOD tiles as well as on the Unity terrains. Lennart has suggested baking the trees to Persistent Storage and use the VS Mesh terrain component -- even though that'll mean 64 VS packages, I guess that's what I gotta do, but I haven't gotten a chance to try it out yet. I also haven't tried the new multi-terrain options in the latest version of VS, but I plan on using those.

    I develop on Mac and found that VS's grass rendering is very low performance there (though Lennart is going to look at that after he gets a Mac), so now I'm using straight-up Advanced Terrain Grass for grass (instead of ATG shaders in VS -- the ATG shaders are too gorgeous not to use).

    I've been hoping that TerraFirma would come along and solve a lot of my problems, but Lennart says that it is still in development and release is not imminent.

    So even after all this work, I feel like I'm still nowhere near having a final workflow/setup for high-performance scenes with these big maps. I'd be enormously grateful for tips from anyone who's trying to do the same kind of thing, like @sharkapps @jeromeWork @recon0303
     
    chipb, DBarlok, Zaddo and 3 others like this.
  2. jeromeWork

    jeromeWork

    Joined:
    Sep 1, 2015
    Posts:
    426
    There's a huge need for a thread like this. A lot of the available information is asset specific. There's very little that joins all the parts of the process together, how different assets work best together, or that really discuss the detail of getting an optimised open world scene.

    Before I chime in with my own findings, @gecko can I ask how do you generate your low-rez LOD meshes from the Unity terrains? Do you use an asset like Terrain to Mesh? https://assetstore.unity.com/packages/tools/terrain/terrain-to-mesh-47276

    And how do you instantiate them in the scene, especially while working hand in hand with WorldStreamer? Is there a way to tell WorldStreamer to load a specific layer outside of the direct vicinity of the player?
     
  3. gecko

    gecko

    Joined:
    Aug 10, 2006
    Posts:
    2,240
    I use a custom script to batch convert the terrains to meshes -- I'd share it but it's based on a script in RTP (we just added some batch options). In World Streamer, I set up ring streaming so it loads Unity terrains nearby the player and mesh terrains farther away.
     
    jeromeWork likes this.
  4. jeromeWork

    jeromeWork

    Joined:
    Sep 1, 2015
    Posts:
    426
    So currently my own tests have been based on using the following tools:
    Gaia for terrain creation,
    Vegetation Studio for trees, grass and details,
    MicroSplat for terrain textures (I've also tried CTS but like MicroSplat's functionality and I've been led to believe that it's better optimised)
    World Streamer for streaming terrain tiles and GameObjects
    - I've been reading that baked occlusion culling is not a good idea for large open worlds (maybe someone can confirm?) - I've read elsewhere that the Culling Group API for trees and bushes can be used to improve performance, but I know very little about it (https://docs.unity3d.com/Manual/CullingGroupAPI.html)
    For splitting the terrain I'm using the free script recommended in the WS tutorial: http://kostiantyn-dvornik.blogspot.com/2013/12/unity-split-terrain-script.html

    To test things out I've built three versions of the same test terrain scene.

    Build1 is a 2K terrain with Vegetation Studio doing trees and grass. Terrain was originally created with Gaia and there are a few farms and additional trees/rock meshes dotted about (from the initial Gaia stamps). Everything's set to Static. Just a single scene no streaming.
    I'm using this as my worse-case, baseline scenario.

    Build 2, I've split the terrain into 64 256x256 tiles. I've got a Vegetation Studio System component on each of those tiles, each with its own baked Persistent Storage asset. Farms/rocks etc I've set to their own Large / Medium / Small layers for World Streamer.

    Build 3, uses the same tiles and World Streamer set-up. The main difference is that each terrain doesn't have its own Vegetation Studio System. Instead, the main game scene has a script that creates a pool of 12 Vegetation Studio Systems and allocates them to terrains as they are loaded (the baked Persistent Packages for each terrain are also added at the same time)
    - this appears to be the recommend method from the advice the Lennart and others are giving on the Awesome Technologies discord (https://discord.gg/Zxv524a).
    * I've @OneManBandGames to thank for his advice on this methodolgy, and for sharing his VS System pooling script. (I'll check with him whether he minds this being shared on this forum)

    The results I'm getting aren't quite what I was expecting, and they've just been confirmed by @angelekas80 on the Discord.

    Build 1 has the lowest Mem allocation: 581MB
    average 23FPS (low but smooth and steady, no spikes) on low end PC/GPU [windows10 xeon E5-2630 / 4GB QuadroM2000 / 16GB RAM]
    42FPS on higher end [windows10 i7 6700k 4.00hz asus gtx 1060 6gb oc 16gb ram ssd samsung 500gb]


    Build 2, has a slightly higher mem allocation of 541MB,
    higher 27FPS on low end
    similar 40ish FPS on higher end PC
    - both have lags (frame drops to 14fps) as different parts of the terrain load and unload
    I'm guessing this is a World Streamer issue which @gecko has confirmed he's having too... Just to clarify, I am testing the build not in the Editor where I know async additive scene loads don't properly work )


    Build 3
    has the highest Mem Allocation at 660MB
    27FPS on low end PC
    40FPS on higher end
    and really bad freezes and frame drops on loading and unloading tiles. (again partly a World Streamer issue I expect, but maybe VS is responsible too as each System initialises from the pool?)


    So. TLDR. There doesn't seem to be much gained by splitting the terrain. (mem allocation increases and hiccups are introduced as WorldStreamer and the VS pool load and unload) Not at all what I was expecting!

    I'll keep testing and trying things out, and reporting back here, but would be incredibly grateful for any advice or guidance.

    Builds can be got from here if it's of interest: https://drive.google.com/open?id=1CGmKL6-6m3ZEHsuNh0RLd_4hd5TTdo_s (2GB zip) Using Unity 2017.4.2 and not likely to move on to 2018 for a while, for stability and compatibility reasons
     
    Last edited: Jul 10, 2018
    DBarlok and Zaddo like this.
  5. gecko

    gecko

    Joined:
    Aug 10, 2006
    Posts:
    2,240
    thanks for all that! I'll be asking for some tips on the VS pooling stuff as soon as I get to that point.

    Now I'm trying to figure out the cause of the World Streamer spikes (been posting on that in the WS forum) but no luck yet.
     
    jeromeWork likes this.
  6. gecko

    gecko

    Joined:
    Aug 10, 2006
    Posts:
    2,240
    BTW, I've also wondered about loading all 64 Unity terrain tiles, but then disabling the terrain mesh on distant terrains and using mesh terrains there, but still drawing only the billboarded trees....since I think the latter are pretty optimized, and it's the terrain itself that is expensive. But then I realized that Unity would still have to calculate the heightmap in order to draw the tree billboards (at least, I suspect maybe it does, but what do I know?), so I haven't tried that yet. It's very hard to find definitive information about the terrain system in that regard.
     
  7. neoshaman

    neoshaman

    Joined:
    Feb 11, 2011
    Posts:
    6,492
    Streaming hiccups in unity is something that I haven't seen anyone solve without sources code access.
     
    DBarlok and jeromeWork like this.
  8. jeromeWork

    jeromeWork

    Joined:
    Sep 1, 2015
    Posts:
    426
    Reporting back on some research re. optimising Unity terrains to mesh:
    https://forum.unity.com/threads/using-a-terrain-vs-using-a-model.229824/#post-2684467
    "export the terrain as an OBJ and open it in zbrush. From there you can "decimate" the terrain down... After removing the triangles you can then apply a normal to it and it looks absolutely perfect. So on a mobile game, I have a 2kx2k fully detailed terrain at 5.6k tris, 7.9k vert and at only one draw."​
    Interesting idea, although a reply mentions the following downside:
    "For the texturing aspect it might be a bit limited unless you find a splat map shader for the terrain. Otherwise, using a 2k texture map for the terrain would mean every 3 feet give or take would be covered by 1 pixel! That's a pretty blurry terrain. It doesn't improve all that much using a 4k texture map either. I suppose using tiling textures with a splat map shader is the best way to go."​

    From the same thread, this looks like an article that's full of really detailed information:
    http://www.gamasutra.com/blogs/ChristophEnder/20170222/292179/Open_World_on_Mobile_with_Unity.php
    Summarised by the author:
    "I can compare the performance on iPhone 4 to iPhone 6 for unity terrain and mesh terrain. In the game two Unity terrains of 1024x1024 datapoints with 3 splatmaps were shown with adapting their pixelerror during runtime every second depending on the distance. The mesh conversion splits the terrain in square patches (T4M unfortunately does long stripes), so only few of them are in the frustum. Then the mesh topology was simplified to a few percent of the original by an asset called Cruncher at development time, so that the look in the game is approximately the same.

    At runtime the Unity terrain takes a lot of CPU performance and batches, pops visibly from time to time and is 20% slower than the mesh! Anyway we shipped it with Unity terrain because it still looks nicer when you look closely. If one spend more time to regulate the crunch process better, the mesh is the better option. In your game it also depends if the valid camera position has a defined limited area or the player can cruise around freely and if your app is already CPU bound or not."​

    I'm reading a lot about Atlasing being a key part of terrain optimisation (I knew that for 'normal' geometry) but hadn't really considered it for terrains.
    - what would the process be for atlasing vegetation like SpeedTrees or TurboScalpeur grasses dropped into Vegetation Studio? (could something like MeshBaker actually be used?)
     
  9. jeromeWork

    jeromeWork

    Joined:
    Sep 1, 2015
    Posts:
    426
    One more build to report on.

    Build 4, uses the same set-up as Build3. Tiled, with Vegetation Studio System pooling. The only difference is the addition of a TerrainCullingSystem component (Rendering Distance set to 4000) as per the World Streamer Tutorial 3, 4 - Terrrain split and terrain culling system video

    Result is interesting. I only have low end PC data available.

    Mem allocation 725MB
    20FPS - probably lowest of all so far, but steady with almost no lagging.

    download build from here: https://drive.google.com/open?id=1tSW7_IwPNUWX2Kb3ndXwQ2wtvqNzlZHo (841MB zip)

    Next up, I'm planning to create those low rez terrain meshes an implement ring streaming. I've just found Mesh Terrain Editor Free which hopefully should do what I need.
     
    Last edited: Jul 11, 2018
    neoshaman likes this.
  10. sharkapps

    sharkapps

    Joined:
    Apr 4, 2016
    Posts:
    145
    Thanks for creating this thread. I agree with @jeromeWork that we need a place for the most accurate and up-to-date information on how to put together a reasonable workflow for building large open worlds in Unity. I'm happy to share whatever I have learned in the many months I have spent working on one of my most fun yet frustrating projects in Unity so far.

    I love what you have done so far, @gecko, with your WolfQuest 3 work! Yellowstone is an inspiring environment to recreate and you're doing a good job with it from what I've seen.

    The biggest thing I have learned (and honestly expected at the outset) is that there is a lot to learn, and there are a ton of things to consider when building a large streaming open world game vs. "small world" games. Just getting textured terrains working smoothly without hiccups in ring-streaming is a challenge in and of itself. It's really important to first get blank terrains streaming without spiking. In some versions of Unity, this appears to be impossible due to bugs (see below). If you can, however, get the stars to align, smooth streaming of terrains is possible.



    My Project
    My project is really just a prototype at the moment that will allow the player to roam the open world by foot or by various vehicles (cars, trucks, boats, planes, etc.), as they try to accomplish tasks. I'm developing the prototype as part of my self-driven education in game development (all of my professional experience is software development and testing, but mainly for servers & back-end services).

    Terrain
    I am also using TerrainComposer2, but am not using WorldComposer for my this project. I have tried to use MicroSplat in this project a couple of times, but I ran into some issues when I needed to go back and tweak things on the terrain splatmap in TC2, so I removed it and I decided to try it again later when I really need it.

    My terrain is composed of 400 (20x20) 512mx512m terrains. The setting is a tropical island, so I am using the Tropical Forest Pack for the foliage.

    As you can see from the above video, I've got the LOD0 terrain streamer working smoothly.

    Right now, my challenge is to get the scene with both LOD0 and LOD1 terrain streamers running smoothly. At the moment, I am having issues with garbage collection.



    You can easily see in the video where the spikes occur. I attached the profiler to a Development Build of the project, which points to garbage collection as the culprit.


    This image shows a snapshot of the profiler connected to a 64-bit Development Build running on Windows 10

    Right now, I'm guessing that the unused assets getting collected here are unloaded LOD1 mesh scenes. I am not sure how to correct this behavior other than by not ever unloading the LOD1 scenes, but then my concern would be the the amount of memory needed and also why bother even streaming LOD1 terrains at all at that point?

    I'm hoping someone here has dealt with this before and can offer some advice.


    The Future
    I know a new terrain system is coming, and when I was playing around with RoadArchitect on 2018.2.0b11 the other day, I noticed the terrain looked different and behaved differently. I am curious what is changing and how it may help out for open worlds and/or streaming. I hope to migrate a copy of my project over to 2018.3.x soon to test things out.

    More Reading
    Async Texture Upload
    TL;DR: Make sure your textures have Read/Write DISABLED
    https://docs.unity3d.com/Manual/AsyncTextureUpload.html

    Occlusion Culling
    TL;DR: Don't use occlusion culling for large outdoor scenes, use LODs and use Unity 2017.2.0f3+
    Issue: camera-culling-information-is-garbage-collected-when-not-desired (Fixed in Unity 2017.2.0f3)
    Forum: https://forum.unity.com/threads/occlusion-culling-cpu-spike-in-profiler.314978/

    General Performance Tips
    https://cgcookie.com/articles/maximizing-your-unity-games-performance

    Background Loading Thread Priority
    I found this info when I was looking for ideas on what could be causing spikes during terrain loading from https://docs.unity3d.com/Manual/BestPracticeUnderstandingPerformanceInUnity8.html.


    How did Campo Santo get smooth performance in Firewatch?
    This video is referenced by people in the forums all the time when people ask about getting good performance in open worlds. It's a good talk and it has a lot of great tips for achieving great performance in Unity, but ultimately they revealed they needed to change code in the Unity source to get certain things to load over multiple frames.



    Thanks again for getting this discussion going and looking forward to reading all the responses!

    Best regards,
    Tony
     
    Last edited: Jul 12, 2018
    MGhasemi, syscrusher and jeromeWork like this.
  11. neoshaman

    neoshaman

    Joined:
    Feb 11, 2011
    Posts:
    6,492
    Random tought:

    I wonder how much can be optimize by building our own terrain directly. I mean a terrain is just a grid of vertices with only Y coordinate changing, so we can reuse the same data and only update the Y coordinate (the heightmap, only an array of float), LOD are just bigger terrain of the same size, which mean reduce density. Reusing the same data would maybe lessen the streaming hassle. And since we would have our own terrain, we can organize the heightmap streaming more efficiently by breaking the data in neat friendly package we can reassign or progressively read as we need, instead of trying to go around unity limitation. I was considering using similarity matrix to find recurring objects to stream from neighbor terrain and thus limit the data needed by only storing taking the delta difference per terrain, so we don't reload existing object but only instance new version of them using the delta. And since we could precompute that difference, have a script that warn when we have over budget differences.

    I have been researching that a lot, and that's a common occurrence in every single one of them. It's either change the source code, and devise another way to implement similar thing than unity.
     
    DBarlok, syscrusher and jeromeWork like this.
  12. jeromeWork

    jeromeWork

    Joined:
    Sep 1, 2015
    Posts:
    426
    Thanks @sharkapps That's a stellar contribution! A lot there to read up on and digest.

    I did do some testing with low-rez LOD1 mesh terrains and similarly found very little in terms of performance gain - but as my project is more of a walking sim, with plenty of coverage stopping long sight lines, I quickly realised that the long distance ring streaming just wasn't necessary for me. It added an unnecessary overhead, which unsurprisingly slowed things down.

    Can you clarify how you're adding your foliage? Are these trees meshes with LODs, or terrain trees? Are you using something like Vegetation Studio? Or just placing them on their own on World Streamer streaming layer?

    Agreed that baked occlusion culling isn't a good idea for a large world. Have you implemented any other solutions? On that tip...
    - Another tool I've yet to try, but intend to, is InstantOC which I've used very successfully in the past on a procedural dungeon crawler.
    - And then there's also Imposters .https://github.com/xraxra/IMP (free billboard imposter baker for Unity) which I posted about on the Awesome Technologies discord, which you might have missed.

    Vegetation Studio is something @gecko and I have in common on our separate projects, as well as MicroSplat. On the WorldStreamer thread he's understandably being told to strip everything down to bare terrain and LOD1 meshes to see if the hiccups persist. Which is very much your advice, and totally makes sense.

    Someone called Timotee posted some incredibly useful info on the discord, outlining some of the initialisation issues with VS. I hope he won't mind me reproducing it here, for posterity:

    "We are using SECTR and doing ring streaming. Before Vegetation Studio integration we had minor slow down upon loading of each terrain sector, I've really worked hard to mitigate and load anything that comes in over time and not all in a single frame. We are using 1 Vegetation System as a child object of each terrain and only using persistent storage on each. After some profiling in exe, I've found the OnEnable of the Vegetation System to cause some pretty bad hitching with this process. Looking at the code it looks like VS uses the currently assigned terrain bounds to allocate memory and create vegetation cells in OnEnable. I think ideally for streaming like this it would be best as 1 Vegetation System for the whole world, this way your allocation hit is all up front upon loading into your open world scene. Then just manually assign an arbitrary bounding area set to encompass the world for vegetation cells, instead of using the currently assigned terrain OnEnable. For us since we only use persistent storage we don't need to worry about run time spawning, I don't believe the actual terrain angles/heights and splat data actually matter to this, so the assigned terrain is really just a bounding box. Now if you have run time spawning VS would need to know as each of those terrains is loaded and run time spawn on each load. It looks as though VS Pro does this type of optimization, 1 Vegetation System, arbitrary bounding area and loads as terrains come in. I just don't think we will have time to wait for VS Pro, we need this optimization before then."​

    Inline with @neoshaman I've been trying to think a little out of the box and spent the day trying out MapMagic. I haven't got as far as adding vegetation yet but it does look very promising. Very smooth generation of an infinite terrain. Of no use for @gecko's Yellowstone recreation but may well be a potential alternative for me. As long as I can add handcrafted details. Sadly my main workstation is in for repairs so difficult for me to do any realistic test, but should hopefully be back up and running properly in a week or so.
     
  13. sharkapps

    sharkapps

    Joined:
    Apr 4, 2016
    Posts:
    145
    Right now I am just adding trees, grass and rocks via TerrainComposer2. The trees are meshes with LODs. I was experimenting with Vegetation Studio in this project a while ago, and I had a working system that would generate the necessary VS components as each LOD0 terrain loaded, but at the time there wasn't a good solution for dealing with the LOD0 terrain meshes in the ring streamer. @LennartJohansen advised that the VS Pro update he is working on will make setting up VS with streaming multi-tile terrains much easier and much faster, but it will require Unity 2018. The quote you included from Timotee is a good summary of why the current VS isn't good for streaming. Given all of that, I have decided to wait for VS Pro before I attempt using it again in this project.
     
    jeromeWork likes this.
  14. jeromeWork

    jeromeWork

    Joined:
    Sep 1, 2015
    Posts:
    426
    Can I be a pain and ask one of you guys with a half decent machine to test this build out?
    It's MapMagic (set to infinite repeat tiling) Vegetation Studio with a decent amount of grass (2 types) and 1xSpeedTree, CTS for terrain texture, plus Enviro, Aura, and a bunch of post-processing which should make it crawl to a halt but it actually plays at my end - not great but I'm surprised it even runs.
    https://drive.google.com/open?id=1Mb3mgH-dKITByrz_u7vGwccMxSxXUoK0 (300MB zip)
     
  15. neoshaman

    neoshaman

    Joined:
    Feb 11, 2011
    Posts:
    6,492
    Open world with map magic is different than streaming because it's generated in real time no? Should be less of a hassle maybe generation time.

    For naught I tried with my gt705 which is my strongest alive card ...
    Result a 900p ultra
    upload_2018-7-13_1-33-51.png

    I got 5frames at 480p with lowest settings, I'm obviously GPU bound. I didn't notice hiccup, not sure I would have :D

    AT least you have a benchmark with the weakest compatible card lol.
     
  16. jeromeWork

    jeromeWork

    Joined:
    Sep 1, 2015
    Posts:
    426
    Thanks @neoshaman Interesting that I'm getting significantly higher fps on what looks to me looks to be a similar machine.

    720p, High

    I think you're right, it's all on the GPU. GT705 v GTX750ti is the main difference

    Agreed that MapMagic procedural generation is different to streaming, but appears to be essentially doing the same thing - tiling terrains and loading/unloading as the player moves through the grid. There's obviously something it's doing that's a lot more efficient than WS?

    ps. on 900p Ultra I'm getting 20fps.
     
    Last edited: Jul 13, 2018
  17. neoshaman

    neoshaman

    Joined:
    Feb 11, 2011
    Posts:
    6,492
    Yes ... it's not loading from disk :p you bypass a whole host of problem with that, like non continuous data.
     
  18. gecko

    gecko

    Joined:
    Aug 10, 2006
    Posts:
    2,240
    I've watched again the Unite Berlin video (at 32:50) about terrain improvements coming in 2018.3, and seeing how 2018.2 just released, I'm more hopeful that 2018.3 will be released earlier (Sept/Oct) than later (Dec). Apparently these improvements boost loading performance tremendously, and also possibly eliminate the need for mesh LOD terrains.

    So I'm thinking maybe I should just set this aside for a month and see what the 2018.3 beta can do then. No sense pouring a ton of time into this now if that'll solve many of my problems in the not-too-distant future.
     
  19. jeromeWork

    jeromeWork

    Joined:
    Sep 1, 2015
    Posts:
    426
    Only problem is that 2018 brings with it a few more idiosyncrasies that may introduce new bugs or make using certain other assets problematic. Personally not sure if I'd trust it for a proper release...
     
  20. neoshaman

    neoshaman

    Joined:
    Feb 11, 2011
    Posts:
    6,492
    Never thrust a features that isn't in front of you.
     
    jeromeWork likes this.
  21. gecko

    gecko

    Joined:
    Aug 10, 2006
    Posts:
    2,240
    I know, I know....I usually try to lag a version behind....but the terrain stuff just looks too valuable to hold back on. Plus VS Pro is gonna require 2018.3 anyways and it also looks extremely valuable for multi-terrain setups.
     
    Last edited: Jul 13, 2018
  22. neoshaman

    neoshaman

    Joined:
    Feb 11, 2011
    Posts:
    6,492
    Well I had to go custom personally, they won't do anything for planetary terrain and need corner stitching with less or more than 8 neighbors due to spherical pole. I'm currently thinking about to compute LOD the most efficiently possible in term of data, that is how to generate and assign the Y vertex position and scales to a single mesh reused for each tile and LOD.
     
  23. jeromeWork

    jeromeWork

    Joined:
    Sep 1, 2015
    Posts:
    426
    Still on a MapMagic procedural generation tip, but I think this might be useful to anyone looking at this thread.
    Have been reading up on Unity optimisation. I've collected notes on this Google doc: https://drive.google.com/open?id=1ElZcFREPwCfdbHPKU9eRkQdIzz6ZRIAKukCGeTMKcrI

    I rebuilt the MapMagic test making a few key changes:
    1. Player settings > turned on graphics jobs (experimental)
    2. Went through my terrain textures, made sure all were compressed, at 1024, using mipmaps and with read/write disabled (thanks @sharkapps )
    3. Removed MadGoat SSAA and HBAO and turned back on the post processing stack anti-aliasing and ambient occlusion -> to keep all image effects in one drawcall

    Then I made one build with forward rendering - AVG 36FPS
    And another with deferred rendering path - AVG 43FPS

    both at 720p, High (compared to previous, unoptimised AVG 25FPS)

    Then for completeness went through and tried each one individually, to see which change had the most effect.
    and the culprit was MadGoat SSAA, at its default 2x setting it was eating up 10fps, reduced to 0.5x it was still problematic and looked much worst than the 'built'in' solution. So turned off for good.

    HBAO I found lost me about 1fps, but it looks so much better than the UNity post-processing stack AO that I'm stickin gwith it.

    I tried turning off graphics jobs (experimental) to see its effect and although there wasn't much of a performance change, I did notice less lag with it on (which makes sense considering it moves graphics tasks off the main thread to worker threads)

    For anyone interested, here's the, so far, optimum version: https://drive.google.com/open?id=1DyHhKdzaE-j_gvOUDqANSlxit7SEtHSK

    Next up I want to try reducing the quality of the Desktop SpeedTree and grass mesh. Possibly removing LOD0 for both.
     
    Last edited: Jul 13, 2018
    syscrusher and neoshaman like this.
  24. neoshaman

    neoshaman

    Joined:
    Feb 11, 2011
    Posts:
    6,492
    upload_2018-7-13_20-3-50.png
    Well ultra + 900p = 3 frames and 5 max, that's about the same as the previous test at low 480p

    480p low is at 7 frame consistently with peak at 9 and low at 5

    I wonder if you can figure out a build that run at 30fps and 60fps on my computer lol, it would be fun to see where is the minimal requirement ...

    That's the machine I will optimize for, so I will have more harsh (gpu) optimization that you guy to do! I will join as soon as I finish the task on convex hull lol I still have a weaker pc with intel graphics and weaker cpu though ...
     
    jeromeWork likes this.
  25. jeromeWork

    jeromeWork

    Joined:
    Sep 1, 2015
    Posts:
    426
    That's exactly what this all got me thinking about. What's currently thought of as a basic minimum spec? And what strategies should I use to have a build that caters to both low spec and high spec, without everything being reduced to the lowest common denominator. Things like, if quality setting is high or above, load in Enviro. If not load Enviro mobile
     
    Last edited: Jul 14, 2018
  26. jeromeWork

    jeromeWork

    Joined:
    Sep 1, 2015
    Posts:
    426
  27. neoshaman

    neoshaman

    Joined:
    Feb 11, 2011
    Posts:
    6,492
    upload_2018-7-14_23-20-0.png
    900p ultra, I got some average at 20fps when I avoid tree heavy place, or when tree are at lod distance, if I stay with tree it falls down to 15fps, I'm tree limited lol

    upload_2018-7-14_23-47-15.png
    Low 480p it's 24fps average on worse case tree hugging, but I hit 30fps sometimes, I feel likes there is something else the gain is not proportional to teh ultra case, cpu def not that.


    for reference my GPU specs, a modern cripple lol
    upload_2018-7-14_23-22-23.png
    Fun facts I'm unable to find data online about this card, they all reference the OEM or M or A model, who all have 4ROPS while I have 8 ...closest is OEM
    https://www.techpowerup.com/gpudb/2578/geforce-gt-705-oem
    roughly 168Gflops32 ie weaker than a wiiu by a small margin
    However it's two magnhitude above the most common mobile gpu (mali 400) at 1.8gflops
    https://gflops.surge.sh
     
  28. jeromeWork

    jeromeWork

    Joined:
    Sep 1, 2015
    Posts:
    426
    Thanks @neoshaman i'm seeing a similar slow down. my guess is that SpeedTree's to blame. I've heard they can be 'heavy'.

    I'll try replacing them and see the difference.
     
  29. jeromeWork

    jeromeWork

    Joined:
    Sep 1, 2015
    Posts:
    426
  30. neoshaman

    neoshaman

    Joined:
    Feb 11, 2011
    Posts:
    6,492
    On ultra 900p performance looks slightly worse ... I don't hit 20fps as often :confused:
    But very low 480p is a bit better? I hit as high as 33 with tree sometimes o_O

    I think it's a fillrate issue, it's not just bringing value down, but author everything differently? I can't profile. I would need a test project.
     
  31. jeromeWork

    jeromeWork

    Joined:
    Sep 1, 2015
    Posts:
    426
    A few extra tips and tricks and things to check on the way to that holy grail of a smooth loading open world environment... just things I've come across while continuing the research.

    TIPS and TRICKS and things to check

    Occlusion culling (baked oclusion) is not suitable for large open world environments.
    Use a custom solution for turning objects on/off (InstantOC ?)

    (See: https://forum.unity.com/threads/advice-on-improving-occlusion-culling-peformance.454546/)



    Disable dynamic batching
    • Generates huge amount of GC
      just make sure that all batching is handled explicitly through texture atlases, combining meshes, static flag etc.


    How to smooth the loading of scene

    From https://www.reddit.com/r/Unity3D/comments/976i0n/question_how_to_smooth_the_loading_of_scene/


    TLDR scene activation events can cause lags : loading shaders, Awake/Start/OnEnable (GetComponent) GameObject activation.
    • pre-load shaders
    • use serialise fields to hook-up components (rather than in Awake/Start with code)
    • activate scene objects gradually not all at once.

    “I have had amazing results running the game and using an option in the settings to view the shaders that were loaded for the scene, then building shader groups out of them, then splitting those shader groups into many separate shader groups with only 1 shader in them. Finally, before the scene load in your transition scene, prewarm each shader group over multiple frames while evaluating the time it takes for each one before starting the next.

    Other culprits in the past have been methods like FindAll or GetComponents in Awake/Start when instead having serialized fields with those values where more efficient.”


    “The main hiccup you are seeing is the scene activation. Like said, loading shaders, Awake/Start/OnEnable taking their toll.

    Another thing I found useful is to split the activation of objects across a bunch of frames. So I would have the entire root hierarchy of the next scene disabled, with 1 object enabled that has a script that iterates the root objects and activities then over a period of time. Those in turn can do the same to their children so on as you like. Most of the time you don’t need your entire scene active right at the start, so with careful planning and logical trees you can really get rid of that hiccup.“



    ASSET SPECIFIC

    AQUAS

    From AvivBI on the Gaioa discord #useful-techniques
    https://discordapp.com/channels/423247963457060866/476895863801643016

    Turns off the continuous rendering of water reflections (renders once and keeps)

    Put script on the AQUAS water game object.

    Code (CSharp):
    1. using System.Collections;
    2. using UnityEngine;
    3.  
    4. public class WaterOptimizer : MonoBehaviour
    5. {
    6.  
    7.    public void OnEnable()
    8.    {
    9.        StartWaterReflectionRender();
    10.    }
    11.    private void StartWaterReflectionRender()
    12.    {
    13.        StartCoroutine(RenderReflection());
    14.    }
    15.    private IEnumerator RenderReflection()
    16.    {
    17.        GetComponent<AQUAS_Reflection>().enabled = true;
    18.        yield return new WaitForEndOfFrame();
    19.        GetComponent<AQUAS_Reflection>().enabled = false;
    20.    }
    21. }


    LOD and Mesh Optimisation

    https://account.simplygon.com/
     
    syscrusher, sharkapps and neoshaman like this.
  32. gecko

    gecko

    Joined:
    Aug 10, 2006
    Posts:
    2,240
    Thanks for sharing those tips!

    I'm still waiting for 2018.3 beta in hopes it improves terrain performance and additive loading times....
     
  33. jeromeWork

    jeromeWork

    Joined:
    Sep 1, 2015
    Posts:
    426
    Pretty sure I've read somewhere that it's been delayed (sorry can't find source right now)

    I'd love 2018.3 to be the answer to everything (VS Pro, Gaia 2 GPU version, multi terrain support, etc) but I'm personally still reluctant to jump onto a potentially unstable branch... :rolleyes:

    Mind you, at this rate, it's likely that 2019 is out before I get the smooth loading I'm after :D
     
    sharkapps likes this.
  34. neoshaman

    neoshaman

    Joined:
    Feb 11, 2011
    Posts:
    6,492
    that's great all of that!
     
  35. awesomedata

    awesomedata

    Joined:
    Oct 8, 2014
    Posts:
    1,419
    I must say -- this is a great topic that's been long overdue.

    In fact, I just wrote to say that any other (more subtle) insights that are important to know (but not so obvious) about the process would be welcome too (maybe some tips on creating tiled terrain artwork and other open-world level design considerations).

    I appreciate you guys sharing your journey so far on this stuff. :)
     
    ZenMicro and jeromeWork like this.
  36. TheSwizzler

    TheSwizzler

    Joined:
    Aug 21, 2016
    Posts:
    5
    Has anyone been experimenting with using scene load/unload to achieve smooth streaming of terrain tiles, as well as avoiding the ever-present camera origin issue? Nav meshes can also be baked between different scenes now?
     
    awesomedata likes this.
  37. bazztard24

    bazztard24

    Joined:
    Jan 17, 2015
    Posts:
    6
  38. TerraUnity

    TerraUnity

    Joined:
    Aug 3, 2012
    Posts:
    1,247
    Late to the party but if I may, wanted to show you guys of what we've been come up with streaming terrain tiles and runtime assets placement on them:



    Seamless 1000km journey streaming:



    This & this

    Also we plan to extend our improved version of streaming embedded in our upcoming product, see the development playlist here:

     
    Fibonaccov, Teocuitlatl and sharkapps like this.
  39. kenncann

    kenncann

    Joined:
    Jul 16, 2015
    Posts:
    17
    Hey @gecko I just came across this thread and was wondering how your workflow has evolved since you posted this 2.5 years ago. I've seen the recent work on WolfQuest and it looks amazing so I'm hoping you can give some insight to what changes you made to improve performance with distant terrains and vegetation.
     
  40. gecko

    gecko

    Joined:
    Aug 10, 2006
    Posts:
    2,240
    @kenncann Sure, good idea. Our setup has evolved a bit, but still basically the same idea:

    Terrains:
    7x7km game map, Unity terrains sliced into 8x8 grid, with matching set of 8x8 low poly mesh terrains. We use MIcroSplat for all terrain materials -- it's really fantastic, super powerful, very performant, and so many options. The Mesh Terrains module has a function to batch-create mesh terrains from Unity terrains -- the mesh, the splatmaps, and the MS mesh terrain shader and material. Very slick, and automatically retains all the MS components in the mesh terrain shader so they match the Unity terrains perfectly. (Though I then do make some changes, since we don't need up-close anti-tiling features.)

    The terrain instancing added in 2018.3 turned out to be a huge and essential performance improvement -- I don't know what we would have done without it.

    I also created a larger "Environs" set of terrains for the surrounding landscape (I think it's about 48km wide), which I sliced into a 5x5 grid (for frustrum culling) and converted to MS mesh terrains. It has only four terrain textures (dark grass, light grass, forest, and rock), and has Microsplat material/shader with very few features, mainly just dynamic snow to match the dynamic snow on the other terrains. The low-quality nature of this is a bit too obvious if you go to the edge of the game map, but I haven't figured out how to improve that without hurting performance. (There probably are ways, perhaps with tree billboards on the closest Environs tiles, they would just take a lot of tweaking and performance testing to find a good solution.) And it's also tough to find the perfect settings on each MicroSplat material to get the best tiling and normal map effects based on distance, but also not creating obvious junctures between the mid-distance and Environs meshes.

    Streaming

    For awhile we used World Streamer, loading Unity terrains in a 3x3 grid around the player, and using mesh terrains beyond it. However, we had significant stuttering whenever loading/unloading terrains, which happens pretty often when your player-character can run 35 mph. We switched to SECTR, which was a bit better. I thought that was because it uses a different method for triggering the loading/unloading, so we had fewer terrains being loaded at any given time, it was more staggered, but now I'm not sure about that. The stuttering was still quite objectionable -- but only in our game scenes, not in stripped down scenes with only the natural environment. So we finally dug deep into it, experimented with different theories, and discovered that when loading an additive scene, Unity goes through every single game object in the scene. We did not realize it did that! It's quite fast at this so often isn't a problem, but our AI structure just happens to use a deeply-nested structure, so there were many many thousands of GOs in the scene. Hence the stuttering. So we decided to ditch streaming and have all terrains in the scene. This boosted the memory load by several hundred MB, unfortunately, but was the only solution we could think of. The terrain renderer is enabled only on terrains in that 3x3 grid around the player. (This is also tied into requirements for NPC terrain collision -- we had been using the LOD mesh terrains for that, but NPCs were getting stuck due to the discrepancies between the low- and high-rez terrain colliders. So now the Unity terrain colliders are always enabled, and that doesn't seem to have much performance impact -- it's the rendering that costs you.)

    Vegetation
    We use Vegetation Studio Pro, which has great support for multi-terrain setups. We use Advanced Terrain Grass (ATG) for grass and plants and Custom Tree Importer (CTI) for trees (both of which has special shaders for VSP). We bake the trees and ground clutter into VSP persistent storage, so we have forest cover across the entire game map, regardless of whether Unity terrain or LOD mesh terrain is enabled. (That worked fine with streaming too.)

    Shadows
    I really really wanted to have distant shadows, since they are essential to making a forest look like a forest. Obviously Unity realtime shadows aren't viable, and since we have a dynamic day-night cycle, we can't bake lighting either. I was using the simple Microsplat-VSP shadow technique, but then @tatoforever added frustrum shadows to his Next-Gen Soft Shadows (https://assetstore.unity.com/packages/vfx/shaders/next-gen-soft-shadows-137380) and that was a much better solution. So we have Unity shadows for 50-150m from the cameras, and NGSS frustrum shadows beyond that. Not perfect (offscreen polys don't cast shadows), but a huge, huge improvement to the open-world visuals.

    Sky and Weather
    We use Enviro, which is gorgeous and has easy switching between the main and Lite versions. Also synchronizes dynamic snow and wetness with Microsplat (and UBER, which we were using for some objects like glacial erratics, but have recently switched to MicroSplat's object shader, since the snow with that much better matches the snow on the terrain>0

    Performance
    We set the GTX 1060 as our recommended hardware target, so I've tuned everything to have a solid 60fps on that, and I'm pretty happy with what we've achieved. Of course, many of our players are on weaker hardware, so we have quality levels that let you reduce the usual things (grass distance and density, switch from 3D clouds to flat clouds, disable some post processing). But VSP, with its compute shaders, just doesn't perform well on integrated graphics, so we ended up creating an alternate "Basic Graphics" mode for low-end hardware. This switches from Deferred to Forward rendering, switches to Enviro Lite, disables PPV2 (and enables a simpler Amplify Color LUT on the camera), and most importantly, disables VSP and enables Unity terrain trees and grass. We wrote a script that reads the VSP persistant storage package and places trees on the terrains in exactly the same spots (necessary so trees in both systems align, to avoid weirdness in multiplayer), and used Terrain Composer to paint grasses based on terrain textures. I get 35-50fps at 1920x1080 on an Intel 630, which is our minimum hardware requirement, though we know that many of our players somehow manage to enjoy the game on even weaker hardware.

    Here's the game trailer from the second episode, which we released about two months ago:


    (WolfQuest is a realistic wolf simulation game, set in Yellowstone National Park and drawing on the latest scientific knowledge about wolf behavior and ecology. We first developed it in 2006-2010, initially using the beta of Unity 2. For some years it was a free game, with funding from the National Science Foundation, but we for the past four years we have been remaking it as much bigger game with a vastly more sophisticated eco-simulation and gameplay.)

    So that's what we've got now. But the story isn't over, as we have to figure out how to optimize all this further for mobile....sigh....

    cheers
    Dave

    P.S. Oh, and we are on the built-in pipeline and plan to stay on it for as long as we can, because it's hard enough to make a game without dealing with ever-evolving SRPs....
     
    Teocuitlatl, awesomedata and kenncann like this.
  41. kenncann

    kenncann

    Joined:
    Jul 16, 2015
    Posts:
    17
    @gecko , thank you so much for the lengthy update this was really insightful. I've been facing some similar issues in my map (my playable area is ~5x10km, but my 'environs' encompass an area of ~28x42km, my project is similar in modeling a real world area where landscape fidelity is important) so it was great to see some advice in managing the large maps. One follow up question I have to all this is how you're handling your lighting especially with regards to the day-night cycle. I've been unsure to what extent I should bake my lighting or how much I can keep dynamic with such large terrains (mainly with respect to shadows cast by mountains).

    I had some other minor questions and thoughts I just wanted to call out:
    - Regarding your original post where you talked about using world composer, did you run into any issues building rivers in your terrain after using that tool? I haven't used that tool because I was more or less able to do the terrain work on my own by using GIS data to create a mesh then turn the mesh into a terrain with a a mesh to terrain tool. With my method though I had to raise the overall height of the terrain so I could dig into it with RAM by NatureManufacture (which fortunately the mesh to terrain tool provided). I think I saw a video on youtube where you or your team demonstrated some added advantages of using world composer's data with terrain composer to map out your textures so I'm definitely interested in the products for that purpose but I'm worried about other issues I might encounter.
    - Is there any advantage to using microsplat's mesh terrain tool over world streamers low poly terrain tool? They sound like they do the same thing but just want to make sure I'm not missing out on anything.
    - Speaking of world streamer I'm amazed at the option to ditch streaming! I'm fortunate in not having a player that is running 35mph but I may try out that option as well.
    - You've pretty much sold me on enviro. I was in between Enviro and Tenkoku but the added integrations of Enviro are a major plus.
    - I'm definitely interested in NGSS. I came across another thread earlier in the week where I think tatoforever shared a demo of your team using it and it blew me away, when I saw this thread I knew I had to ask how else things have evolved.

    Thanks again for the big write up. I know I learned a lot and I hope others do too
     
  42. gecko

    gecko

    Joined:
    Aug 10, 2006
    Posts:
    2,240
    Glad it's helpful!

    We use entirely realtime lighting (via Enviro), without GI. (As far as I've been able to glean, there really isn't a good GI option for a large open-world with dynamic lighting. Unity documentation and tutorials seem to overlook this use case entirely, which is extremely frustrating.) NGSS's frustrum shadows (mostly) satisfy the need for far-off shadows from mountains and such.

    I ended up using RAM for all rivers and creeks. (The topo data is way too low-rez for this kind of topographical detail.) RAM has some quirks but it really does have all the functionality you need: creating river splines, carving the riverbed, and texturing it. The only thing I don't like is that when carving, it tends to raise the terrain around the riverbed, which means you have a strange dip beyond the riverbanks, which is obviously unnatural. I need to experiment with those settings more to see if I can prevent that. (I tried Gena Pro recently but it doesn't have the texturing function, which is kinda bizarre for a river tool.) The main problem I have is that the terrain heightmap resolution is about 1 pixel per meter, which makes it very hard to have a nice, smooth creekbed for a creek that's only 2m wide and half a meter deep. It's hard to avoid some sharp ups and downs in the creekbed floor when making a winding creek, so I duplicate the creek water mesh and move it down .5m and disable the mesh renderer so it acts as an invisible "floor" to the creek. With the water shader (I use Lux Water, which is fantastic), you can't really tell that there's an invisible floor.

    I did all this before WC added that low poly tool, but I am definitely sticking with MicroSplat because it generates the splatmaps and MS mesh terrain shader/material.

    Well, I'm not proud of that solution, since it does increase the memory load, so I would suggest you consider it only if you had particular issues with streaming like we had.

    I *think* that Enviro is more performant, though that may only be because Tenkoku comes with all the bells and whistles enabled. I tried it five years ago and thought it was beautiful, but it lacked a few things at the time (can't recall what) so then I tried Enviro and stuck with it.

    cheers
    Dave
     
    kenncann likes this.
  43. kenncann

    kenncann

    Joined:
    Jul 16, 2015
    Posts:
    17
    Just so I understand, when you say without GI you mean you turned off both GI settings in the lighting settings as follow, right?
    upload_2021-2-21_23-17-28.png

    Regarding this, if I'm understanding you correctly then I think I had a similar issue and I had to play with the curve a lot in the "Terrain carve" settings. The key was to pull the carve out more towards the water since the water wasn't meeting it by default. Either that or maybe it's like I was saying and you can't carve any lower and so the banks are raising to give the river some depth.
    upload_2021-2-21_20-18-19.png

    I've had this problem too, particularly with carving roads on a mountain, essentially anything less than 1 pixel per meter results in a lot of issues with terrain cutting into the road. Unfortunately the tradeoff with detailed terrain is it has been causing me a ton of issues with lighting the scene which is the main reason I have questions about that.

    I have a follow-up question to regarding how you cut your main terrain and 'environs' (how you said the main area is 8x8 and the environs are 5x5). As I mentioned before I implemented my terrain myself, I render it in blender and actually do the cuts there as well. Unfortunately my cuts are basically a grid like system and it seems like it would get messy for me to experiment with breaking and recombining parts of the grid there. Does world composer or another tool allow you to do this while you're building your terrains? Are there tools that are letting you subtract the main area from the environs and then smooth the seams together or are you doing that manually?
     
  44. gecko

    gecko

    Joined:
    Aug 10, 2006
    Posts:
    2,240
    That's right. My understanding is that Realtime GI requires baking, which isn't feasible with a huge map like we have.

    Right. I've also tried increasing the modification distance on either side of the river, and that's what I want to experiment more with, making that larger might help?

    I don't know if it's possible to recombine terrains once split apart. I have resplit and replaced the terrain tiles on a number of occasions after making changes to the terrain, but AFAIK it's a one way procedure. There are some terrain stitcher tools that I've used in the past to rejoin seams, but lately I just use Unity's smoothing brush, which works quite well.

    Oh, but for seams between the main terrain and environs? Yeah, that's a problem, since the environs are much lower poly than the main terrains. So I've manually moved the inner edges of the environs terrain down, so they are lower than the edges of the main terrain. Klutzy solution, and there is probably a slicker solution if you plan for it from the very beginning and retopologize the environs terrains so they are higher poly where they meet the main terrain...but I'm not that smart.
     
    kenncann likes this.
  45. kenncann

    kenncann

    Joined:
    Jul 16, 2015
    Posts:
    17
    Sorry I know my question was pretty wordy and not very clear, this is mostly what I was asking. I think I was trying to ask if you generated the main area and the environs all at once, or if you generated/worked on them separately (like first game area then generated environs around it). But I actually just went back and looked at world composer again and it looks like it allows you to generate huge multi-resolution terrain so it looks like that answers my question for how to do that. I'll definitely have to try it out since I've been struggling to optimize this myself bouncing between blender and unity.

    I actually don't think this is really that bad, I haven't tested out world streamer myself but I've watched their videos and you can see in this video (timestamped around 21:45) how they kind of extend the edges around their terrains to try and hide the gaps.

    Thanks for all the advice! I hope you're able to fix your river problem. I have played around with the smoothing distance a bit but as the name implies it definitely makes things smooth haha
     
  46. gecko

    gecko

    Joined:
    Aug 10, 2006
    Posts:
    2,240
    Yeah, that's it exactly. If I were smarter, I would have done the entire area initially, at high resolution, and then downsampled the environs. But....I didn't, and had to muddle through the consequences. But I will be making another game map in Yellowstone in a few months, and this time I'm gonna try doing it that way. (Though the lower resolution of the environs will still necessitate some tweaking, I'm sure.)
     
    kenncann likes this.
  47. gecko

    gecko

    Joined:
    Aug 10, 2006
    Posts:
    2,240
    Would love to see how yours is coming along!
     
  48. kenncann

    kenncann

    Joined:
    Jul 16, 2015
    Posts:
    17
    I don't have much because I've only been at this for about a month and half of the time was me messing around with various GIS data sources. Here's a screenshot I took recently with a reference to what I'm trying to recreate:

    Reference image

    This is an older image I took but I created these meshes in blender too to help me guide splines for rivers, trails and roads (planned explorable region will mainly be the mountain range but it actually goes back a lot further than what's shown here):

    It's not much and definitely a work in progress but hopefully I'll have more to share eventually!
     
    Last edited: Feb 24, 2021
    gecko likes this.
  49. fendercodes

    fendercodes

    Joined:
    Feb 4, 2019
    Posts:
    191
    This seems like a great thread. Thanks for all the detailed information. I've got so many questions, but I'll start with just one. What is a good way to create a very large terrain heightmap that will cover 20km * 20km and have diversity in elevation (e.g. large mountains in one part, flat meadows in another, rivers, lakes etc)?

    I've been playing with Map Magic 2 for a few days and couldn't seem to get much variation in the elevation. I even tried importing LIDAR mapping data via the Import node and whilst it does work, I just couldn't parts of it to raise up high enough whilst keeping other areas relatively flat. I think I managed to get a 400m high mountain and some flatter areas but ideally I'd get to about 1.5km mountain peaks.
     
  50. TerraUnity

    TerraUnity

    Joined:
    Aug 3, 2012
    Posts:
    1,247
    Guess TerraWorld would do justice in this case! https://assetstore.unity.com/packages/tools/terrain/terraworld-automated-level-designer-156561