|
| seanwilson wrote:
| How much do you need to worry about the GC causing frame
| stuttering when writing games now? Object pools are still
| important?
| zokier wrote:
| Well, jdk17 was released just few months ago so I doubt anyone
| has real experience with it for gamedev. But considering that
| game heaps are relatively small (as in <100G) and modern Java
| GCs can manage consistent <1ms pause times, I'd imagine Java is
| more viable for gamedev from that point of view. I'd also
| emphasize that there is large spectrum of performance
| requirements for games and you can make quite a lot these days
| with relatively poor performance characteristics, and on the
| other hand in the top end Java probably is still not good
| enough.
| adgjlsfhk1 wrote:
| IMO java for gamedev is pretty much un-viable due to the lack
| of control over memory layout. You clearly can make it work
| (see Minecraft), but it just sounds painful, and there isn't
| a clear benefit.
| 5e92cb50239222b wrote:
| Minecraft wouldn't be anywhere near where it is today if it
| was not written in Java (which made modding much easier
| compared to native code, and made heavy modding possible).
| So there is a strong benefit, it's just not very obvious.
| Thaxll wrote:
| Minecraft performance is a joke in 2021, when you see how
| much CPU you need to get 10 players in a world.
|
| It is written in Java because the original devs probably
| did not know anything better.
| kaba0 wrote:
| It uses that much CPU because the original devs did not
| know how to program well and it allocates a shitton of
| objects. It is not a good example of a well-written java
| game.
| billfruit wrote:
| Why is controls over memmory layout important for Games?
|
| If you work on Android games for example would you get any
| kind of control over mem layout, irrespective of the stack
| you will be using?
| adgjlsfhk1 wrote:
| For a simple example if you make a simple type to store
| the color of a pixel
|
| class RGB { float r float g float b ... }
|
| and then make an `ArrayList` the list will end up
| using over 2x the memory (128 bytes for object headers,
| 64 bytes for pointers in the list) compared to a language
| with value types. What makes this even worse is that
| since you are using a list of pointers, you can't use
| SIMD for any of your computations, and accessing elements
| will be slow since the values won't be in cache.
| kaba0 wrote:
| Just to add, the really performance oriented hot loops
| can be rewritten with Class-of-Arrays with three int
| arrays for r, g and b values, or even a single one with
| flattened ints, with a user-friendly wrapper RGB class
| provided for outside use. With good OOP-usage it would
| not even be ugly. Performant java code has been written
| like that for decades, and these will get really close to
| C-programs.
|
| Also, there is now a Vector API that let's you use SIMD
| operations with configurable lane width (and a safe
| fallback to for loops for processors without the
| necessary instructions)
| throwaway34241 wrote:
| To add to adgjlsfhk1's answer, if you are writing Android
| games you are probably using a cross-platform game engine
| that doesn't use Java (like Unity) which solves the issue
| but more importantly also allows you to sell your game on
| iOS without a re-write.
| kllrnohj wrote:
| Look up "data oriented design" GDC talks or "AoS and SoA"
| for more in depth information to your question. The very
| brief tldr is that if you want to go fast, you have to
| design for cache locality and memory access patterns.
|
| In particular for Java there's regularly dependent
| pointer loads, which are dreadfully slow on modern CPUs
| and also waste a significant amount of L1/L2 cache.
| kaba0 wrote:
| While not the most ergonomic, one can definitely create
| SoAs in Java and those will be just as fast as they are
| in low level languages.
| kaba0 wrote:
| There are many types of games. For 2D games Java is more
| than performant enough, without question.
|
| Java can be ridiculously fast when only primitives are used
| so I wouldn't put a quite performant game engine past it,
| but yeah, it would perhaps not be my first choice for a new
| AAA game engine.
| 6gvONxR4sf7o wrote:
| What kind of games do you need to worry about memory layout
| for? From the outside, I'd expect that it's as diverse as
| most software, where sometimes you need control like C and
| other times python will do.
| actuallyalys wrote:
| > From the outside, I'd expect that it's as diverse as
| most software, where sometimes you need control like C
| and other times python will do.
|
| I develop games as a hobby, and my understanding is that
| this is literally true, but a little misleading. Games
| are as diverse as other areas of software, but they're
| skewed toward the more complex and demanding end. I don't
| think it's that atypical for a moderately complex game by
| an indie studio to get to the point where memory layout
| is a concern, which I don't think is as true for web
| apps, desktop apps, or other areas of development. That
| being said, I think worrying about memory layout is more
| than a lot of games need.
| shawnz wrote:
| C# has a similar memory model and it's the primary language
| used by Unity games... would you say that's un-viable?
| throwaway34241 wrote:
| For memory layout C# actually has an important difference
| in that it supports value types (so you can have an array
| of vertices without individually allocating each one,
| which has a lot of overhead and drastically reduces cache
| efficiency). They've been working on adding support for
| that to Java for some time but it's not in yet.
| kllrnohj wrote:
| The game engine is different from the game logic. This
| may mean Java is more viable for game logic, but still
| not viable for the engine itself
|
| That said, C# has value types and has for years now.
| Which is hugely important for arrays, and a major, major
| missing piece to the Java performance puzzle. C#'s FFI is
| also way better than the disaster that is JNI, which also
| plays a role here.
| kaba0 wrote:
| You are right, but I would like to add that both of these
| concerns will be solved in the near-far future. Java's
| project Panama tries to tackle the less than ideal FFI
| case with a tool that can create java classes from a C
| header and an API for manually managing memory regions.
|
| While Valhalla is in the works, but it is, I quote, at
| least 3 PhD's worth of knowledge combined to figure it
| out in a backwards compatible way with all the
| interactions of generics, etc.
| gregaccount wrote:
| Looking at that, why isn't ZGC the standard GC in Java 17?
| jbellis wrote:
| One of the graphs shows ZGC with almost 50% more overhead (in
| heap space) than G1, which could very well take some
| applications from "works fine" to "broken." So I can see why
| they'd leave it something to opt in to.
| __s wrote:
| Only stabilized in Java 15
| kaba0 wrote:
| Latency and throughput are fundamentally opposite ends of the
| same axis. And perhaps the majority of Java applications prefer
| better throughput.
| twic wrote:
| But the graph in the article shows that ZGC now gets _better_
| throughput than G1! [EDIT no it doesn 't]
|
| I suspect the answer is that ZGC is not considered mature
| enough, and has a higher memory overhead than G1.
| dralley wrote:
| There are also other GCs that are heavily competitive with
| ZGC, such as Shenandoah. It might make sense to see how
| they all pan out before choosing a new default.
| Sindisil wrote:
| Shenandoah isn't an Oracle maintained feature, so they'll
| never allow it to become the OpenJDK default (though
| another vendor make it so in their distribution).
| cpitman wrote:
| No, that graph may be hard to understand. It shows the
| _relative_ improvement each GC has made since Java 8, not
| the absolute performance.
| twic wrote:
| Ah, i realised it was relative, but i had assumed they
| were all relative to the same baseline! Should have been
| obvious from the way the bars are all level for JDK 8,
| really. That seems a needlessly unhelpful graph.
| kevincox wrote:
| They are essentially 3 graphs displayed together. It
| probably would have make sense to present them more
| separately.
| kevincox wrote:
| The article does not compare the throughput of different
| GCs other than different improvements. The baseline for the
| G1 graph is JDK8 G1 performance and the baseline for the
| ZGC graph is JDK11 ZGC performance. There is really nothing
| that can be directly compared between the two.
| vips7L wrote:
| G1 is probably still a better choice as it "balances throughput
| and latency". ZGC also wasn't generational until recently.
| hashmash wrote:
| I see that generational ZGC is under development, but have
| you been able to try it out? I don't see any EA releases for
| it.
| vips7L wrote:
| I have not tried it. I just saw the commits (it was 5
| months ago), so I had assumed it was merged.
| Rovanion wrote:
| Absolute gc throughput and overhead.
| thomascgalvin wrote:
| Those latency and pause-time numbers are pretty sexy. 200ms is
| still probably too high for some applications, but for everything
| I work on, this is incredible.
| hedora wrote:
| Those are P99 latencies. Not sure how they measure, but my
| assumption is that, if you probe the JVM at a random point in
| time, ZGC (P99 = 0.1) will be unresponsive for 100us 1% of the
| time.
|
| That's... not incompatible with being useable in a low latency
| service, but 100us is 2.5 x longer than a sync disk write these
| days, and they don't report max latency.
|
| My take on the article is that GC has gotten quantifiably
| better since Java 8, but not qualitatively better:
|
| The types of projects that had to abandon Java due to GC (and
| JIT) latency 10 (or 20) years ago still shouldn't consider
| using Java.
| kaba0 wrote:
| I'm by no means an expert but even the OS's scheduler can
| cause pauses on the range of 1ms -- so the applications that
| can't use Java, cannot really use ordinary OSs to begin with,
| can they?
|
| Like, yeah, I would probably not write something like
| pipewire (linux's new audio processing project) in Java, but
| other than that and like some really low latency trading
| niche (where FPGAs are dominant now as even general CPUs are
| slow), where would it preclude the usage of Java?
| adgjlsfhk1 wrote:
| The Linux kernel has realtime and lowlatency versions that
| help a lot here.
| pjmlp wrote:
| Note, only relevant for OpenJDK and the JVMs based on it, there
| are other GC available to other JVMs, including real time ones.
| pkoperek wrote:
| Genuinely interested - could you share some good resources
| about it?
| Thaxll wrote:
| https://www.azul.com/
| vips7L wrote:
| OpenJ9 as well: https://www.eclipse.org/openj9/
| ece wrote:
| Some more info on OpenJ9 GCs here:
| https://developer.ibm.com/articles/garbage-collection-
| tradeo...
| pjmlp wrote:
| For example, in what concerns real time GCs, these are good
| books,
|
| "Hard Realtime Garbage Collection in Modern Object Oriented
| Programming Languages."
|
| https://www.amazon.com/Realtime-Collection-Oriented-
| Programm...
|
| The author is one of the founders of Aicas real time JVM,
| https://www.aicas.com/wp/products-services/jamaicavm/
|
| "Distributed, Embedded and Real-time Java Systems"
|
| https://link.springer.com/book/10.1007/978-1-4419-8158-5
|
| PTC is the other company alongside Aicas, that still sells
| real time Java systems,
| https://www.ptc.com/en/products/developer-tools/perc
|
| IBM J9 has the evolution of the Metronome GC, https://www.res
| earchgate.net/publication/220829995_The_Metro...
|
| And it has extensions for value types, via packed object
| data, https://www.ibm.com/docs/en/sdk-java-
| technology/7.1?topic=ob...
|
| Someone else already referred Azul, they also have extensions
| for value types, called object layouts,
| https://www.slideshare.net/AzulSystems/jvm-language-
| summit-o...
|
| Then there are special flavours like microEJ or the Android
| Java snowflake.
| tannhaeuser wrote:
| graalvm and graalvm's svm/native-image as well, the latter
| having only SerialGC, with G1 in EE only, and crashing ;(
| bob1029 wrote:
| As a .NET developer I am a little envious of all the GC knobs
| that Java developers get to play with.
|
| If I could have only 1 new GC thing from Microsoft, it would be
| the ability to totally disable GC during the lifetime of a
| process. I don't even want to be able to turn it back on.
|
| I have a lot of scenarios where I could get away with the cruise
| missile approach to garbage collection. No reason to keep things
| tidy if the whole world is gonna get vaporized after whatever
| activity completes. Why waste cycles cleaning things up when you
| could be providing less jitter to your users or otherwise
| processing more things per unit time?
| zokier wrote:
| Shenandoah GC is conspicuously missing despite having similar
| availability to ZGC and competitive performance characteristics.
| maxpert wrote:
| I've used Shenandoah GC with great success and I recommend
| anyone considering ZGC (specially on Kube and container
| environments) to try Shenandoah first. You won't have to do
| additional work to enable large pages, yet your performance is
| pretty close.
| papercrane wrote:
| It would be good to see the numbers, but I suspect the reason
| is just that the author used the Oracle build of OpenJDK which
| doesn't include it.
| twic wrote:
| Shame this doesn't show the CMS collector, which was present in 8
| and 11, but removed before 17. CMS was the go-to option for low-
| latency collection for a long time, so it would be good to see
| how it compares to the modern options.
|
| It would be particularly interesting from the perspective of
| someone working in a shop which still has lots of latency-
| sensitive-ish workloads running on JDK 8 with CMS!
| jbellis wrote:
| Here is the comparison I did with Cassandra workloads,
| comparing CMS with ZGC: https://jaxenter.com/apache-cassandra-
| java-174575.html.
|
| (TLDR, ZGC is a huge improvement.)
| lmilcin wrote:
| Also, it would be interesting to see this progression from at
| least 1.4. By the time 1.8 was released I had the impression
| that GC is already pretty well optimized for throughput.
| twic wrote:
| Although if your ulterior motive is to persuade people to
| upgrade beyond 8 and 11, you probably don't want to suggest
| that performance has basically plateaued.
| lmilcin wrote:
| I don't see how this is bad.
|
| JVM is pretty well optimized and it is much closer to raw C
| performance than most other popular languages. You could
| also say that C is bad because its performance plateaued a
| long time ago.
| jonhohle wrote:
| C maps more closely to assembly/hardware than most other
| languages. Saying C has plateaued gets pretty close to
| saying it's hardware performance that's plateaued.
| SubjectToChange wrote:
| If C mapped to "hardware" so well then OpenCL, CUDA
| C/C++, SYCL, ispc, etc wouldn't be necessary. The rising
| importance of accelerators is a big issue for the future
| of C.
| Jensson wrote:
| Those languages maps to GPU's, C maps to CPU's. Those are
| on the same level as C, they aren't the real instructions
| that GPU's run but they are a pretty good abstraction for
| GPU instructions.
| SubjectToChange wrote:
| ispc is explicitly designed to take advantage of SIMD on
| CPUs and GPUs, its existence is directly related to the
| shortcomings of C in this area. Likewise, SYCL exists to
| target accelerators because C isn't even close to
| supporting heterogeneous hardware or programming. In any
| case, C does not map well to a massive amount of hardware
| running in production right now.
| Jensson wrote:
| A CPU can run any program written for a GPU, yes. But the
| languages you talk about are no closer to how a CPU work
| than C is, they might be more ergonomic if you want to
| take advantage of SIMD instructions but they don't do
| anything you can't do in C and there are a lot of things
| you can't do in them since GPU's are much more limited
| than CPU's.
| kaba0 wrote:
| C doesn't map any more closely to assembly/hardware than
| most other low level languages. If anything, hardware
| tries to conform as much to C programmers as they can.
|
| Hell, now Java has much better SIMD support than C, even
| as a high level language.
| Jensson wrote:
| Not sure what you mean, SIMD instructions maps perfectly
| well to C. You just call them like you call any other
| thing. What C doesn't do well are the exact CPU memory
| load order, how it caches things in the CPU etc. But no
| language can do that as you can't even control that in
| the machine code sent to the CPU. But most things you can
| do in machine code can also be done in C, and then things
| you can't can be done in inline assembly.
| gunnarmorling wrote:
| I suppose what they referred to is Java's (currently
| incubating) vector computation API. It lets you express
| vectorized algorithms in high-level way, with the API's
| methods being translated of the corresponding SIMD
| instructions of the underlying platform. I.e. you'll get
| vectorized execution on x86 and AArch-64 in a portable
| way, including transparent fallback to scalar execution
| if specific operations aren't supported on a specific
| target platform.
| Jensson wrote:
| Right, but that would still mean that C is closer to the
| hardware than Java. Java has a high level but less
| powerful solution, since you can only use it on vectors
| and not arbitrary data anywhere. You can write a similar
| function in C which compiles differently depending on
| where you compile and falls back in the same way, just
| that C gives you the option to use the hardware dependent
| instructions anywhere if you want.
| kaba0 wrote:
| I'm not sure I understand you: in C there is no standard
| way for SIMD afaik. There are pragmas on for loops, or
| other compiler specific tools but the language itself
| don't have any notion of lanes or SIMD instructions.
| Jensson wrote:
| > but the language itself don't have any notion of lanes
| or SIMD instructions.
|
| C doesn't need it, you can just call CPU instructions
| like functions. SIMD is just another kind of CPU
| instruction, so C supports it. That works in C since you
| have a direct view of the memory layout. It doesn't work
| in higher level languages where memory is abstracted away
| from you, in those you need the higher level concepts you
| are talking about in order to take advantage of SIMD.
| gunnarmorling wrote:
| These instructions are ISA specific though; i.e. in C
| you'd have to implement your solution once using x86 SIMD
| instructions and once using the AArch64 counterparts.
| You'd also have to account for different vector lengths.
| Whereas the Java API does all that for you automatically,
| e.g. automatically taking advantage of longer vectors
| when running on AVX512, and shorter ones elsewhere.
|
| I think that's what people consider "better" about the
| Java approach (at least I do). That's of course not to
| say that you cannot do all this in C as well, but I think
| having these capabilities in that portable way available
| in Java makes SIMD useable for a huge audience for the
| first time which didn't consider that a realistic option
| before.
| ozim wrote:
| Which does not matter because most of stuff still rides Java 8.
| JanecekPetr wrote:
| ...and they're missing out, that's exactly the message. By the
| way, I'd be shocked if Java 8 was still more than half of the
| running server-side JVMs. There's a lot of them for sure, but
| I'd be willing to bet it's gonna be less than a half now, and
| declining.
| guenthert wrote:
| They continue to use Java 8 as they see to reason to change.
| Article like this are meant to motivate those laggards.
| Thaxll wrote:
| What is not shown is those benchmark is how much CPU is used for
| each GC. For example the latency for ZGC is much lower but does
| it means it uses more CPU than G1.
| [deleted]
| kaba0 wrote:
| Just sharing this really great benchmark series on JVM GCs,
| though it doesn't include the latest versions of OpenJDK:
|
| https://jet-start.sh/blog/2020/06/23/jdk-gc-benchmarks-remat...
| jimsimmons wrote:
| These GCs have a 1GB overhead when working with a 16GB heap.
| That's 6% of your available memory. I was expecting modern GCs to
| be way more efficient so I'm kinda shocked this is what state of
| the art is.
|
| I also wonder how much of the progress to "Sub (200) millisecond"
| latency target is due us just having faster machines. I honestly
| have no model to tie this to actual performance of my code. I
| guess it translates but not really sure how.
|
| Not bagging on Java ---- I am just surprised how inefficient an
| industrial strength GC can be. I understand why manual memory
| management still holds its own now.
| dehrmann wrote:
| It's worth noting glibc isn't zero-overhead, either.
| naasking wrote:
| > These GCs have a 1GB overhead when working with a 16GB heap.
| That's 6% of your available memory.
|
| 6% memory overhead while preserving throughput is actually
| quite excellent. Just a little more than the average
| fragmentation overhead under manual memory management.
|
| Manual memory management can "hold its own" because it can
| tailor the allocation/release profile to the problem and
| aggregate some of those overheads.
| cowsandmilk wrote:
| > due us just having faster machines
|
| ?? These benchmarks keep the machine constant. And I'm not sure
| we've seen faster machines in a long time. Clock speeds have
| remained fairly constant and gains are solely in more cores.
| kaba0 wrote:
| Seeing that RAM is the cheapest resource to scale (and that
| cleverly using it saves energy, given that Java uses the least
| energy out of managed languages) it seems to be a very good
| tradeoff.
| kllrnohj wrote:
| Accessing RAM is very slow and CPU caches don't scale,
| though. So it's not as simple as you're presenting it
| kaba0 wrote:
| Well, for general computing I don't think we have an answer
| either way. Yeah, for some hot loop with an array we get
| insane performance, but that is a very specific workload
| and not applicable everywhere. What about a chat
| application, which parts of the memory should be physically
| close to each other?
|
| Also, Java's GCs are compacting, putting similarly old
| objects relatively close to each other. The same random
| chat program in C might use a linked list with worse
| characteristics so it is really not that obvious to me what
| would be a good solution.
| foldr wrote:
| Manual memory management can also have overhead due to e.g.
| fragmentation. I don't know if it approaches 6% in realistic
| scenarios.
| pkolaczk wrote:
| Wait, fragmentation is not included in that 6%. It is that a
| GC with no fragmentation will already suffer a 6% overhead. A
| region-based GC will suffer from additional temporary
| fragmentation on top of those 6% as well, because some
| segments can be filled only partially with live objects until
| they are compacted. That effect might be actually bigger
| because allocations are done only from contiguous space, and
| it can't just try to allocate from the "holes" until it
| compacts them. And you also need some additional room to do
| allocations from in order to avoid too frequent GCs. So I'm
| practice it is not 6% but sometimes 600%.
| foldr wrote:
| Yes, sure. But you do still need to compare the total
| overhead associated with manual memory management (which is
| not zero) to the total overhead associated with GC. It's an
| empirical question which is larger in any given case. And
| of course it depends on the implementation of malloc and
| the implementation of GC.
|
| I'm not expressing a view as to whether the overheads of
| manual memory management are typically comparable or not. I
| really don't know.
| pkolaczk wrote:
| The total memory overhead of manual memory management can
| be virtually zero if you're careful enough to avoid
| fragmentation (and you can because it is manual, so you
| control a lot of details). There is for example no
| constant header for each allocated chunk. In Java you pay
| additional 16B for each allocated object and you can't
| get away from that overhead.
| foldr wrote:
| Yes, manual memory management can always be better with
| arbitrary amounts of tuning. However, I think the more
| interesting question is how the overheads compare in
| typical applications written in a reasonably
| straightforward and maintainable style. In practice,
| fragmentation can be a difficult problem to avoid when
| using manual memory management. For example, Firefox
| struggled with it for a long time.
| pkolaczk wrote:
| A web browser is a huge and complex app. The argument it
| struggled with memory issues is moot if you can't show a
| comparably featured app written in Java to compare memory
| use.
|
| Anyways, I've got plenty of anecdotal evidence where Java
| apps take order of magnitude more memory than their close
| counterparts written in languages that use manual memory
| management. Not browsers, but things like benchmarking
| tools, webservers or even duplicate file finders
| (shameless plug:
| https://github.com/pkolaczk/fclones#benchmarks - there is
| one Java app there, see its memory use :D)
| foldr wrote:
| We're talking at cross purposes here. I did say that I
| wasn't expressing a view as to whether the overheads of
| manual memory management are typically larger than the
| overheads of GC. I don't know if they are or not.
|
| The point I was making was just that you do need to
| compare empirically the typical overheads of each to make
| a meaningful comparison. The 6% figure in isolation
| doesn't tell us very much.
|
| As you point out, it is difficult to make these
| comparisons on the basis of anything other than anecdotal
| evidence, since it is rare for applications of
| significant size or complexity to be implemented in
| multiple languages.
| atom3 wrote:
| According to the cppcon talk about Mesh [1] (an allocator
| that implement compaction for C++ programs), the overhead can
| be massive too (17% overhead measured on firefox, 50% on
| redis!)
|
| [1] https://youtu.be/XRAP3lBivYM?t=1374
| jimsimmons wrote:
| Nice link. I guess theoretically you can always optimise
| this in languages with manual management. With complex GC
| you have to figure out a way to tame the beast and I'm not
| sure if it's easier to reason about
| pron wrote:
| Sub-millisecond is already here with ZGC, and it's not much to
| do with faster machines (machines haven't become that much
| faster over the past ten years) but with more sophisticated
| algorithms.
| dandotway wrote:
| As Java is generally the fastest GC'd language, what's the
| current state of Java gamedev?
|
| Once upon a time, this indie Java game called Minecraft became
| the most successful game of all time.
|
| But from the few minutes of research I just did, Java cannot be
| deployed to many commercially important systems -
| Nintendo Switch - PlayStation - iOS
|
| It appears Java is only still viable for Windows and Android, and
| the 1% Linux desktop market.
|
| There used to be the GCJ project which would in theory let you
| run Java anywhere you had a C/C++ compiler, but Oracle's
| litigiousness killed that because the Java[TM] "platform" must
| run the official Java[TM] bytecode.
|
| It appears C# via Monogame lets you deploy to all desktops
| (Win/Mac/Linux), mobiles (iOS/Android), and consoles
| (PS/Switch/Xbox). So ironically C# seems to now be the "write
| once, run anywhere" fulfillment of the original Java promise.
|
| [EDIT: grammar.]
| admax88qqq wrote:
| Seriously, with sub-ms pause times of ZGC you could run a GC
| every frame and have tons of time to space for actual
| processing.
| dandotway wrote:
| It sounds very nice but if more than half an indie game's
| revenue comes from Nintendo Switch then you need a low
| friction way to get your .java files running there. You also
| need a proven audio mixer stack so you can load
| background_music.mp3 and play bang.wav and boom.wav without
| any popping or leaks. Right now Java seems sort of iffy on
| consoles, as in, you could maybe spend a ton of time and/or
| money to get an effort like GraalVM production-grade working
| there, but no one has bothered to do it yet. It seems to be
| much lower friction to just use C#/MonoGame, or SDL2 with
| your scripting language of choice that compiles with a C/C++
| compiler, or a proven game engine.
| JanecekPetr wrote:
| For native binaries, we now have
| https://www.graalvm.org/reference-manual/native-image/, but it
| probably doesn't yet work nicely with game frameworks? Not
| sure.
|
| There are some engines, frameworks: https://jmonkeyengine.org/,
| https://litiengine.com/, https://libgdx.com/,
| https://www.lwjgl.org/.
|
| But I have no real experience with any of those.
| pjmlp wrote:
| You can on iOS, for example with Codename One or Gluon Mobile,
|
| https://www.codenameone.com
|
| https://gluonhq.com/products/mobile/
|
| They are also quite happy to sponsor possible console ports.
| aetherspawn wrote:
| Is Java GC ("the best") really that much better than something
| with immutable heap ie Haskell?
| dandotway wrote:
| I love functional languages but is anyone actually using
| Haskell to develop for Nintendo Switch and PlayStation? Can
| you use Haskell on the Nintendo Switch to access a robust
| audio mixer stack?
|
| F# can be used with C#/MonoGame which seems to run well
| everywhere so that's one route to functional programming
| gamedev. Another route appears to be to use SDL2 with a
| functional language that supports ANSI C bytecode runtime
| fallback. E.g. OCaml has a bytecode compiler and an ocamlrun
| runtime that can be compiled with an ANSI C compiler. But I
| don't know what the GC latency guarantees are for the
| bytecode runtime. OCaml's native low latency GC benefits from
| Jane Street's contributions because Jane Street uses OCaml
| for high frequency trading. But bytecode OCaml running on
| Nintendo Switch isn't the same thing as native Linux OCaml.
| kllrnohj wrote:
| Java's FFI and value type situation are the two major missing
| pieces for Java gamedev. C# has better stories for both, and
| has from the beginning.
|
| Don't confuse Java having the fastest GC with Java being the
| fastest GC'd language (especially not in all situations)
| kaba0 wrote:
| Java's new better FFI is almost ready with project Panama and
| value types will come, but it is exceedingly hard to retrofit
| into a language (but the idea for the exact semantics might
| have formed already!)
| cesarb wrote:
| > Don't confuse Java having the fastest GC with Java being
| the fastest GC'd language
|
| I've always wondered, it's likely that Java has the fastest
| GC because it _needs_ to have the fastest GC, otherwise it
| would be a bottleneck. Other popular languages probably don
| 't depend as much on the performance of their memory
| allocation primitives.
| winrid wrote:
| You can compile to iOS/Android with libgdx.
|
| I've been doing this with a game I'm building that has a custom
| 3D OSM map renderer.
| mcdonje wrote:
| The throughput & latency charts have JDK8 pegged at 100%. Since
| that's meaningless and the value is in the difference between the
| JDK versions, it should be represented as a delta.
| vletal wrote:
| I like how this reached the top page soon after "Go does not need
| a Java-style GC" (https://news.ycombinator.com/item?id=29319160).
|
| Moreover, are the significantly lower GC pause times help improve
| snappiness of GUI apps, such as IntelliJ IDEA?
| fnord123 wrote:
| Current IntelliJ uses Java11 and has gotten slower over the
| past few years (anecdata from my own use) - so probably not.
| hiram112 wrote:
| This is what I've noticed too. Intellij has never exactly
| been speedy, but it had so many great features that it was
| worth it compared to other slow IDEs like Eclipse. And using
| a basic text editor like VIM or even VS Code with a big Java
| project isn't really feasible like it might be in other
| languages like Python or Node.
|
| However, now it is really bogging down. I'm sure it doesn't
| help that I've got several IDEs open along with some
| monstrosity of a "microservice" framework running half a
| dozen docker services and DBs on an older Macbook Pro, but
| it's true that app and OS devs tend to use all increases in
| CPU and ram, and so absolute performance and battery life
| never seems to get better over the years, regardless of how
| much the underlying hardware itself has improved.
| vips7L wrote:
| VS Code is fine with with big projects, I've been using it
| for 2 years. The language server is Eclipse after all.
| pjmlp wrote:
| Red-Hat is behind most of the Java plugins, so their
| quality is quite good, there is only the pain to live
| with Electron.
| thies wrote:
| Since 2020.x it's definitely slower. The addition of
| jetbrains space doesn't seem to help either and removing the
| plugin itself makes the whole ide unstable
| vips7L wrote:
| I wish they would just release a light version, without all
| the database, spring integration, and other crap. I just
| want a light language server.
| matsemann wrote:
| Just deactivate the plugins?
| 5e92cb50239222b wrote:
| Try power saving mode (look in ctrl+shift+a).
| absove wrote:
| wouldn't community edition fit the bill? Those things you
| mention are the main difference with ultimate.
| vips7L wrote:
| Not sure. I moved to VS Code + Eclipse LS and it's such a
| more pleasurable experience. However, it doesn't support
| SBT which is the build tool my company uses.
| aenis wrote:
| Not just slower, also energy hugry. My m1 max running pycharm
| loses about 10pct of charge an hour on their crappy bundled
| jvm, and around 4% on the latest java17-based ones, but does
| act weird at times when using them. Its probably down to
| metal vs opengl. Disappointing.
| pjmlp wrote:
| The GC might help, but it doesn't do magic when threads aren't
| used the correct way, too much stuff lands on the UI thread or
| synchronous IO is used all over the place.
| [deleted]
| edgyquant wrote:
| That's the magic of HN (or maybe it's a form of the Baader-
| Meinhof Phenomenon.) When one topic reaches the front page it
| seems like a couple more based around it hit the front page the
| same or next day, which allows us to expand on what we've
| learned.
| Erlangen wrote:
| Intellij uses UseConcMarkSweepGC gc, which has been deprecated
| since Java 9. Jetbrains is still investigating the use of ZGC.
| https://youtrack.jetbrains.com/issue/IDEA-247824
| darksaints wrote:
| Honestly this is the most frustrating thing about Jetbrains.
| Stop investigating shit and just use the new JVMs already.
| There is no excuse for using deprecated JVMs.
| lmilcin wrote:
| I am pretty sure Jetbrains cares their product works well
| for a lot of people and they know better than you which JVM
| is better for their product.
|
| It is not like it restricts what you can build with it.
|
| We may not know their exact decision process but it is
| incredibly ignorant to assume they are just doing this out
| of laziness or incompetence.
| darksaints wrote:
| They've already explained their reasoning, I don't have
| to assume anything. Their reasoning is bad:
|
| * They've fixed long-known bugs in the JVM
|
| * They've added sub-pixel anti-aliasing and other visual
| rendering enhancements.
|
| Both of these are clear improvements on the JVM, and very
| likely to be accepted upstream, but instead of
| upstreaming them, they decided to create a long-running
| fork and package it as their own runtime. And like all
| long-running forks, they're struggling to keep up.
|
| So we are left with two choices: abandon the hope of a
| functional IDE that only works well on a customized
| runtime, or abandon the litany of performance,
| capability, security, and stability improvements in the
| JVM standard and reference JVM implementation.
| astange wrote:
| This is so removed from reality that it's difficult to
| know where to start.
|
| For starters, sub-pixel aliasing is a standard part of
| the JDK and isn't a Jetbrains addition.
|
| What exactly is stopping you from using a standard JDK17
| build with Intellij? How is the IDE not functional for
| you when doing so? How is it improved when using the
| JDK17 runtime they have on their github page?
| darksaints wrote:
| This is easy:
|
| Standard Jetbrains Runtime - slow as fuck, missing a
| whole host of performance improvements, security updates,
| and bug fixes since the fork occurred back in JDK8/9 Era.
|
| OpenJDK - ugly as sin, gui becomes glitchy, lose out on
| customer support channels (first thing they tell you is
| to use the standard jetbrains runtime)
|
| Newer versions of Jetbrains Runtime - have to reinstall
| manually every time you update your IDEs. You also lose
| out on customer support, as they are beta software.
|
| This isn't really a hard problem to solve: find a way to
| upstream your improvements to the JVM, and then package
| the upstreamed version. All of these problems go away,
| and you're even relieved of the burden of maintain a long
| running fork.
| astange wrote:
| Yes, this is easy:
|
| - The current JBR is JDK11, not JDK8. - You don't need to
| reinstall anything to use an alternative JDK with the
| IDE. Just set the IDEA_JDK envar to the JDK of choice. -
| Ugly as sin is an opinion. I use the IDE with linux on a
| hidpi display. Looks perfectly acceptable to me...even
| running with JDK18. - I just reported an issue while
| running with the JBR17 a few days ago. Jetbrains was
| perfectly responsive to my issue.
| lmilcin wrote:
| But what is _your_ problem with this? Do you _really_
| care which JVM is being packaged or you are just picking
| on something that isn 't a problem?
|
| Have you had a problem running IntelliJ IDEA?
|
| I am pretty sure that if I was distributing a very, very
| complex Java application for a very, very wide variety of
| audience (like people who aren't even developers because
| IDEA also caters to these people) I would distribute it
| with JVM packaged.
|
| And then the user should not care which JVM exactly is
| being distributed. You only need to care about the end
| result.
|
| Let me know the last time you cared which version of JVM
| is used by any of the SAS products you subscribe to.
| darksaints wrote:
| Yes, I care. Because while jetbrains makes an excellent
| IDE in terms of functionality, they have extremely shitty
| startup times and garbage collection pauses. These are
| both areas that have received a lot of attention in the
| reference JVM in the versions subsequent to their fork.
| All of the performance problems literally disappear by
| using a newer OpenJDK version, but then the GUI starts to
| look and act weird.
|
| I don't know why you would assume that I am asking for
| them to not package a JDK at all. That's a fucking absurd
| assumption, and nothing i have said has even suggested
| that. All I'm asking for is for them to upstream their
| improvements and package their IDEs with OpenJDK by
| default so we don't have to choose between Jetbrains
| improvements or OpenJDK improvements.
| melony wrote:
| I don't understand why they are not shipping their own
| bespoke GC to go with Intellij, Jetbrains is already
| building their own JVMs.
| astange wrote:
| Edit the idea64.vmoptions config file and use the GC of
| your choice. I've been running with ShenandoahGC for quite
| some time now and it's been working great.
|
| Also, see https://github.com/JetBrains/JetBrainsRuntime/rel
| eases/tag/j... for a JDK17 runtime for Intellij products.
| I've been running this too and it works great (but does
| require some tweaks to the vmoptions file).
| vips7L wrote:
| I tried this last year but the version they shipped with
| IDEA didn't have ZGC and using an external JVM caused
| some weirdness in the GUI for me.
| parhamn wrote:
| Curious before I try it, is the speed/performance any
| better?
| astange wrote:
| It depends. There is less latency in the IDE due
| primarily to better GC (just as the article describes). I
| think the speed is better too on things like indexing the
| code base, but that could depend on your computer. I'm
| running on a 32core high end AMD system with lots of RAM,
| and I increase the heap setting in Intellij to 4G, etc. I
| think the IDE is subjectively better.
|
| We run all our production applications on JDK17 too,
| which is why I push to run everything on 17.
| 5e92cb50239222b wrote:
| Text can look pretty bad if you're using other JVMs
| without their patches.
| hawk_ wrote:
| Yes particularly on Linux, any non jetbrains jdk running
| intellij looks awful. I don't know if the consider it as
| some kind of competitive advantage to not submit fixes
| upstream.
| The_rationalist wrote:
| A part of their patches (at least for emojis?) got
| recently merged
| belter wrote:
| What are they doing in the JVM to make text look good?
| pjmlp wrote:
| They are in bed with Google, so they need to spend their
| resources improving Kotlin use cases instead.
| Ind007 wrote:
| It is defaulted to G1 now(I have 2021.2.2 version).
| Erlangen wrote:
| I am running 2021.2.3 now. `ps aux | grep GC` still shows
| "-XX:+UseConcMarkSweepGC"
| stusmall wrote:
| -XX:+UseG1GC on my install of clion. Maybe old JVM
| parameters have persisted in settings somewhere?
| cesarb wrote:
| > Maybe old JVM parameters have persisted in settings
| somewhere?
|
| This is an annoying behavior on at least Intellij Idea (I
| don't know about other Intellij products). If you ever
| increased its memory limit (it's an option on one of the
| top-level menus, and it will also occasionally suggest
| increasing it if it ever notices it's using too much
| memory), it copies the idea64.vmoptions file which
| contains not only the memory limit (-Xmx), but all the
| JVM parameters, from the binary directory to your
| configuration directory, and so the JVM parameters on it
| will be kept forever, instead of being changed when you
| update the IDE. The fix is easy: find that copied
| idea64.vmoptions file, write down the memory limit on it,
| remove that file, restart the IDE, and go to that top-
| level menu option to set the limit again. This will copy
| an updated set of VM options to your configuration
| directory.
| finalfantasia wrote:
| They changed the default garbage collector to G1 last
| year.[1]
|
| [1] https://github.com/JetBrains/intellij-
| community/commit/edf1c...
| [deleted]
| Sankozi wrote:
| Snappiness problems are often due to lazy loading Java classes.
|
| For example first time loading project settings takes 1+
| seconds while next less than 0.5. This value might get lower
| later if JVM decides to optimize more some parts of UI
| application.
| fnord123 wrote:
| I don't think that's where the issues are. IntelliJ freezes
| when reindexing a project when you change branches from the
| command line.
| msie wrote:
| I've given up on IntelliJ and java-based UI's long ago. So
| disappointing.
| coliveira wrote:
| That's the right way to go. Like IntelliJ or not, Java is a
| legacy technology. I wouldn't want to depend on that.
| kaba0 wrote:
| Lol, you are laughably bad to think that java is legacy.
|
| The JVM is improving with never before seen speed, has
| state of the art GCs, a very good JIT compiler, upcoming
| green threads that will make blocking code automagically
| unblocking and once Valhalla hits with value types, there
| really will be very few areas where java would not be
| applicable.
|
| And on top of that, there is also Graal, which is a novel
| way to run and optimize mixed-language code bases.
___________________________________________________________________
(page generated 2021-11-24 23:00 UTC) |