Open 3D Engine
o3de.org
o3de.org
This makes little difference for the hobbyist gamedev, but it has ramifications for large projects with many interacting systems. Proper ECS architecture better supports the latter case [3].
[1] - https://docs.o3de.org/docs/welcome-guide/key-concepts/#the-c...
[2] - https://godotengine.org/article/why-isnt-godot-ecs-based-gam...
In "Entity Component" systems (think Unity), entities own components that give them data and behavior.
In "Entity Component System" systems (think Unity DOTS), components are just data, and behavior is driven by systems that live outside entities.
They are similar in some aspects and both are radically different than a deep OOP hierarchy, but ECS is quite more hardcore on decoupling. It's been a few years and it's still not unanimous whether adopting Unity DOTS over regular Unity is easy or even worth it, for instance.
Still, Godot isn't very OOP either, working mostly with composition of behaviors.
> In "Entity Component System" systems...
Something something Douglas Adams.
I know Entt is a highly praised library, but I'd be interesting in folding in ECS as a general design pattern in my programming.
ECS was popularised with http://enwp.org/Dark_Engine in 1998. The architectural style probably existed already earlier, but I have no evidence I can point to.
Perhaps it was confined to some part of the engine? ECS didn't come out of thin air after all, it is a generalization of practices people already used for things like particles, etc.
Edit: that’s a great witticism though.
https://metacpan.org/dist/Moose/source/lib/Moose/Meta/Role/A...
https://github.com/rakudo/rakudo/blob/master/src/Perl6/Metam...
Reading the source codes, I think this is due to no one yet having requested the ability to do so. To me it feels like implementing this is possible, but tedious.
The simple work-around for the problem would be to rebless the instance. Example:
class Structure {}
role Floatable {}
role Inhabitable {}
class Houseboat extends Structure with Floatable with Inhabitable {}
$hb = Houseboat new
$s = Structure new
$s apply Floatable, Inhabitable # houseboat at run-time
# stop swimming
### NYI
### $s unapply Floatable
# make a new house that cannot swim
$s1 = Structure new
$s1 apply Inhabitable
$s1 = $s rebless_into $s1In Raku speak:
my $house = House.new;
my $houseboat = $house but Boat;
See: https://docs.raku.org/routine/butThere would be no need to de-compose.
var id = ecs.createEntity() // returns an int
ecs.addComponent(id, 'house')
ecs.addComponent(id, 'boat')
So, very different from the class-based approach being floated a few comments ago. Does that answer your question?Instead one can use `does` to mix in to an existing entity:
role House {}
role Boat {}
my \id = 42;
id does House;
id does Boat;
say id ~~ House; # True
(What's missing is the ability to drop a mixin once it's been added via `does`.)https://godotengine.org/article/why-isnt-godot-ecs-based-gam... (see "Optimization" section and below)
This is an example of survivorship bias. How many ambitious game concepts have collapsed under performance/architecture issues that lead to productivity-killing refactoring? Impossible to say, but no doubt many.
> Arguably, ECS makes it harder to incrementally build a game by adding features, because you need to put more effort into designing the data layout upfront.
OOP bakes these decisions into the inheritance hierarchy, which ends up being more thorny than adding a component, or migrating an existing component's schema. ECS will make it straightforward to determine which Systems will be affected when a particular Component's schema is altered.
True ECS systems - and not frameworks that just have things called “entities” which own things called “components” - are hard to work with, almost by definition (ie you have to be very explicit about data layout and dependencies). They add a lot of friction upfront to solving the important and hard problem(s) while purporting to solve something that isn’t actually an issue in most cases (guess what, your N is likely < 10, modern cpus go brrr, etc). If you are working in a domain where you already know something about the performance and input size characteristics - particle systems are the go to example - then maybe ECS makes sense as a framework. Otherwise, I’d advocate for simpler oop approaches with heavy composition.
My experience has been completely the opposite to this. In fact being explicit about data layout and dependencies is a hallmark of a OOP rather than ECS.
In compiled languages the dependencies in object hierarchies are fixed at compile time and can only support tree designs, so you have to plan ahead for all possible combinations to even build relationships with OOP, even with composition (because its static).
With ECS everything is decoupled so you can write a system that does X and it affects nothing else.
This leaves you free to design by isolated processes rather than by code structure, and entities naturally do whatever processes their data supports dynamically.
Makes iterating designs incredibly rapid and offers design options that are convoluted and fragile with OOP such as completely changing what an entity does at run time.
For instance you can move the keyboard input component from a player entity to a monster or even something as random as a building and it just works - you didn't have to design for it, you don't even need to change any code. Remove the health component, now the entity is invincible, remove the gravity component and now it can fly, add a homing component and now it seeks a target. All this is trivial and can be done at run time. Want flying flaming lampposts the player can control? Just combine the appropriate components. Need to drastically pivot the design? Vastly less work than OOP - sometimes just a case of changing the data in components or their combination in entities without touching systems. Don't need this flexibility? Still gives you a more modular and less coupled design.
As a nice bonus this flexibility comes with more cache friendly performance than static hierarchies to boot.
ECS is one of the better examples of something that sounds good on paper but in practice, and crucially in production, doesn’t provide the sort of benefits that outweigh the friction it imposes.
There seems to be a myopia online around things like ECS, data oriented programming generally, writing games in C (as opposed to that horrible high level monstrosity C++…), optimization, etc. Those are all fine things in and of themselves (though I’ve never understood the opposition to C++ as anything other than nostalgia), but they are often discussed without being ground in the considerations of building a game. If you want to build a tech demo, great! However, the needs of building a game with hundreds of people, most of whom aren’t engineers, and to a quality/production level that even “simple” things become complicated, demand other things take precedence. I lead a team that facilitates a creative project, not to satisfy my technical desire to have optimal cache or thread utilization in every piece of code. The right tool is the one that gets you closer to the creative goal, and for gameplay code most of the time it probably looks like what Epic or Unity are shipping with their entity frameworks.
And that doesn't mean OOP is definitely good at the authoring task, either. It just happens to be good at kicking the can down the road and letting things work inconsistently, which may be correct in a prototype when you don't know if you're actually shipping that feature, and only poses an issue if you've tied the authoring to the runtime implementation in a deep fashion. Godot doesn't assume this; while it does have hierarchical relationships of objects, it has some boundary points with respect to reuse(scenes and scene instancing) that make the path of least resistance be to make separate authoring and runtime versions of entities, with one spawning the other.
Probably less than you think. The games industry knows how to wring performance out of hardware. Data oriented design is common in most game engines where it matters. It’s just it’s not usually the gameplay code that is particularly a bottleneck.
There are also plenty of examples of games where the gameplay layer is a perf concern that not only have been released but were big sellers. For example Factorio and City Skylines. It’s just I’m those examples it makes more sense to worry about data model and access patterns for the actual problem at hand rather than try to generalise it with all the attendant problems that causes. Not least slowing down workflows when you don’t actually need it.
Most game engines are also composition based rather than using much inheritance these days.
I'm reminded a bit of Minecraft, whose infinite and completely mutable voxel world was really novel at the time -- and which was (and maybe still is) the source of a lot of performance woes.
This is what I don't understand about OOP haters. Inheritance is an optional feature. In fact most ECS frameworks are in OOP languages.
You can't implement ECS on top of EC, but if it's possible the other way around, Godot's argument that most people won't need it would seem a bit weak — just let them use fat components on top of an ECS core, and if/when they need the performance there's still room to push it without side-stepping the whole engine.
I’m currently writing and designing a serialization/networking library that I’m using to build an ECS framework on top of regular Unity EC. Why not use dots? Well, I hate the restriction of using only blittables for component data, I want to have access to the already existing ecosystem of Unity packages, and the biggest is that I am designing it for networking first. It’s slow going (I’m a dad and I have a full time game dev job), but I’m making good steady progress. My serialization library currently features composition, quantization, no reflection, and no garbage collection. I plan on releasing the first version under the MIT license hopefully in the next couple months.
I have a prototype that I’ve been building to test my stuff. Check it out it’s only 30s. https://youtu.be/p4v3ZnS2KBM
If you’re interested in the subject of physics and netcode I’d recommend: https://gafferongames.com/post/introduction_to_networked_phy...
If your want a very deep dive and very technical, I’d recommend: https://fabiensanglard.net/doom3_documentation/The-DOOM-III-...
A lot of good resources at the bottom of the pdf too.
Now learning Godot to be able to quickly learn.
Hearing about ECS gives me hope.
It's just replacing one word with a similar one but makes a world of difference in clarity.
Entities in Unity are already not concrete implementations (probably just a "handler" ID) as far as the user is concerned. This is pretty much like ECS.
But as an Indie dev it gets the job done for me.
I feel there is a lot of cool stuff you can build in the space of building shapes using constraints. Like visual programming languages made to visualize mathematical relationships using geometry.
However what you’re talking about sounds important as well.
I think the problem is exactly that. A good constructive solid geometry (CSG) is a difficult thing to make and there are no open source alternatives to the ones powering the mainstream CAD packages.
Is there an actual issue with the freecad codebase? It has always seemed relatively functional.
It's also slow, onshape in my browser beats it at roughly everything.
If the CAD project is big and serious, I would be afraid of eventually hitting some limitation of the game engine that is hard to work around due to such different assumptions.
I work on an application that uses the geometry kernel from PTC (GRANITE) for modeling and OpenSceneGraph for display. I'm a little worried about OpenSceneGraph because it's 100% OpenGL which feels like it's at the end of it's life and we need to find something built on Vulkan or Direct3D for the future.
https://web.archive.org/web/20041120092542/http://oss.sgi.co...
Edit: Oh, and Godot already supports all the major platforms right outta the box. Bonus! Totally in favor of another open source 3D engine tho. Can't be a bad thing to have more options available in that space.
For example:
- the ECS and DOTS models in Unity feel way better to work with as a developer, since components can be freely attached to GameObjects to give them behaviours vs the node based structure of Godot, where each object can only have one attached script (though their approach to everything being a scene feels better than prefabs in Unity)
- the support for IDE integrations, such as JetBrains Rider giving code hints about certain API methods being slow, as well as other API things that can sometimes slip by, seems really useful to have in Unity; furthermore the C# API being the primary one feels way more usable and documented than Godot's efforts to add C# support (which, while a great idea, still needs a bit of work to be fully mature)
- Unity also seems way better when it comes to importing assets, such as Blender scenes directly into it, without having to export to Collada, glTF or another format, or having to install a separate exporter for Blender as a plugin which may not be supported in future versions
- on that note, there are also a variety of useful solutions built into the engine, such as light mapping, navigation meshes, pretty optimized occlusion culling, LODs (which i'd say are critical for any larger project, or game genres like RTS) among others, which are either missing from Godot entirely for the time being, or which will need to be installed as separate plugins (like terrain editing functionality, for example)
- the support for a variety of tools and other integrations is pretty great in Unity, thanks to the asset store - for example, if you'd like to automatically generate the aforementioned LODs, then you can just get https://assetstore.unity.com/packages/tools/utilities/poly-few-mesh-simplifier-and-auto-lod-generator-160139
- furthermore, the amount of tutorials and materials for Unity is still probably a bit larger than Unity, as well as its market share will be hard to content with for at least a number of years
That said, Unity also lacks in some other areas, such as there not being a decent networking solution at the time, DOTS not being fully finished, the render pipelines being a bit messy to work with (while there are benefits to using URP and HDRP, it's a bit like the Python 2 vs 3 situation with support varying), as well as Unity just generally trying to implement a whole bunch of functionality that's not exactly production ready. Also, their reliance on Unity Hub doesn't feel like a good sign and it feels like a larger and larger part of their offerings will be cloud based, which is understandable from a business perspective, but also concerning.I do hope that Godot gets support for the things that i've mentioned that are missing and perhaps even gets things like networking right, rather than going the path of Unity and jumping around various solutions.
Just my 2 cents on those engines, both seem pretty usable!
Also, if anyone wants another C# engine to look at, consider Stride ( https://stride3d.net/ ) or NeoAxis ( https://www.neoaxis.com/ ). Or maybe if you're more into Java, look at jMonkeyEngine ( https://jmonkeyengine.org/ ), which seems underappreciated but nice. Or just look at the "Gamesfromscratch" YouTube channel, which i personally use for keeping up with this stuff: https://www.youtube.com/channel/UCr-5TdGkKszdbboXXsFZJTQ
Turns out that Godot ended up auto-importing my Blender models with pretty much zero hassles (drop 'em in a project folder, save 'em back out as a Godot scene), and it was a short time after (under an hour, including the time it took to read some docs to familiarize myself with GDScript) I already had mouse/controller clicky code attached to them and a first person camera controller in place. Since then, the more I learn about Godot the more I enjoy workin' with it, pretty much like my experiences with Blender. :)
Of course a large part of my affinity for Godot could be influenced by my love of Python and the similarity of GDScript to Python code.
I wanted to try Godot for the simplicity, and the ability to use Rust at a later time to experiment with.
https://godotengine.org/article/why-isnt-godot-ecs-based-gam...
I'll wager that if O3DE sees an actual release with real documentation, it will herald a new generation of ambitiously-scoped games that actually realize their ambitions instead of crumbling under OOP-induced technical debt.
Besides that, games have an (un)surpring level of coupling between entities. Even a simple, few hundred lines game, is a tangle. The ECS designs decouples the entities, which is a very significant design improvement.
What has been done in the past is not really indicative, as ECS is relatively new (in the grand scheme of things).
Something that can be said though, is that ECS is frequently considered overkill for small projects.
On the other hand, most of the games have somewhat-throwaway code, so the code design may not be so important indeed (VVVVVV was for example discussed on HN).
edit:
> It's definitely not - it's a complete rewrite, with some useful parts of Lumberyard ported over.
Now they changed strategy to compete with Epic's Unreal by making the engine actually royality-free and open source. It's very logical step that to compete with source-available product you need one under proper open source license with patents grant.
As a long time industry veteran: the important portion is how the asset pipeline works and whether I can port existing assets or acquire new ones.
Assets are all that matters.
For once there is chance that Amazon is big enough to make porting to consoles less of a pain in the ass.
Dumb.
From https://aws.amazon.com/blogs/gametech/open-3d-engine/
> The core engine modules and any add-ons or plugins are collectively known as “Gems”
So, so dumb.
No, not really. Besides a bunch of video guides, there's barely anything that you can read. Highly disappointed with the launch, maybe it'll pick up later..?
For example: https://o3de.org/docs/api/frameworks/azgameframework/class_a...
I will say that the thing that was most annoying about the videos I could see was that they were out of date. You had to install a previous version of Unity if you wanted to load the assets that the course used.
> O3DE requires Windows 10 64-bit (versions 1809, 10.0.17763 or later)
https://o3de.org/docs/user-guide/platforms/linux/
(PS: not being coy, just confused by conflicting documentation)
> Implemented support for Windows, MacOS, Linux, Android, and iOS editor and runtime builds
Perhaps the documentation stating that Windows is required is merely out of date?
[0] https://o3de.org/docs/release-notes/archive/2107-1-release-n...
I'm only drawing this conclusion based on the announcement article and video - maybe I'm missing something.
It was also very slow at doing so, although, without technical knowledge, it's hard to know whether this was actually inefficiency.
I find it very ironic that Crytek's evil geniuses very successfully managed to market low framerates as a feature. /shrug
https://venturebeat.com/2021/07/06/amazons-lumberyard-become...
But it's getting less and less every day.
I've had the opportunity to work with O3DE over the past few months at work and I'm very excited to see where it goes.
There are two pieces of context if you don't work in the games industry (when I came in from an 'open source' background these surprised me):
1. the best game engine tech in the industry is proprietary (the biggest players are Unreal and Unity, lots of studios have purpose-built ones), there's relatively little open source [0]
2. in a games studio, the workflow of your company orients around the workflows of the game engine [1]
These two things combine in quite unfortunate ways, to the point where EA mandated the use of its own in-house engine...with mixed results so far [2][3]. Smaller players have three options: a) suck it up, b) use an open source alternative (i.e. Godot), c) get caught in the tarpit of "build your own engine"
O3DE has an opportunity to shake things up - particularly because of how modular it aims to be. At Hadean, our interest is in the networking layer (to drop in as netcode for Aether, our distributed simulation engine) as well as the 'core' simulation layer (to integrate with Aether in order to scale O3DE games/simulations across multiple machines). While doing all this, we will probably 'get involved' and contribute, so that our usage doesn't drift too far from mainline.
Anyway, this is all very early days - it's just a developer preview, and the flows are a bit rough. It'll be a while before we see if this changes things (I'm hopeful!), but major credit to the people at Amazon who have made it happen so far!
p.s. a checkout with deps, plus fresh compile of O3DE, plus a new project that you've opened once (to process assets) will set you back 100-150GB at my last check - not unexpected if you're used to compiling Unreal!
[0] https://twitter.com/ID_AA_Carmack/status/1406427706980454406
[1] https://isetta.io/interviews/AmandineCoget-interview/#the-mo...
[2] https://twitter.com/kingcurrythundr/status/10837887204599726...
[3] https://screenrant.com/anthem-frostbite-engine-development/
I don't recommend this to the general user or game dev though. Most people just want to create their game. I want to do that and have the control. Yeah, I can't make AAA engine by myself, but then again even if I could the assets for a AAA game are staggering. I think the industry should actually pull the reigns a bit on these enormous budget pieces of entertainment software for it's own good and scale back a bit, but anyways, that's another discussion.
As for Amazon and this initiative I wouldn't touch it based on principle since I don't want to support Amazon and their business practices.
Are you also not using Linux and other open source software that Amazon contributed to?
This is real open source project now without CLA attached. Any company can fork it and do something nice with it.
I think this ultimately depends on if you want to ship or not. I think Unity is the best option for most people due to its ease of use. But I also respect wanting full control, sometimes Unity feels like a magic black box.
Best pray the black box does what you want.
Correct. OpenGL, Vulkan and libs like SFML, SDL, Allegro are some of the choices that people like me use. Of course there are million media frameworks with bindings for a lot of languages. You can do whatever you want really.
And I'd agree with you. I think of the 3 engines I wrote about in my original comment Unity is by far the most painless to work with and I like the UI of the engine itself the most.
Famous last words.
"We [at AWS] invested over a year to recruit partners with the right mix of resources, expertise, and above all, motivation to foster a self-sustaining community. We partnered with Linux Foundation as our trusted expert open-source organizational home because it stands as one of the best on the planet at managing large open-source projects. The Linux Foundation can provide the level of expert management demanded by such a large open-source effort. We are thrilled for the backing of a range of partners who feel just as strongly as we do about empowering choice for games and simulations developers. These partners include: Accelbyte, Adobe, Apocalypse Studios, Audiokinetic, Backtrace.io, Carbonated, Futurewei, GAMEPOCH, Genvid Technologies, Hadean, Huawei, HERE Technologies, Intel, International Game Developers Association, Kythera AI, Niantic, Open Robotics, PopcornFX, Red Hat, Rochester Institute of Technology, SideFX, Tafi, TLM Partners, and Wargaming." [1]
The shader language is called AZSL, short for (I kid you not) the Amazon shader language.
If you really care about attracting partners, maybe don't put your brand name in the programming language?
"Besides Amazon AWS being involved with the Linux Foundation's new Open 3D Foundation, other notable vendors involved include AccelByte, Adobe, Apocalpyse Studios, International Game Developers Association, Niantic, PopcornFX, Red Hat, and Wargaming, among others."
Does this means linux gaming improving beyond steam/proton?
[0] https://www.phoronix.com/scan.php?page=article&item=open-3d-...
If a big company is going to adopt your engine they want your main incentive to be making it the best engine possible, not selling you more SaaS integrations.
Unreal, Unity, CryEngine, Frostbite etc. have shown that they are tools capable of supporting huge productions. This means that the engine teams have invested a lot of work to remove a lot of barriers that the game teams ran up against when scaling their productions up. New users now get to profit from that when they start out on one of these engines.
As far as I know, Godot hasn't been thrown into that particular gauntlet yet (please correct me if I'm wrong here!). From experience with complex projects like this, I can tell you that you will always find new bugs when you stress them in novel ways. For a game production, this means that you take on a higher risk that you need to dive into the engine and bend it to your will, costing engineering resources.
My understanding is that you can create AAA-level 3D games with O3DE.
The way I see it is Godot is an alternative to Unity, O3DE might be an alternative to Unreal.
Native games, downloading 50meg to 50gig is before you can play is not uncommon. Web games you probably want to keep under 1-2meg (just a guess). Of course you can try to use an engine designed to make native games but use small resources but, AFAICT, most of those engines, just their code, is already too large to really be a web game.
I know Unity was trying to make a smaller runtime for web games but since shipping a few demos a few years ago I haven't heard much about it.
If you can fund and build a huge skilled team for about five years, you can still catch up enough to cover some game genres competitively and expand from there. But how do you recoup these costs in a market that is now clearly in a race to hit rock bottom?
How so? Unity revenue is north of $500B a year, and I'd expect Unreal Engine to pull similar numbers for Epic annually.
If anything, as the gaming market expanded, these companies have made serious footholds in the revenue stream.
Epic (total) is in the ballpark of around $5B, but the engine alone - I estimate - around 1-5% of it, so also around $50M-$250M.
[1] https://investors.unity.com/news/news-details/2021/Unity-Ann...
Is that 2x Apple's revenue?
They're making sales of over a billion dollars every day?
The best quote I've seen comes from a comment on a feedback request thread [0] on the Unity Reddit, from andybak:
> It seems that everything that's working is deprecated and everything that's current is unfinished.
The features touted to be the "correct"/"current" way to use the engine are supremely half-baked, and the "old" ways are so inefficient and still buggy after all these years, that I have no words to describe.
I'm basically on the prowl to jump ship to Godot immediately when 4.0 arrives with the new renderer (the current release is not terribly efficient for 3D). It has its warts too, but at least it's architecturally sound, and the source code is very agreeable for someone not very familiar with C++.
[0]: https://www.reddit.com/r/Unity3D/comments/e5g5u2/top_5_unity...
I'm sorry (not experienced in graphics) but why would you need WebGL for a multiplayer? Can't you have a normal 3D renderer that has a connection to server?
It's not that you need to care about WebGL-the-technology for your networking, but that there are no provided tools to use, say, WebSockets, when creating games that will run on the browser.
Sure, you could use WebSockets through JS interop and create your own socket library encapsulating that, but it's hella annoying.
I know the devs say it's a major rewrite but... come on. You and I have both seen that code monstrosity before.
That's actually attractive.
Of course, a set of joes or janes capable of writing a server supporting enough concurrents to make an economically viable service is probably not a set of "average" joes. But you get the idea. These ancillary open source engines are probably the place where indies will end up having to operate in a hypothetical future where game streaming is important. Provided the engines are fast enough.
I'm not saying we'd see a python or javascript engine serving as a streaming server, but the C++ and Java open source engines could well be where we'll see the first indie hits in that space. And in that sense, O3DE might be useful.
What makes you think streaming a game made in Unity requires licensing fees to Unity or Unreal? Where in the terms of service does it say that?
> Provided the engines are fast enough.
What do you mean by this? If the game engine is fast enough to push 60fps to the monitor, then it's fast enough to push 60fps to the network.
> indie hits in that space
Why do you think there will be 'indie hits in that space'? Game streaming (ie Stadia, Nvidia, Playstation, etc) already exists and seems to primarily target heavy AAA games that players dont have the beefy hardware to run. Why should we expect there to be an 'indie hit' on a service like stadia?
If you need servers for a massive multiplayer game, game streaming services won't help you.
How much is that in bandwidth costs?
Is it better or worse than providing periodic multi-GiB updates to every player?
In ten years, we'll have fatter pipes.
> Is it better or worse than providing periodic multi-GiB updates to every player?
Not everyone can afford a 3090. But imagine even higher tiers that really only make sense for data centers to purchase. How much GPU time sits idle at home?
As much as I hate thin client-ization of everything, rendering moving offsite makes sense.
Whilst this is true the more efficiently it pushes 60 FPS the less hardware grunt you need. Which could be the difference between a project that works financially or not.