-
Notifications
You must be signed in to change notification settings - Fork 6
Description
Summary:
I believe a major reorganization of the engine is needed to take o3de to the next level.
I believe we should remove the engine object from the core o3de/o3de repo and leave only what we currently call the "Program Manager". The removed engine files should be placed in a separate repo o3de/engine. "Program Manager" application should be refactored and referred to only as "O3DE.exe", and for the rest of the RFC I will only refer to it as such. It is this application alone we should build and distribute as a "release". The customer then downloads this application via website download or platform package and runs it independent of the engine. Currently this application handles Gems quite well, however this application should be upgraded to treat all o3de objects the same as it handles gems, so there would be a "Projects" tab, "Templates" tab, etc. added so that it functions the same as the current gems tab, and yes even an "Engines" tab treating it the same as other objects. The user then uses this application to download the objects they wish.
The engine.json contains the information about this engine object including what dependencies it has. O3DE.exe responds to downloading an engine object the same as it would any other object, in this case the engine object has a list of gem dependencies, so it prompting/downloads this engines dependent objects. It places all of these objects, including the engine object to the default O3DE directories, i.e. ~/O3DE/Engines/o3de/23.04/ ~/O3DE/Gems/Achievements/1.5.3/ ~/O3DE/Projects/MultiplayerSample/23.05/ ~/O3DE/Projects/AutomatedTesting/23.05/ ~/O3DE/Templates/MyTemplate/1.0/ etc... for all O3DE objects. These of course are the default locations and can be overridden. O3DE.exe registers all these objects and you are off to the building races. The application gives the user the choice of downloading a zip release of an object (binary or code snapshot), if available, or cloning the repo at a tag, if available, etc.
This also means we should remove most, if not all, child O3DE objects from the core engine as the needed objects should be just set as dependencies for this engine object. These removed individual objects should be placed in their own separate canonical repos. Not every object needs it own repo, Atom, for example, is hierarchical collection of objects and would be best placed into a repo object with the same structure as the o3de-extras repo, so that all related atom objects can live in the same place. This way we can keep large systems of object together yet have them separate. They now live on their own timeline and DO NOT have to match the release schedule of O3DE. If there are no updates to the object but want to communicate compatibility, we may optionally alter the objects json to indicate compatibility/incompatibility with other objects as normal.
What is the motivation for this suggestion?
- Making this change will allow the engine to use the object system to its fullest intended expression.
What are the advantages of the suggestion?
- This will dramatically reduce the size of the engine and allow the user to only include what they need, which should also drastically reduce the engine download, reduce the footprint on the users machine and drastically reduce compilation times, promote best practices for the engine going forward. Make the engine more modular and easier to maintain. This should also dramatically change what we think of as a release as it just becomes building the O3DE.exe if needed, putting a tag on the engine repo and updating the engine.json. This will also dramatically reduce the deprecation process, as it will just mean removing a dependency line in the engine.json.
What are the disadvantages of the suggestion?
- There will be more repos and we will necessarily have to change our processes to accommodate. Will we have to update a lot of documentation.