[HN Gopher] Murder is a pixel art ECS game engine in C# ___________________________________________________________________ Murder is a pixel art ECS game engine in C# Author : ibobev Score : 235 points Date : 2023-12-09 13:42 UTC (9 hours ago) (HTM) web link (github.com) (TXT) w3m dump (github.com) | pjmlp wrote: | Looks great! | xmichael999 wrote: | wow! | mysterydip wrote: | When I saw saint11's name with it, I knew it would be good. Their | pixel art tutorials are so well presented: | http://saint11.org/blog/pixel-art-tutorials/ | runevault wrote: | Oh wow I didn't realize this was the same guy. I've seen this | tutorial before and the way he lays everything out is | fantastic. | im_down_w_otp wrote: | I've never seen this before, but having perused through it for | a bit I'm convinced this is the absolute best blog on the | entire internet. | dathinab wrote: | Creative names are all fun of fine but this | | - is not easy to google | | - is quite tasteless, less so if murder is mainly something you | see on tv, but for some people murder is sadly much less of an | fictional rare thing | | it it would be a game, story etc. which has that name and covers | that topic it would be fine but naming something pretty unrelated | to that murder is just quite a bit of tasteless and unnecessary | edge; if it had a flock of crows as a log it would at least be a | funny joke | nkozyra wrote: | > is not easy to google | | I guess one could have said the same about "unity" or "unreal" | or even "Godot" at one point. | TrueGeek wrote: | ".net" | morkalork wrote: | Sounds like the title of a 90s horror b-movie "Murder | _.net_ " | DonHopkins wrote: | Which is at least easier to google for than Microsoft COM. | dathinab wrote: | godot is a pretty unique name, tho | robertlagrant wrote: | Apparently hard to search for. | esrauch wrote: | Before the engine I'm sure all ten search results would | have been about Waiting for Godot though. | usrnm wrote: | I wonder what you think of other stupid names, like "parsley", | "cucumber" or "apple"? | karmakaze wrote: | When I read the title, I was thinking it was like saying "Hell | is..." and wondering what would be so bad about making an ECS | game engine in C#. | tomalaci wrote: | I think that the name is too generic and popular. You see | "murder", the word, in most news outlets, vast majority of | movies/games/etc. - any media. | | Sure, you have "Unity", "Unreal", "Godot", ".NET" and etc. but | I would argue that they are distinct and unique because they | have some heavy-weight organizations and popularity behind | them. I also think that they are not on the same level of | generic use as "murder". | | This engine's name, however, will have to compete with the | generic "murder" that is already used in various different | contexts. Surprisingly, you can still find it as top result if | you search "murder engine" so they got that going for them. | | Still, would of preferred if it was maybe some variation of | "murder" word if they want to stick with that. | DeIlliad wrote: | > - is not easy to google | | Nobody is googling "Murder" looking for a game engine and being | disappointed that they can't find it. If you search "Murder | Engine" this is the first thing that pops up. | | > - is quite tasteless, less so if murder is mainly something | you see on tv, but for some people murder is sadly much less of | an fictional rare thing | | I have an immediate family member that was brutally murdered. I | also have no problem with the name of the engine. Of the things | to take issue with, this seems silly. You would hate LOVE2D | which has libraries famously named ANAL and LUBE. | dathinab wrote: | To clarify I find it tasteless and edge, i.e. a bad choice. | This doesn't mean I have a problem with it, nor does it mean | I'm offended by it or think others would be offended by it or | hate it or anything like that. | | I also am not sure why you think I would find LOVE2D | tasteless. The name has a clear connection to what it names, | it paints a clear and positive picture and has a slightly | less obvious joke in it onto which they then double down by | how they name some of their libraries. That has style and | taste. | | But murder is lacking all of that, or at least it's too non | obvious. This disconnect between the name and what it is/the | picture it paints is why I called it tasteless and edgy. It | feels like there was either a lack of ideas or it wants to | edge on and provoke but the picture this paints isn't | beneficial/good for a 2d game engine in any way as far as I | can tell. Even comes with a (small) to cause harm and require | a renaming later one. | alex_lav wrote: | > To clarify I find it tasteless and edge, i.e. a bad | choice. This doesn't mean I have a problem with it, nor | does it mean I'm offended by it or think others would be | offended by it or hate it or anything like that. | | If it doesn't bother you and you don't think it will bother | others, how is it tasteless? | | > The name has a clear connection to what it names | | So Murder Engine is fine then. | | The desire to clutch one's pearls in disgust over any | little thing is showing up a lot in this thread, I think. | dathinab wrote: | > one's pearls in disgust over any little thing is | showing up a lot in this thread, | | not really, but I guess arguing with you about it is | pointless as you are either ignoring or not understanding | the points I am making and instead try to exaggerate | things by implying that finding something tastless means | much more then it does | alex_lav wrote: | If you're unable to articulate why something is tasteless | beyond "because I think it is", it sounds like you're | sort of just making things up. | | Which is fine. Clutch those pearls. But maybe examine | your behavior as well? | dathinab wrote: | except that I did explain, but you just pretend that part | doesn't exist | | and somehow after I did you started becomming all | provocative and manipulative in how you phrased sentences | so that it seems I sayed/mean/think things I do no | | so idk. by I don't think I'm the person with the problem | here | DonHopkins wrote: | At least it's better than "GIMP". ;) | bdhcuidbebe wrote: | Nobody complained about git yet | DonHopkins wrote: | And doesn't a "debugger" imply the existence of a "bugger"? | furyofantares wrote: | That's the programmer | honeybadger1 wrote: | come on | Mystery-Machine wrote: | This is why we can't have nice things. | blondin wrote: | fully agree. this is a very tasteless name. i wouldn't even go | as far as the easy to google argument with this. | osigurdson wrote: | Murder murder murder murder. Sorry, you aren't the boss of us. | skrebbel wrote: | Woa, how the hell can C# run on an ECS? It has 2MB of RAM | clintfred wrote: | Not sure if I'm supposed to laugh, groan, or shake my head. | Nicely played, sir! | skrebbel wrote: | I like the occasional HN troll as much as the next guy, but | I'm afraid that it wasn't a joke. The page has screenshots | with big fat pixels and says it's an ECS game engine so I | assumed it was, well, a game engine for the ECS. I since | learned that ECS has another meaning that I wasn't yet | familiar with. | | I might've realized this wasn't for the Amiga if I had read | the page (or looked at the screenshots) better though. | maxvu wrote: | I think ECS here is "entity-component system", a design | pattern that seems related to data-oriented design. | | <https://www.gdcvault.com/play/1024001/-Overwatch-Gameplay- | Ar...> | sufficer wrote: | What is ECS? | 6581 wrote: | Entity component system. | lstodd wrote: | And here I was thinking it's about Amiga 600 | vardump wrote: | Same. | | I thought pixel graphics within limitations of Amiga | 600/3000 Enhanced ChipSet. | mortenjorck wrote: | The example game graphics that appear to plausibly fit in a | 32-color palette did not help my confusion! | ch71r22 wrote: | Guessing Entity Component System - a common game engine | architecture | gentleman11 wrote: | A trendy high performance architecture. Unity is trying to | popularize it a lot lately | capableweb wrote: | Not just about performance, but about getting a very well | decoupled code base as well when using ECS. | ctoth wrote: | Unrelated to the game engine, but I just love how someone | unscrupulous could say "the people on that hacker website are | discussing murder." | | I've been thinking a lot recently about what a dedicated | adversary could do with totally innocuous material like this. | Cpoll wrote: | Seems a bit far-fetched, but then again people have taken The | Onion articles at face value. | | Still, with something this easily debunked, is there much | difference between "the people ... discussing murder" and an | outright lie? | tmountain wrote: | This looks great! I'm curious if C# game dev has issues with GC | pauses. | neonsunset wrote: | GC issues pretty much exist in Unity land only. Other game | engines which use vanilla .NET like Stride work without a | hitch. | VHRanger wrote: | Does the C# GC have guarantees about when it will/won't run? | | Dlangs GC for instance guarantee that it will only run on | allocation of new memory so it's possible to architect the | game to avoid meaningful pauses | neonsunset wrote: | In .NET, GC is triggered when a user thread runs out of | memory in an allocation budget and needs more, similar to | what you described [0]. | | Generally speaking, indefinitely preventing GC from running | is not possible (you always end up putting some data on the | heap) therefore an optimal strategy is similar to any other | language - limiting allocations and reusing memory through | object and array pooling. This will ensure that GC pauses | are as infrequent and as short as possible. It's important | to note that if there is sufficient allocation budget - the | GC will _not_ run. | | This way, in a well written code the GC may only ever | trigger every few hundred frames and only take a | millisecond to run. In fact, OSU! has been able to get | consistently good frame times even back on .NET Framework. | | [0] https://github.com/dotnet/runtime/blob/main/docs/design | /core... | | [1] https://maoni0.medium.com/dynamically-adapting-to- | applicatio... | runevault wrote: | I wonder how much of the extra issues Unity has is because it | is a very old version of Mono, since more modern versions of | .NET have become so much more performant (especially Core 3.1 | into 5+). I was sad when .NET 8 came out too late for Godot | to fit in the update for Godot 4.2, so I believe they intend | to make the update for 4.3. | gentleman11 wrote: | Yes. You have to allocate at the start and use object pooling, | in unity and even unreal (unreal has garbage collection too) | zengid wrote: | Yes and here is a really great talk from Miguel de Icaza about | some of the history of adding C# to game engines, and why he's | excited about using Swift in Godot because he claims that | Swift's reference counting avoids the issues of GC pauses. | | https://youtu.be/tzt36EGKEZo?si=WNxwcTPGFbJABKez | pjmlp wrote: | Based on his experience with Mono, less so with .NET proper. | | Also given the state of Swift outside Apple ecosystem, I | guess he only plans to target developers on their platforms. | unclad5968 wrote: | You can write C# to avoid allocations like most other languages | bob1029 wrote: | I've had strong success with trivial object management & | explicitly invoking GC on a delay that is some small multiple | of the simulation delay. The sweet spot seems to depend on | scene content and style of gameplay (how the scene objects are | mutated). For Q3A-style scenes and gameplay, it is extremely | robust. Very few scene elements change tick by tick, so GC | pauses are mostly irrelevant. | | More specifically with .NET6+, I am seeing GC pauses measured | in the 1~5ms range in my DIY engines when I strategically call | GC.Collect() on a rapidly-recurring basis. Another tweak I made | was to disable concurrent/server/background GC in the project | config. Foreground+workstation GC appears to provide the lowest | jitter in this arrangement. My engine's main loop operates on | batches of events pulled from a ring buffer abstraction, and if | one of those events just so happens to be a scheduled GC, then | I deal with it right there in-line on the same thread. I do not | attempt to defer it to a GC thread or some other weirdness. | | The only strategic options seem to be to either explicitly | manage all the memory 100%, or take out the trash as often as | possible. You could also entertain the cruise missile GC | strategy, but Microsoft has made it nearly impossible to | completely disable GC in latest .NET without employing black | magic low level DLL hackery. I can definitely see a situation | where you don't care about GC because you can just recycle the | process between business events, rounds of gameplay, etc. | Process.Exit() is a viable GC technique in some domains. | neonsunset wrote: | Cruise missiles can fly for a long time! Now, ballistic | ones... Either way, almost spilled the coffee over this haha. | magicmicah85 wrote: | Very nice. The editor is very stylized, I like it. I've always | liked monogame because it's performant and cross platform, though | I've never made huge games with it, just a demo here and there | when I get the itch. | gentleman11 wrote: | What is monogame ? | haunter wrote: | https://monogame.net/ | gentleman11 wrote: | But is it widely used? Stable? Popular? Really nice to use? | Actively developed? Is it infrastructure that other higher | level tools build on, or is it like unity? | misschresser wrote: | Celeste, Stardew Valley, Bastion are some famous games | built on it. | starkparker wrote: | Yes. | actuallyalys wrote: | It's a reimplementation of Microsoft's popular XNA | framework that was used for a number of successful games. | Monogame itself has been around for a while and my | impression is that it's a mature and stable project. I | would put it in between libraries like SDL that are often | used as infrastructure and full engines like Unity. | cowboyscott wrote: | Itch page (with downloads) of a jam game made with the framework: | https://saint11.itch.io/neo-city-express | | edit: Impressive for a 72 hour jam game. Great art, writing, and | mechanically interesting in a way that I wasn't expecting. | DiggyJohnson wrote: | Very cool project. | | Man I hate to make this sort of comment, but is this a good name | for this engine? I'd hate for a demo to get pushed down because a | YouTube / Google algorithm doesn't like it. | thuuuomas wrote: | Sounds like a good reason to promote the merits of your own | project, instead of the tools you use. | pvg wrote: | _I hate to make this sort of comment_ | | Easier to just not make it, especially since there's a | (equally-better-never-made) subthread about it. | dazaidesu wrote: | ehhh its a cute name playing off of the "murder" of crows | theme, I like it, makes the theme feel cohesive. Also I don't | get the focus on making sure you have the perfect SEO for every | side project, seems like a good way to not get anything done. | PcChip wrote: | I feel like I'm the only one here that actually agrees with you | skitter wrote: | New game engines and ECS frameworks are cool to see. Taking a | look at the ECS part, Bang, here's an example of a component | abridged/adapted from their Ludum Dare entry: | internal readonly struct CarComponent : IComponent { | public readonly float Speed = 100f; [Slider(1,20f)] | public readonly float Mass = 1; public CarComponent() | {} } | | and of a system: [Filter(typeof(CarComponent), | typeof(AgentImpulseComponent))] | [Filter(ContextAccessorFilter.NoneOf, | typeof(DisableAgentComponent), typeof(CarEngineStoppedComponent) | )] internal class CarMoverSystem : IFixedUpdateSystem { | public void FixedUpdate(Context context) { | foreach (var e in context.Entities) { var car | = e.GetComponent<CarComponent>(); | Vector2 startVelocity = e.TryGetVelocity()?.Velocity ?? | Vector2.Zero; var result = | DoSomeCalculations(car, startVelocity); | e.RemoveFriction(); e.SetVelocity(result); | } } } | | Looks a bit like DOTS (but I haven't really tried that one | either). A system is a class, and which interface it implements | determines when it runs. Haven't seen yet where systems are get | added to the game / how systems of the same kind get ordered. I'm | also curious how a system that does multiple different querries | (e.g. one for cars and one for obstacles) looks like. | | Bang seems to use source code generators - unlike the generic | GetComponent<T> above, TryGetVelocity, RemoveFriction and | SetVelocity seem to be generated based on the existence of the | Velocity and Friction components. I'm not sure why that is, maybe | to cache the component id? | | This isn't an archetype-based framework, instead each entity | stores a dictionary of component id => component and each system | tracks what entities match (also, each entity stores hooks for | e.g. when a component gets added, which is used update which | systems know about this entity). I don't know how good that's for | performance, but for plenty of games performance isn't as | important as ease of development. | | Also looks like changes are applied immediately. Does this mean | that if a system add/remove a component to an entity that affects | whether the entity matches the systems filter, it depends on the | entity id whether the system processes the entity the same tick? | Xeamek wrote: | Since engine is targetting pixel art, isn't ECS a bit of an | overkill...? | | And yes, technically artstyle has nothing to do with game | architecture. | | But in practice, most games of this style are pretty small, and | thus don't really have any real performance requirements, so | ecs'ing everything is overengineering compared to oop-style, | coupled architecture, no? | | Also related: https://youtu.be/JxI3Eu5DPwE | TillE wrote: | Hugely popular little indie game Vampire Survivors, for | example, requires some thoughtful optimization to have a | zillion objects on screen without lagging to death. ECS isn't | the _only_ answer, but it is a valid one. | mattgreenrocks wrote: | I find ECS easier to think about and use. It's effectively | controlled mutation. | skitter wrote: | One of the commonly mentioned performance advantages of ECSs is | the structure of arrays style, which Murder isn't using, so I'm | guessing that they're using ECS less for performance reasons | and more because they favor the programming style. | freecodyx wrote: | C sharp is pleasure to read | TheGrkIntrprtr wrote: | saint11 mentions on his about page: "Murder Engine: 2D Pixel art | C# ECS Game Engine made by Isa! I usually help on the render and | physics side of it." | | Isa: https://isadorasophia.com/projects/ | owenpalmer wrote: | Way to go team, you're killing it ___________________________________________________________________ (page generated 2023-12-09 23:00 UTC)