5 ms·
> The amount of vitriol Java receives in the game development space is rather strong. Java is a language with mandatory GC, tiny objects scattered around the h
by slver 6y ago
> The amount of vitriol Java receives in the game development space is rather strong.
Java is a language with mandatory GC, tiny objects scattered around the heap (poor locality), and no value types or low-level memory access.
This makes it very poor for games (you know, other very basic ones).
But they're rapidly addressing these concerns.
- chii 6y ago> no value types or low-level memory access. i dont think you need value types at all, and you can simulate it by using byte buffers with an abstraction on top of it. After all, what's the difference between value types and a byte array? As for things like low level memory access - you also don't need that in most cases. Graphics libraries will give you enough access. And for any other case, you can always JNI into native code, or call any existing system calls or libraries. Interop between java and native is not that bad (cumbersome for sure, but still possible). The only reason java gets poor performance is the coder doing java is too used to producing garbage (or is too inexperienced to write high performance java code). you can easily avoid most performance problems in memory by pre-allocating and reusing memory by pooling. These techniques are already commonly employed in C.
- saagarjha 6y agoWhy even use a high language at all when you can just write the assembly directly? Clearly you can write "Java" that is patently unsafe in an effort to eke out some performance, but this is not what most people would consider reasonable or desirable. When writing Java, you almost always want to go with the flow, and that at the moment means creating objects. The general fix for this is to have good abstractions for places where heap allocations can be elided, not dropping down to lower-level primitives in an ad-hoc way.
- chii 6y ago> Why even use a high language at all for the parts that don't need high performance. And for leveraging existing libraries, if any are suitable.
- slver 6y ago> i dont think you need value types at all, and you can simulate it by using byte buffers with an abstraction on top of it. After all, what's the difference between value types and a byte array? The difference is a bit like coding in Java vs coding in assembler (more below in an example). > The only reason java gets poor performance is the coder doing java is too used to producing garbage (or is too inexperienced to write high performance java code). Read about Entity Component Systems, the leading architecture of high-performance game engines these days. To do this in Java, with the implied memory locality, would basically mean storing your entire game state in bytebuffers, and constantly unpacking and packing them to do any operation on them. And when you unpack them if you unpack them to a random object in heap, you negate the entire purpose of the locality of a bytebuffer. So you somehow need to do the job raw, reading everything inline and putting it back inline, so you can stay on the stack. I also doubt that the get/put calls you'd need to do to get/set every number would be free. So performance would probably end up quite terrible. > you can easily avoid most performance problems in memory by pre-allocating and reusing memory by pooling. If you make an object pool in Java you'll save on memory alloc/dealloc. You won't achieve memory locality, so your code will be much slower than languages where you can do that.
- kaba0 6y agoHaving thousand NPC objects around is no problem at all. The rendering part is the only thing critical/numerous enough that you may have to optimize to such a low level.
- slver 6y agoNot sure what you cover by "NPC objects" but they easily can participate in physics and AI as well (or at least basic scripted behavior). Also significant game state is not only represented by renderable content.
- kaba0 6y agoWell, if it’s physics as well, then yeah having a separate NPC objects may not be the best idea (though if the physics engine awaits some primitives, like for each “object” 3 coordinates before simulation, and then sets the corresponding position on each NPC, it may be fast enough). But Valhalla really is coming, and until many many games have more than enough performance packed in the JVM already.
- mrighele 6y agoThis is true for JS too, but I never hear as much hate for that language. Also there are classes of games for which the latency introduced by a GC may not be that much relevant (e.g. strategy or simulation games).
- slver 6y ago> This is true for JS too, but I never hear as much hate for that language. Really? https://www.google.com/search?q=JavaScript+is+the+worst+language https://www.google.com/search?q=JavaScript+is+the+worst+lang... If it exists, some people hate it. If it's popular, most people hate it. It's a universal law. /s Anyway, you never hear "JS is not suitable for high-end games" because with JS that's kind of self-evident. While with Java, some people don't know enough to realize that. > Also there are classes of games for which the latency introduced by a GC may not be that much relevant (e.g. strategy or simulation games). Strategy/simulation games can get quite big/complex. Keep in mind you're not just modeling the units, but also the terrain the various particle effects and so on. You can definitely pull off something like StarCraft 1. But people want games to match the capabilities of their hardware, not that of a Pentium from the 90s. And performance remains crucial on mobile. I.e. you may get the game going, but it'll suck your battery empty in record time.
- Ashanmaril 6y agoYou probably don't hear as much hate for JS as a games language because it's not even on the table for a consideration when making a moderately intensive game
- wing-_-nuts 6y ago>But they're rapidly addressing these concerns. Expand?
- slver 6y agoProject Panama (Foreign Memory Access): https://medium.com/@youngty1997/jdk-14-foreign-memory-access-api-overview-70951fe221c9 https://medium.com/@youngty1997/jdk-14-foreign-memory-access... Project Valhalla (Inline Classes aka Value Types): https://dzone.com/articles/project-valhalla-fast-and-furious-java https://dzone.com/articles/project-valhalla-fast-and-furious... The links I picked are a bit random but they'll get you going with the basics.
- kaba0 6y agoFor the great majority of your code base, it doesn’t matter (look at scripting languages inside game engines), and for the performance critical parts, you have excellent profilers and can easily pinpoint which function creates too much garbage and can write that part in an imperative way with arrays and that’s it. It will run plenty fast. Especially now with ZGC, not even tiny freezes should happen.