S11E04 ECS & Game Development with Elixir vs. Python, JavaScript, and React Intro: Welcome to another episode of Elixir Wizards. A podcast brought to you by SmartLogic, a custom web and mobile development shop. This is Season 11, where we're branching out from Elixir to compare notes with experts from other communities. Owen: Hey everyone, I'm Owen Bickford, Senior Developer at SmartLogic, Sundi: And I'm Sundi Myint, engineering manager at cars.com Owen: we are your hosts for today's episode. For episode four, we are joined by Dorian Iacobescu, author of ECSpanse library for Elixir. Expanse. So we'll spell that out here in a minute. we're also here with Daniel Luu, founder and CEO at AKREW. So in this episode we're actually comparing notes on Entity Component Systems and game development in Elixir, Python, JavaScript, and React. So welcome everyone to the show. Sundi: Yay. I don't know if we've covered like four different language slash frameworks , in the season so far. So thanks everyone for being here. Owen: We've opened Pandora's box. Just all the languages now, let's start with introductions. Start with Dorian. Who are you? Where are you coming from? What's your background? Dorian: Hey, thank you for having me in your show. yeah, my name is Dorian. I'm originally from Romania. I am living in Vienna, in Austria. as some of your previous guests are saying by day and by night. So by day I work as a backend engineer at Bluecode, a mobile payment solution here in Vienna. And, most of my time I write, Elixir and a bit of Rust lately. And, by night and weekends, I'm working on, my, game, library ECSpanse. Also trying to learn some more Rust. And generally trying to stay up to date with, everything which is happening in this very dynamic domain we work in. Owen: Sounds fun. And you are in Austria right now? Looks a little bit darker there, for our podcast listeners. Dorian: Yeah, it's 10 o'clock, 10 p. m. Owen: Ahh okay. So Almost bedtime. Dorian: Not yet. Owen: Right. Right. Daniel, tell us a little bit about yourself and your programming background and how you got to join us today. Daniel: Sure, sure. Yeah. I'm Daniel. A little bit about me. I'm located in DC, born and raised in Maryland. So I've been in the area of my whole life. Programming experience. , I used to work with Sundi, , back in the day at a startup called Jive. Back then used to do mostly JavaScript development, things like that. Moved on to work at Capital One where I did big data pipelines , for a SIM, security management software. And then I worked at a government contractor. Until I fell into what I'm doing right now, currently running AKREW I'm sure we'll talk about the products later, but, we run the largest in game trading platform, in the world and then, we're also now most exciting thing that we're working on is building our own game. So very relevant. Sundi: Yeah, we wanted to get into game development as like a conversation topic because it doesn't come up that often in the Elixir space, but Dorian, we came across your library, we thought that would be cool to chat about an Elixir game development library, Daniel, you're like one of the only game developers we know out there right now, but you know, love to talk to more if anyone listening wants to talk to us about more game development stuff, that would be fun. Dorian, can you just go ahead and explain what ECS is? Dorian: Maybe I should start with a short introduction of my game developing experience in general and the short Introduction is that I don't have any or at least I didn't. Yeah, so basically I discovered my Passion for game development while I was looking for some side projects to work more with gen servers and supervision trees The thing I thought was, a very super basic rock, paper, scissor multiplayer game, developed with Elixir and Phoenix and Liveview, and with very, very, very, basic graphics. But, trying this, I discovered how complex the world of game development, is. And... Basically, soon after I ended up, uh, writing a spaghetti mess out of this, initial game idea. So I started to read, how the real games are developed, how the actual game developers, doing game development. I was a bit sad to say that, everything I was reading about was mostly OOP solutions that seemed to be standard in the game development. However, reading, about this, fascinating domain, I stumbled upon the, ECS. Which is entity component, system, and, it makes sense to me in a way that Elixir made sense to me when I, back in the day when I was writing Ruby and then I first met Elixir, somehow it clicked. The same happened also with ECS when I started to read about it. ECS is an architecture that makes a very clear separation between data and the behavior. And also ECS compared to the, OOP, promotes a flat architecture. So there are no component hierarchies, all the components are on the same, level. You can build some pseudo, hierarchies, but we can talk about this, later on and why they are needed and how we can use them. back now to the ECS itself. The Entity is basically just a unique ID. It doesn't hold any kind of data or anything, uh, Special about it. The entity itself is defined just by the components that are associated with that entity. The component it's holding, the actual data. You can think of a component in term of a struct or even a single, field value. The general consensus from what I could see in the industry is to keep the components as small as possible. So this is due to the fact that you would want to reuse those components across multiple entities. So you can think, for example, of a health component that, has a single integer value. And this health component can be used for your hero entity in the game, but also you can use it for the AI characters and maybe also for some destructible objects in your game. They can all, all share the same component and systems are playing functions. They are basically the logic of the applications and inside those systems, you can query entities, basically query the components of the entities, iterate over them and change their state. Those are like the main, main, main building blocks of the ECS. Usually you will find also some additional elements like a way to query those components and the way to mutate the components. This is like what you find in most of the other libraries. Owen: Awesome. DaNiel, as someone working a little bit more closely in game development, I was brushing up on ECS and a little bit of game development stuff, it seems like it Came about in the early 2000s and maybe it's become of a more common kind of mental model or framework for Representing state in a game it was that fair to say or is this something brand new to the gaming community? Daniel: I've only been in gaming for the last three years. The game that we're developing is not the first game I've ever developed, but the first production scale game I've developed. Funny enough, we are also using eCS. we are using, a framework from a company called Photon. They're one of the most popular multiplayer frameworks out there in the gaming industry. They run a lot of backends for games that you've probably heard of, like Call of Duty, and they have multiple different products on all different scales. So they've got a product for mobile, they've got a product for console, they've got a product for pc. And so for us, we're using one of their latest frameworks called quantum, which is all built on top of ECS. By no means am I an expert. Our engineers are a little bit more of an expert on that, but I would say that I've, definitely dabbled within, the game development, over the last two years, just to help along the process during crunch times, for conferences or conventions, and ECS is pretty incredible kind of how Dorian mentioned. I think when you. Approach it. It just makes sense. Everything snaps together and it's really fluid. To give you an example, Our game is Animal Crossing meets Mario Party and essentially right now we're building out one of the mini games Which is a tank minigame. And so we built a tank system Movement system which on top of that we have a power up system and a health system. And so all the systems work independently of each other whether or not the other systems are turned on And that's the way, that really systems should work is they're kind of all separated. And then within those systems, you interact with the different components and query different, entities. So it was something that I actually had never experienced before. I've heard the term ECS, previously in the past because unity, which is the game engine we're using. they use it for a couple different things first time I've ever used it was working on our own game, and it's been fantastic. I think it's really efficient. Owen: Awesome. So just to like recap and to see if I'm understanding what I've been reading, Dorian's excellent explanation and what you're saying, Daniel, when I hear entity, what I, think of is like foreign keys, like in a database, right? Like this is the ID that kind of relates to a bunch of other records and other tables. And then those other tables, we're kind of mixing metaphors here, but those other tables are kind of like a component in this framework and then the system is the application that decides what to do with the data and the events that are flowing through the system is that kind of am I am I bending the metaphor too far? Daniel: I think it's, I mean, similar to you said, I would say if, anything, it's more like, , yeah, your foreign key is your entity, which is the unique identifier. And then maybe the other fields within the table are your component. It's tough. The metaphor is kind of crazy because obviously, like Dorian said, you want to be using small components everywhere as much as possible. Your systems would be like your backend server logic or like whatever you do with the data. Sundi: What's so interesting about this is like, we're able to communicate across this common language that is game development. Well, we being Dorian and Daniel. Owen, you're doing a great job too, actually. I'm just following right now. But it's funny because we're all kind of writing in different languages here. And, Dorian, when you were explaining about taking this very methodical approach towards learning game development and learning about these different libraries, you were talking about the component based architecture. And it reminds me of a lot of intro to Elixir things. Almost all of them are build a game, build this checkers game or this kind of Tetris like game. And we kind of all do that at some point, but it's so different in my head from what Daniel's talking about, which is like, oh yeah, Animal Crossing. That was something that was very popular 2020. Everybody had a cute little island. Like they're different in my head somehow. We're getting to a point where I'd like to make them the same in my head. Daniel: I think it's just tough to make that jump. I honestly, like I said, I know nothing about Elixir, but let's say relating it to JavaScript, right? You're not building Animal Crossing in JavaScript. you could, you know, it's, it's probably wouldn't be a good time. It's rare to find things like that because even web games, when you look at it, there's a lot of IO games out there, which is something really popular nowadays, and even most of those are typically built in something like Unity and then ported to WebGL because Unity exports to WebGL and it exports to a ton of different platforms, so You end up hosting a Unity instance, in the browser instead of, building your own 3D game engine from scratch. And there's tons of people out there that do it, I'm sure. But I think that's why you have a hard time making that gap. Cause I don't know if Elixir is typically used to build like web frameworks, but, okay. Yes. Yes. Dorian: Yes. but not games. Daniel: Ish, right. Yeah. Okay. Yeah. Got it. So yeah, exactly the same thing with JavaScript, right? Think about JavaScript, you're building a website, right? You're not typically building, a game, right? So I think that's why that, that gap is, is typically there. Owen: Elixir has, a growing, set of use cases, web servers, absolutely. It's kind of like what it was built for originally, embedded systems came along shortly after, what else, , number crunching. So numerical Elixir, machine learning is a newer development. And I'm sure there's at least another one or two that I'm missing out on, but, there's a growing set of ways of using Elixir as, more and more people contribute and, open the doors to more communities. So kind of on that note, I'm curious, you mentioned Rust and some of the things that come, that you're compiling down to, , what are some of the languages that people would typically be using to write games, whether it's ECS or some other kind of framework for state? Dorian: For me, for, my Elixir library, the inspiration was, Bevy ECS, which is a Rust library. It's an open source project. I cannot say that I can compare that to libraries in any way. Bevy ECS, it's a. It's a big project, it's backed by a big team and it's a full game engine is not just the state management, which is what ECSpanse is. Personally, I found that one to be exactly what I needed in terms of API of a library. But also what Daniel was saying, probably the most used language in game development should be C sharp because of Unity. But, yeah, I think also the open source, scene, it's growing in the game development lately, also with Godot engine, if you've heard of it, it's becoming very popular, they have their own, language, it's called GDScript, but also they support, C Sharp, out of the box, I guess, But also JavaScript, I think it's becoming quite popular. There are a lot of, libraries, not, not like probably to start a big commercial project, you won't use it. But if you know, for example, the big hit, the Vampire Survivors, the initial version was written in JavaScript. So then there was like in the top, steam, sales or whatever favorite. So it was. Small game with a big, impact, Owen: Got it. Now thinking about ECS, and I'm thinking about the only actual game I currently play which is Wordle. , is a game as simple as Wordle. Is there any any reason to use ECS for that? Or is it more something where like multiple players or like multiple I guess entities are kind of part of the system? Daniel: I wouldn't see a case for it, honestly. Wordle is like, Is it basically a website? I would say. ECS really makes its impact like you said, once you start tracking a ton of entities, and you have a lot of complex systems that, work together. That's what I've seen within our game and which obviously our game is Pretty deep and within the different systems that it manages So I wouldn't say so I'm sure you could And I don't know if Dorian has a different opinion, but feel like ECS might be a little overkill for a game like Wordle Dorian: from my perspective, yeah, it, it might be overkill, but uh, on the other hand, I, I find this is a way to model stuff. So, there was this discussion, for example, unity has its own eCS, it's called dots, and many people were saying, Oh, but, does it work implementing the dots for a game like this or like this? For me, the answer would be yes, because it makes sense. So I find it more logical than the object oriented approach. So even if I would build a simple thing that requires a loop, I would do it in ECS way, if possible. Apart from this, ECS, it's. A way to model something you could do anything, basically you could build a website with ECS. Probably it won't be the most, efficient one, like to have a tick every few milliseconds and refresh your page, but you could do it. Sundi: stepping back a little bit from the concept of somebody wanting to step into the game development world, or just one person, but they have a small game idea, maybe it's Wordle, maybe it's a little bit more involved. Daniel, how would you, with your current technology stack knowledge, how would you get started on that today? Daniel: jumping into it, I think, some of the tools that Dorian mentioned, really easy to get into. I personally think unity is, I mean, we can get into this whole thing about unity, but Unity came up with this whole monetization thing recently and it was totally overturned by themselves. And that was a nightmare. , I was sweating, I was sweating through my sheets through that one, If I was gonna get started and I say like by all means I am like a beginner game developer too. obviously my expertise still lands itself within Websites like JavaScript node react kind of the frameworks that we talked about before but Even when I was getting started, I think Unity is like really easy to pick up. They have such a big community behind them. So it's really easy, to find things that you need to, learn through it, whether it's tutorial videos or forum posts on like really specific problems or frameworks or the unity store. even if you wanted some assets and you wanted to pay your assets as in like, Artwork or, you know, models or animations, you can pay like 5 to 10 bucks to get, a wide variety of things. Incredible stuff off the unity store. So I think that ecosystem within unity just makes it really easy to get started. And you can write spaghetti code and of course your game will work like it'll be, it'll just like any framework. But it's, it's really nice to visualize the things that you are, making right off the jump. Godot is similar. I think it just has less community support. , it's not as developed, but obviously they're working on it and it's just come out. Unreal, I think it starts to get into a little bit more of. Well, Unreal has kind of two sides to it. Unreal is, Unreal Engine, It has a side to it, which is blueprints, which is actually a visual language. So you can actually make an entire game with a flow chart essentially. And then on the other side, you code in C plus plus. So it's like, there's the two sides of unreal. And, and unreal is typically used for more hardcore gaming, quote unquote, things that you'd be building out for PC or, or for a console, , like PS5 or Xbox. Street fighters built in unreal. A ton of games are built in Unreal nowadays, but obviously Fortnite is also built in unreal. So, I mean, there, there's a really wide variety of games, , but really depends on what platform you're looking at and, your expertise with, with coding. But I mean, ECS is just one of the methodologies you can take, you could take tons of methodologies out to , game development. Owen: Alright, let's fast forward a little bit. So, I, Owen, beginner game developer, have created my first project in my favorite language, whichever fill in the blank language that may be. And, uh, and so now I've got entities, I've got components, I've got some functions which represent the system tying all this together. I can imagine some games are ephemeral. Maybe the state doesn't need to be saved anywhere. Dorian, what are some, ideas and some thoughts about, what to do with the state as it's flowing through the system and whether you save it and where to save it? Dorian: Ah, that's, not the ideal question for, my library, because, one of the things I noted down to speak about pluses and minuses, and then the minus side was that I have no persistence at all implemented yet at this point., why is that? This is again a bit of, uh, history because, after my initial, attempt to build that basic, paper, uh, scissors, rock, uh, like game together with. My idea of having my own library, also the game that I want to build with Elixir evolved a lot, so from this basic two players chasing each other and trying to perform an action better than the other, it evolved into something that, it's a mix of deck building, real time, battle royale, so, basically, how it started, uh, I was very frustrated playing, online battle royales, such as,, Apex legends, for example. I, play from time to time, but I'm very poor at it because basically I cannot target and, perform quick actions and stuff like this. And I thought, no, I would like a game that would have the same like quick sessions that don't involve, three days of staying there in front of your computer, but like half an hour session. That would be, enough for a game, but still, I, it shouldn't rely on your physical abilities, but more on your mental abilities. I built this framework with this idea in mind, that, I'll build the features that I need, especially for, this, game of mine. And basically, considering that the players, enter in, uh, short sessions, or should enter because the game it's in my fifth. Attempt, early development, so, considering that the players enter in a very short, sessions, I was not, really interested in long time, persistency. that being said, I was thinking a bit about it, but before, uh, I should say... I will speak just a bit about the current architecture, so what I'm going to say, it will make sense if that's okay. Owen: Go for it. Dorian: so yeah, the ECSpanse structure. First of all, what it is and what is not. So it is a state management library. It's not a game engine. It doesn't know anything about graphics or collisions or sounds or anything like that. It's, in the end, I'm a backend developer and I love backend. I'm not too much into the, glittering, graphics and stuff like that. So, yeah, it's a State management library, the code. It's a gen server that runs the game loop. So every frame, this, gen server, it's triggering all the systems., then I have a few ETS tables that store components. Resources and events. We spoke already about components. We know what they are. Resources are kind of like global components that are accessible within All entities and events are the way to communicate from outside the library with the library. So my game, it's Phoenix-based. Phoenix doesn't know anything about my library. My library doesn't know anything about Phoenix. So this is the way that phoenix will send messages to ECSpanse to say, for example, that the user performed an action. So all of those are stored in, ECS, , tables., all the systems are tasks and they can run in parallel., but for this, you need to do some setup to ensure that you don't do any kind of race conditions and inconsistencies. So you need to specify which components you are going to change in that system. And then I have a scheduler that will not schedule two systems that are modifying the same component to run in the same time. So they'll run in parallel batches basically. And then I have something called projections, which it's gen servers that are also running in parallel and it's the other way around. The projections can push data back to, the process that spawn them. So for example, from a LiveView, you can send an event to the, ECSpanse library, but in the same time you create a projection, which is a linked, process. And then you can, in the projection itself, you can do some queries and then push it back to the LiveView and display it basically. This completes the, the feedback loop. Okay. there are a lot more stuff going on, but Sundi: Yeah, there's, there's quite a bit there and I just wanted to pause. Daniel, are you following since you don't know Elixir? Daniel: well, the terminology I'm not following, but I mean, obviously, all the kind of like ECS terminology that Dorian's using is like very standard, like, events, components, systems, and then, resources. We don't have resources in the ECS library that we use. Technically, we just have static components. So you can use static components or global components to, to hold. , it's the same thing. Basically. Um, but, but it is very similar where, you know, we were talking about state management. So actually all of the persistence is done outside of our ECS. Library, right? Our ECS library's for running the game at runtime and it manages all the state there. But especially because our game is a multiplayer game, we store everything. So I actually still code the entire back end of our game and it's literally a typical like web server and you hit the web server to save certain parts of it. And all of our game state is held in the database. So, , ECS, does all the, live management of the game, but then once the game's over, whether you want to save the person's score, or you want to save the person, you know, how many quests they've done, all of that's still done in Postgres and, and with a Node. js backend server. Owen: Before we get to concurrency, I think to kind of translate some of the terms, Dorian is using not every tool in the Elixir Erlang toolbox, but most of them. Right. Sundi: Almost. Owen: you got your gen servers, you got your tasks and for our non Elixir listeners, these are essentially different APIs or code APIs for interacting with processes in the virtual machine. And the great thing there is like each process has its own garbage collection. You can have thousands of millions of these in your machine and that helps us with concurrency. So when we think about ECS, I can see how this makes sense. Even with a single player, you might still have multiple entities that are performing or collecting events throughout the system. I'm kind of curious, when you start to think about multiple players and how you're going to, if you do need to persist the state. You could write it to logs, you could write it to a database, you could write it to a file. That would be very slow. there will be limits, right? You can't necessarily write every event immediately as it happens. So are there kind of approaches I'm thinking back to MarioKart, maybe nothing gets saved until you're at that checkpoint. Uh maybe there's like snapshots or something. Are there some tools like that, Daniel, that come to your mind as far as like kind of saving batches of. Daniel: No, I mean, let's, let's take the Mario Kart example. I would say when you're, and again, Dorian might be approaching it differently, but I'd say if we were approaching a Mario Kart game for our game, which we might, cause we have a ton of different mini games, right? We would build out. The ECS portion of it, which is going to handle the live gameplay. So, for us, we send inputs to the ECS system, the ECS system will control the cart movement. it's movement within 3D space. It doesn't know the visuals at all, but it knows the math of where the cart is, what it's colliding with. Essentially it knows all the numbers, right? That's what, , we would have ECS do is manage the actual driving and all that stuff. And, and then all that data, it gets spit out back into Unity where Unity actually picks that up and displays everything. So it starts rendering the 3D models, and it shows where the carts are driving and, and all that stuff. The only quote unquote persistent state I see in a Mario Kart game is who took what place, right? So, once you've finished and you cross the finish line, all the players, you know, you add up the scores and then we would save all those scores in the back end, in Postgres. And if you ever wanted to look back at that again, you could look back at it again in there too. I know our framework, Quantum... does provide, almost like a snapshot. So, it does provide an idea of games, essentially, which we don't save, but essentially you could serialize that data and then save it as a file and actually do replays, so there's a feature of that and I'm, again, I'm not super full on that feature cause we don't use it yet, but I know that for other games that use the framework, you can save an entire snapshot of all the numbers that run, right, and then you can, Replay those numbers with your front end code to and replay every little aspect because it's a solid state machine. Right? So there's kind of two aspects to it. But for us, mostly persistence wise, we're mostly just saving like player score when it comes to the end of a race, right? Sundi: thinking about, your development cycle, what kind of backend challenges are you running into when you're developing in this space, Dorian? Dorian: So now you mean about developing the game with the library or the library itself? Sundi: You mentioned that, you focus more on the backend, you're a backend developer, it's kind of your bread and butter, right? As you are developing, what kind of challenges do you come across? Dorian: In terms of the library, itself, I think the biggest challenge was the time, but probably we don't want to speak about this here. So it took. About nine months to develop because it's like an extra work project, but from technical, challenges, one interesting, and also I'm very curious how Daniel is, handling this or how, how your engineers are handling this. It's about collections in ECS. So all the tutorials I checked before starting to develop my library. And while I was trying to understand this philosophy of eCS was collections. So, all the tutorials don't mention it, you know, if you follow an eCS tutorial, they will show you everything it's singleton. You have a hero that has a sword that it's in a level that but then Games are not like this. Let's think about an inventory a hero has an inventory and then he has Potions and you can have two potions of the same kind. How do you manage this in eCS, and apparently It's not a standard way. So ECS comes in so many flavors. For example, some ECS libraries allow your entity to have more components of the same type, but this is more an exception, not a rule. Most of the libraries don't allow you to instantiate. So like to have more components of the same type for the same entity. for me this was my biggest initial challenge, how, to handle collections because my game, it's about a deck building. So the player will have cards to play in the game. So, you know, I don't want to, I want abstractions. I want polymorphism. I don't want to create a component for each card. Maybe each card will have their own components. So, if you remember in the beginning, I said that you can have this pseudo tree of relations between entities that is not specific to the ECS as a concept, but, you can implement it on top of it. So I ended up solving it with what I call bidirectional relations between entities, meaning that you can create two entities and then you can assign one entity to be the parent of the other entity. And automatically the other one will become the child of the parent. So this way, for example, in my deck building, you can have your player that it's one entity, and then you can create then entities that are the cards and you can assign them as the children of this entity. So this is part of the ECSpanse library. And more than this now, if you delete, for example, the player entity, you have the option to say, do I want also to Delete all the children's of this entity and not to leave them around or have to manually delete them. So, I had to, implement also this. the part that actually updates the components and the states, I think this was the most complicated part to automatically manage these relations between parent and the children's. I also have other challenges, but maybe Daniel can tell us a bit about the collection problem if you face it or. Daniel: Sure. We don't, obviously like for us, we're not building a framework like you, so it's a little bit different. our framework has handled that for us. , collection wise, let's say you have two versions of a potion . Like we have furniture in our game just like animal crossing. Right. If you have two versions of the chair, each one is ends up being its own entity. So you just have two entities, of the same thing. But obviously for us, like, um, you know, you can't track everything with the entities, right? Especially in a network game like ours. It would get too network heavy to start tracking everything. We kind of do like this hybrid model where all of the inventory is actually not stored in ECS, so it's actually stored, in the backend. So when you, you pull the inventory down and then when you start interacting with things, we start using ECS to manage the live state of the game. So in, in reality for us, ECS is only used for the multi anything that needs to be actually multiplayer. So anything that the, that all the users need to see at the same time, we use ECS for, and. That is kind of directly integrated into the multiplayer framework that we use. But even then I would say on the ECS backend, we do have collections and things like that. the framework we use is very opinionated. And it's the only ECS framework I've used. So I, I'm definitely not any kind of expert. But on the backend for components, you can have arrays, you can have lists, things like that. they've set it up all for you to make it easier. They also even have pseudo polymorphism, kind of like you mentioned built into the framework. So, for example, at the top level asset, we have item. But then we could extend that item to be a tool or a furniture item or anything like that. And all of those things can be user defined as kind of pseudo components that... Take on the properties of the parent component. Right. You can have this kind of pseudo polymorphism and collections and all that. And it doesn't really affect, us as much, this collection issue. Afterwards I could send you Dorian, the, the link to the documentation for the framework we use, I think it's quite good. And a lot of the people that work there are insanely smart. , Challenges for us though, on the game development side, sorry, you asked back end specifically or just in general or, Owen: Memory management, concurrency, anything. What, where did things blow up when you're building a game on the backend? Daniel: honestly for us it ends up being, a lot more on the graphics optimization side, so we're trying to, yeah, it's less interesting, it's not back end, I know, but I mean, honestly that's where we run into things because that's where it starts to be hard for games to run on specific devices, right? So we're trying to be an all platform game, meaning we're going to be on mobile. We're going to be on switch. We're going to be on PC. And it really comes down to, optimizing your assets and also, doing smart things with your code in order to have that stuff run on, smaller devices like culling certain objects or , making certain objects in the distance 2D at a certain aspect. That has honestly been more of a challenge for us than the back end stuff again. Like I said, I mean We're using this amazing framework. But yeah, our, most of our challenges have come from the graphical load on any system, and also just like the number of systems, you would not believe how many issues we run into, building for Mac, because I mean, and you kind of wonder why, so many people don't build for Mac, , it's because OSX loves to compile their shaders differently, or they love to, do this one little quirk where you have to like account for it. So a lot of the time I didn't really realize it was like, Oh, you need to build for Mac. Why not just like export it? You know what I mean? That has actually become one of the things is like, well, we'll be testing and one little weird problem will happen on Mac and we'll have to spend a week or like two weeks, figuring out what that is and then fixing it. And then. Obviously it's lost time, but it's not lost time. I mean, you want, you want to be able to support Mac, but, it's time that we didn't think that we would have to spend. Sundi: now that we've gone through the complexities and hardest moments, what has been the most rewarding, part of building out these, games slash libraries? Daniel, you want to kick us off there? Daniel: Yeah, most rewarding 100 percent is seeing people play your game. we took our game out to, PAX East and PAX West this year. If you guys are not familiar with PAX, stands for Penny Arcade. And it's been, it's a convention that's been around for quite some time. East is in Boston and West is in Seattle. It's probably the largest convention where anybody, any people come to play games. Other than like Gamescom in, Europe, I think that's the other big one. Essentially... It's like 40, 000 people that come over a three day period or four day period to just play games. And I think it's the only convention I've been to where people actually really want to play games. Like we've brought our game to a local anime convention and other gaming conventions. But it's really not the same as PAX because PAX is where people come to specifically line up for hours to play games. And it's been so rewarding to like bring the game. Have people come by and a kid like who's like five years old You're never gonna play test with a kid that young you know what I mean? And have a kid like their parents brought them for the weekend as almost like a disneyland trip kind of deal sit there to play your game for like three hours and You have nothing in your game yet. Like for us, back in March, for PAX East, our game was like very low substance. I mean, it looks great. I think it's a great looking game, but, , we didn't have that much storyline in it yet, but you have this kid sitting there playing for three hours and like getting excited about it. His mom was like trying to pull him away from the chair and he would not want to leave. That's obviously rewarding like you spend all this time, working really hard on this game And and you see people enjoying it like that is kind of why you're making games in the first place Sundi: Cool. Owen: Yeah, I'm so sad because I think we could probably go on for at least another couple of hours and we run out of time., I can see Dorian has lit up, so good luck sleeping. yeah, we've covered so much ground already, I'm thinking of like how all this works over PubSub and LiveView and multiplayer stuff, even with, with our kind of fancy schmancy web framework that we all get to use. I have to cut myself off. So it's been super fun talking with, both of you. Before we go, do you have any plugs or, do you want to tell us where people can find you on the intranet? I'll start with you, Dorian. Dorian: For me, it's very easy. You can find the library on HexDocs. So, the HexDocs, you can look for ECSpanse with ECS. , I also have a... I'm blogging from time to time on Medium under the... at, uh, Jacobson, it's called, but I can provide you with uh, link afterwards. And, uh, I hope that, soon enough my, also the game, built on the new library will be in a good state to be open sourced, but for now it's not, uh, yet there. Owen: All right. So we know you'll be staying up all night to finish that game tonight. Dorian: One thing I, I, I found like in, in, in those few years since I'm, I'm playing with this is that game development is hard. And it takes a lot of time, Owen: you don't say Daniel: You don't say yeah Owen: right? Right. Yeah. So. Awesome. And we'll have links in the show notes, of course. Daniel. Uh, any hot plugs, hot plugs, hot takes, Daniel: That's it Owen: or social media links. Daniel: No, actually, it's funny. I will I will get to it. But I mean, it's funny Dorian. Have you played a TFT yet? Dorian: Oh, what's that? Daniel: It's called TFT. Have you played TFT yet? Dorian: I don't think so. Oh, Daniel: It's kind of like your exact game that you want to play. I've been addicted for the last, , few months here. And the reason I love it is like, it's the most casual game. I mean, it's a little intense, but like, it's like 30, 40 minutes sessions. It's by the people who make league of legends. So it's actually within the league of legends client. But it's auto chess. So it's an auto chess game. And you play against eight other people at the same time and it's battle Royale. So like you basically, You fight everybody in the lobby and then until everybody loses health. And then if you're the top four, you actually get a positive score. And it's with all the legal edges units. You don't have to know anything about legal edges to play it. , but I love it. I mean, we play it every day during lunch with our company. So it's a good game. Especially if you're looking for something that's like 30, 40 minutes. And you only have to use the mouse. You don't have to, like, aim or anything like that. Dorian: thanks. Daniel: But yeah, plugs for me. obviously our game, , Galactic Getaway, it's already public, so you can check it out on Steam. It's not out, but it's not out as in you can't play it yet, , but you can look at it on Steam and wishlist it. Wishlisting helps us quite a bit because, it tells teams give, give steam an indicator on how popular your game's going to be. We're aiming to hit 10, 000 for the end of the year. We're at like 7, 000 right now. So, you know, go out there and wishlist it. You could find us at galactic getaway on TikTok or, if you just search galactic getaway on twitter, you probably also find us as well. Our company's AKREW A-K-R-E-W. If you go to akrew.Com, you can see everything there as well. Owen: Awesome. Sundi. Before we wrap up, I've got to tell you my favorite Smash bros. character you'll never guess. Sundi: I'm not gonna guess. Tell me. Tell me. Owen: Pikachu! Sundi: Oh my Owen: Pika! Pika! Pika! that's it for this week's episode of Elixir Wizards. Thank you so much for joining us, Dorian and Daniel, and Sundee for surviving till the end for the Pokemon jokes. And we will be back next week with another episode of Elixir Wizards. Thank you. Dorian: Thank you. Outro: Elixir Wizards is a production of SmartLogic. You can find us online at smartlogic. io, and we're at SmartLogic on Twitter. Don't forget to like, subscribe, and leave a review. This episode was produced and edited by Paloma Pechenik for SmartLogic. We'll see you next week as we branch out from Elixir. Yair: Hey, this is Yair Flicker, president of SmartLogic, the company that brings you this podcast. SmartLogic is a consulting company that helps our clients accelerate the pace of their product development. We build custom software applications for our clients, typically using Phoenix and Elixir, Rails, React, and Flutter for mobile app development. We're always happy to get acquainted even if there isn't an immediate need or opportunity. And, of course, referrals are always greatly appreciated. Please email contact@smartlogic.io to chat. Thanks, and have a great day!