Future direction of Indigo - where to next? #397
Replies: 5 comments 9 replies
-
I skimmed the post above because it's a lot, but here's some of my lukewarm takes:
|
Beta Was this translation helpful? Give feedback.
-
Here are my thoughts on it (I already shared some feedback on Discord, but would rather share some more detail here). First of all, my general thoughts on Indigo:
Modernise and Expand
For me, this is a very strong reason to not support WebGPU. Small games really benefit from being playable in the browser (or at least having a demo on the browser).
Is Indigo able to render a "pixel art game" with a 1080p internal resolution? I understand that there are differences between a pixel perfect and a smooth 2D renderer, but if the engine supports a high enough internal resolution and some scaling capabilities, this seems like a minor problem. Expand to new platformsOverall, I think it's "impossible" (or at least very hard) to have an engine like Indigo keeping an high performance while targeting multiple platforms. I've written some simple cross-compiled games in the past and just accepted that they would have crap performance. This is also particularly annoying when dealing with file formats. For example: what kind of images formats will you support? Are you going to write your own image decoders or use platform specific ones? If you use platform specific ones, what happens when one platform supports one feature that another platform doesn't (e.g. The BMP spec has some weird features like JPEG compression)? As such, I think the only way for Indigo to be performant is to pick a single target, and JS seems the safest bet (as it can target both browser and desktop). That means that we probably won't see any AAA game released on Indigo, but in my view that's OK. Build a gameFor me, this is the most important point. I'm sure that most people picking an engine will first search for "what games use X". Also, having an open source game would also work as an example of how a game is structured in Indigo (it would be nice to also have some more entries in the "Guides" section). Build an editor
Yeah... unfortunately, I have the same feeling. Which is a shame, because I think it's going to take quite some effort to create an editor 😞
Maybe this is the safest approach? Build some tools (or at least integrate with other tools) that you need for the game and see if they are useful to others? |
Beta Was this translation helpful? Give feedback.
-
Modernise and ExpandI agree that WebGPU will need to happen at some point, but it's still too early and definitely not essential for now. Expand to new platformsThis could potentially "ruin" indigo because of performance problems and so on. I also think that the web is already universal enough. There might be an argument for a more streamlined packaging of games as executables, likely through electron, but I don't know if this is something that is supposed to be done externally using other tools. Build a gameYes, absolutely. This 100%. Guide development through what the community needs. I also like the idea of collision detection. Maybe similar features could be all part of a plugins project? Build an editorThis one sounds cool, but also high investment and potentially low reward. |
Beta Was this translation helpful? Give feedback.
-
About the current implementationI think Electron is a huge drawback of Indigo:
Asking other communities, it seems that this thought about Electron is shared. JVMThe JVM is a really good piece of technology with great performances and the ability to run on Linux, Mac OS, Windows and Android. However, the JS support is almost inexistent except TeaVM which.. behaves like Scala.js. I also understand that the cost of maintaining both several Indigo/Tyrian implementations would be hard to handle. ScalaNativeI find ScalaNative very easy to use and it allows console support but here comes two concerns:
Sticking with Scala.js ?So with ScalaJS, we can target the browser, mobile, but the desktop implementation uses Electron. What if we switch from Electron to Tauri or Neutrino.js? Tauri is in my opinion a pretty good compromise between portability, maintenance cost and lightness. Tauri uses the OS's web renderer, featuring way lighter binaries at the cost of (maybe) small platform-dependent changes but not as significant as ScalaNative or maintaining JVM+ScalaJS implementation. |
Beta Was this translation helpful? Give feedback.
-
Scala Native support would be great! It's improved a lot since; it's got multi-threading support now, and someone was even able to get it working on a PlayDate game console. There is source-level debugging support added recently too. I think porting across platforms will be probably tricky. But I don't know too much, it's best to drop by the Native channel in Scala Discord, the main contributors are often there. |
Beta Was this translation helpful? Give feedback.
-
Development work on Indigo appears to have slowed down. That change of pace could be attributed to the fact that I've also been working on Tyrian, or that I'm building a new demo/game, but mostly it's because Indigo now does far more than I ever planned for it to be able to do.
The initial goals have been met. Where should Indigo go next?
Restating the mission
There are a number of possibilities, but before I list them I think it's worth restating the purpose of Indigo:
Possible next directions
Options I've been thinking about (more information below):
Modernise and Expand
WebGPU
Within it's current constraints, Indigo latest the latest and greatest of the available technologies, save one: WebGPU.
Adding WebGPU support is simultaneously something I'm quite interested in, but that also has really dubious value, and that is off-putting.
WebGL adoption rates are slow. WebGL 1.0 is everywhere, WebGL 2.0 has just finally been added to Safari years after other browsers implemented it (and it has issues). How fast will the world (devices/browsers) move onto WebGPU? Who knows.
But more importantly, what benefit does WebGPU bring to a 2D pixel art game engine? No one that I'm aware of is using the current WebGL 2.0 stack to it's full potential. Moving to WebGPU feels like a long term inevitable move, and it might sound exciting on an announcement post, but I'm fairly sure that it wouldn't encourage many/any new users or produce new or better games by itself.
More than Pixel Art
The choice to focus on pixel art, like the choice to focus on Scala.js, was a way of constraining the scope of the project to something manageable that I was personally still find exciting.
I accept though that Pixel art is a bit of a marmite subject: Would more people start using Indigo if it supported super smooth 2D graphics too? It's a lot of work, how would we find out?
Expand to new platforms
Before I get into the nitty-gritty: The big problem with adding new platforms is the maintenance cost.
I get that a lot, it is not really true. Lets pretend for a moment that the JVM bit itself does indeed work identically everywhere, or rather that through the magic of Scala compilers I can just target different platforms and OS's, you are still left with the problem of supporting all the GPUs and shader languages (not to mention audio, IO, networking, storage, etc).
Yes, you can look at abstraction layers for some of that, but there are complicated trade-offs to consider. It is already a lot of work testing for Electron + a good range of browsers on Windows / Linux / Mac where I only use Web-tech + WebGL 2.0.
Having said that, adding to the maintenance burden is genuinely acceptable, but the value of doing so requires some articulation.
The JVM
This comes up a lot. If you're doing Scala there's a sort of expectation that it should a) work on the JVM and b) that there is value there. In this day and age neither is true in my opinion.
Scala.js and Scala Native are amazing things. The JVM is well suited for long running processes of the kind found in server-side platform building, but is it really a good choice for everything else? Maybe not.
Yes, there are Java/JVM game engines out there, and if you focus exclusively on Desktop gaming then the JVM is a totally viable option, but you cannot port it to console, and it does not run on the web. (Scala.js on the other hand works on Desktop, Web, and Mobile for not much more effort!)
JVM support feels like a hygiene factor, it's expected and people are disappointed when it isn't there, but I'm not convinced it adds any actual value unless your plan is to target Desktop exclusively.
Scala Native
Scala Native is an interesting option, either adding support for Scala Native or even perhaps abandoning Scala.js in favour of WebAssembly. The promise here is that with a lot of effort, we'd gain the ability to target any platform i.e. Browser, Desktop, Mobile, and Console.
But would that actually increase adoption? Would it encourage anyone to use the engine? I'm skeptical.
Sticking with Scala.js?
The beauty of Scala.js is that it provides a good abstraction away from the graphics hardware, and runs well on both Browser and Desktop (and even Mobile!), at a the cost of a performance penalty (that most people won't be seriously affected by for 2D pixel art games). If there were thousands of people making games and all of them were clamouring for better performance than the choice to move away from Scala.js would be compelling ...but we don't seem to be there yet.
Build a game
If you've been following the recently news about Unity, you can't have missed that the world's Unity devs are unhappy. Unity has shutdown the division that it finally set up to make games internally - i.e. to eat it's own dog food and improve the engine based on real usage and experience.
Many of the recent Indigo improvements have been based on the same idea. I (and others) have been trying to use Indigo to build games and demos and this has led to the discovery of many missing features and improvements that could be made.
One tactic is to make further development entirely use-case driven. Either myself or someone else builds a substantial game and we improve Indigo to meet their needs. For example: No one has ever published a desktop game using Indigo, and what that means is that although we have basic support for desktop apps built in to aid development, there is just a huge pile of things we don't even know we're missing that would help people package and distribute their games!
Call it a period of consolidation if you like. The appearance is that Indigo development has slowed down, but what is actually happening is that it's being hardened up through real world battle testing.
Build an editor
Indigo was originally designed to be a code-only engine, however, as time has gone on I've begun to suspect that there are only so many game builders out there who are prepared to put up with an entirely text-editor based game building experience.
I have ideas about how to build an editor (FP doesn't map to a GUI editor experience in quite the same way the OO does) but it's a massive undertaking, and again the question is: Is it worth it? Will it aid adoption?
An interesting side note here is that building an editor is related to the previous point "Build a game". In the act of building a game, I've realised that I do also need more tooling, and so building an editor to meet my needs - even if no-one else cares - has value.
So... where to next?
If you have an opinion on any of this, please feel free to share it. I'm well aware that most of the above is me speaking from inside my own little bubble. Maybe I'm dead wrong and adding JVM support really is the answer!!
If you aren't comfortable leaving a message here, do come and find us on Discord.
Let me know!
Beta Was this translation helpful? Give feedback.
All reactions