Thousand ships, Unreal Engine 4 with NVIDIA WaveWorks

I made this real-time ocean simulation with one thousand ships.

Read more about it on my blog.

UPDATE: NVIDIA wrote about it on their blog.

Running at 1920x1080 with 133% render target (screen percentage). Graphics settings are all on Epic.
Runs at: avg. ~45 FPS, min. ~30 FPS, max ~ 60 FPS.

Made and ran on this machine:

Motherboard: Z97-DELUXE(NFC & WLC)
PSU: Cooler Master “V Series” V850
CPU: Intel® Core™ i7-4790K 4.6Ghz
CPU cooler: Hydro Series™ H100i Extreme Performance
RAM: G.SKILL Trident X Series 32GB (4 x 8GB) DDR3 2400 Mhz
SSD0: Samsung SSD 850 PRO 256GB
SSD1: Samsung SSD 850 EVO 500GB
HDD: WD Green 2TB
CASE: NZXT. Phantom 410 Black

Created while additionally optimizing engine for VR.

How well does it run on VR?

Also, is that launched from the SSD?

This exact scene with the same settings in VR runs avg. at ~30 FPS, max at ~40 FPS and dips a few times (sun rise/set) to 19 FPS as the light shafts are a real GPU bottleneck here.
However, I never set my VR games to epic settings as not all are a win (quality & immersion wise), so turning those few GPU quality settings down results at it running at about avg. ~40 FPS,
and you don’t want to hear 40 FPS and VR in the same sentence right :slight_smile: but it’s really my CPU here that caps the frame rate and so we get a very similar result with or without VR.
I do actually like to look at it in VR, async timewarp works marvelously, and the scale of the scene is pretty giant so you don’t really notice the translation errors when moving you head around.

Yes, from EVO drive.


Do you adress to large maps having translation issues due to single point precision or?

Ou, no, sorry for not explicitly stating, I was speaking about async timewarp fixing rotation when under headset refresh rate, so that it feels smooth along those 3 axis, but since it only works on rotation and not translation, you do notice fairly fast, especially in small areas that rotation is smooth but translation is not, but here you don’t notice it as much, because of the big open world scale of the scene and that makes it surprisingly solid VR experience.

Wow, well done!

Posted your work at my blog :slight_smile:

Awesome thanks! I’ve also added a link to my blog post in my original post, where you can read more about it.

I was just reading through the blog. Really nice!

When you say 95% percent of the time you are bottlenecked by the CPU, then is this with the out of the box UE4 multithreading that uses ~ 1 1/2 cores maximum?
Or is this with all four cores maxed out with a custom made thread manager?

Also, does the CPU load scale linearly with the number of ships in waveworks? (10 ships need only 1/100 CPU than 1000 ships)

Overall, this is very cool!

Sorry for a delay, was at a conference last two days. Thank you, glad you like it! It’s with UE4 multithreading, so CPU usage is not maxed out, it just becomes a bottleneck in a game. I could push for more, but my goal was really to get to a 1000 ships, so I really didn’t see much point in taking a few days more to hack something like that together and then make it lets say 3000 if I was luck not to hit other problems (unlikely), I was thinking that if I could go 10 000 it would be worth it but didn’t really see a realistic way to do it at this time. You could use tricks like, the ships at the distance ticking at a lower rate and maybe get relatively close and no one would even notice (you would start to hit other bottlnecks soon as well), but I tried to avoid that so that the whole project is clearer and easier to understand, every ship is the same in every aspect. Also the surface area is getting pretty big so you wouldn’t really notice that many more ships on the screen when looking at the horizon; you could say that from that point of view we are close to the point of diminishing returns. :slight_smile:

Yes it does scale pretty linearly, for WaveWorks we would be talking in a context of readback for ocean surface, very efficient.

It is true that with 1000 ships you are already at a point where 3000 ships or more would not make much difference to any gameplay.

In your fps listing in the first post, are you gpu bound or cpu bound?
If it is not too much work and if you find the time, can you check the following with the stat unit console command to get game thread time (and cpu usage, i.e. cores used), draw call time and gpu time

  • only ocean, no ships
  • only ocean calm waters
  • only ocean rough sea
  • ocean and 10 ships
  • ocean and 100 ships
  • ocean and 1000 ships

It would be great to get a feeling how game-ready such a WaveWorks integration, i.e. some detailed performance figures.

Mate, c’mon, cards on the table: how much of the cpu bottleneck comes from the ocean and how much from the ships? Is the ocean any usable the next 1o years if it clogs up your i7 processor or is this just some academic exercise? How taxed out would he i7 be with just the ocean and 10 ships? Still bottlenecked, I suppose…

Sorry, haven’t had time to get all the info for you, don’t want to make any promises that I will, we’re shipping a game with this tech in 3 weeks so that’s really my only focus right now, hope you understand.
The ocean is pretty cheap if we’re talking about the visuals and readback of the displacements, expect to pay something like or less than 1.0 ms for it, modern CPU & GPU wise - depending on how you use it and you do have 3 detail settings in the API.
If you look at the official NVIDIA docs they list GTX 680 running at 1.0ms (high detail) and Core i7-2600K running at 1.1ms (normal detail) and I can confirm that.
In this case the CPU is bottlenecked by the buoyancy, that really has nothing to do with the WaveWorks itself (it uses the displacements data and that’s it), you have to implement that on your own.
WaveWork is design for real-time applications, especially games, but you can use it for whatever you want. I’ve uploaded NVIDIA’s WaveWorks PDF to my Amazon drive for you, it’s a pretty interesting read!

EDIT: no if you would have 10 ships it would have been linearly less taxed, at least in my buoyancy implementation. So 10 ships si super easy on your CPU, no problem at all, something like 1.2ms for everything, ocean and ships.

got it, thanks. Please post the game here as soon as possible!

No problem, will do! I’ve edited above post, added a bit of info, good luck!

Thanks! the low cpu load info was what we needed! Good luck with game!

HI! guys…

os : windows 10
unreal engine version : 4.17 with waveworks

I made package by shipping version of WaveworksTester sampler project.

Package is success!! But when i execute program, program is crash.


What’s wrong?

My work.

  1. unreal engine4 download from git hub.
  2. engine build
  3. waveworks test project in engine open
  4. made package of shipping version.
  5. execute program.

It is all of my work!

Help me please!