An era ends ... *sigh*

Disappointing that there isn’t any Skyrim jokes in here yet, so here we go.

3 Likes

But not without touching any code at all, so I don’t see the point. If i have to rewrite all my server cause the network library provided with jme doesn’t work when you push it a bit, it’s still the arrow i was talking about.
And if you don’t like this arrow metaphor : will you take a student project as a base of your application because it’s free ?
Nope, cause you know that even if it works for the very precise thing the teacher asked it to do, it will not work in general, and you’ll loose more time fixing bugs and will end up redoing everything.
Not that I say that jme is a student project (as some person here seems to have problem with parables). But from the point of view of a big studio, it is, and it’s why that even if jme is older than most of commercial engine, no AAA game use it, even if it’s free.
So my point : have we ever been relevant ?
Will we ever be relevant ?

There is a video showing a wall of bricks destroyed by a wall. “Wow, incredible”. Actually, it should not be considered as a jme “proof of concept” video, but as a bullet video. What jme does is wrap itself around it. No problem in that in itself, i’ll come back to that later.
The same is true for the rendering. jme uses lwjgl (or jogl) which in turn uses opengl. Again, not a problem in itself.

But, when you remove this two aspect, what remains ? Well, not much … Still not a problem, though.

So where is the problem ? The problem is that because of this “duke tape” aspect, you have an engine that seems at the pinacle of the technology ( not sure of this expression. At the top, on the bleeding edge, on the state-of-the-art ? ) and still is not capable of easier things, just because there is no free implementation around which it can wrap itself.

I really thing i spent most time finding bugs and writing code to work around them than i spent time developing my game.

Now you don’t care about it, but i have a bug with the rendering engine that doesn’t behavior well before the first “enqueue” call (or, to say it more simply : not before the second simpleUpdate loop). So i have to dig, dig and dig into the engine to find exactly why.
I’ll download the last version of jme tonight (got a usb key with enough space on it) but I small voice inside myself shout that it will not only don’t fix the bugs but also add new ones.

Wait, Bubuche is a guy?
And yes, Web Assembly promises to fix javascript.
And by fix I mean remove it

You’re certainly doing something wrong. But you know… do whatever you want.

It sounds like Unity is closer to what you need, though. You should definitely go use Unity.

1 Like

Regarding all those bugs you are talking about… Have you ever submitted a PR for them?

Definitly try unity, I heard their netcode works out of the box.
(Hint they have none at all)
Or source (their netcode is only working for small scale shooter games)
or unreal (better but still for smalls scale only)

It seems that jme is simply the wrong engine for you, as in totally the wrong engine. The benefit of jme is exactly that I can write a own netcode that is designed around my game, and not force feeded some stuff that I cannot adjust (unity) or that does not fit my usecase.

JME is the ikea of engines, you only get parts and need to combine them yourself.

If you do not want to do much in code, quit jme right now, seriously.

3 Likes

Welcome to literally every framework in the history of programming. No matter what library/tool/framework you use you will eventually find something that doesn’t work the way you want/expect it, and that leaves you with a few options: (a) rewrite your code to use a different framework, (b) rethink how you are using the framework and alter the way you use it to make your needs work well (usually the best bet), or (c) roll your own (almost always the worst option here). Note: I’m not sure what you mean by “push it a little bit” - I’ve seen others on these forums report using it with a significant number of connected clients (more than I would have guessed) without issue. If your “push” is in terms of features, then use a different networking engine (like Netty) that has the functionality you need. If you’re having network problems with a small number of connected clients, it’s almost certainly a problem with your design and no matter what engine you use you will probably face the exact same issue. Networking is hard to get right.

Bullet is a physics engine. You give it numbers about your objects; it runs physics simulations and gives you numbers back. Handling input, managing those objects in a meaningful way, and rendering are a whole different story and require lots of work. That’s what jME is for, and that’s what that video shows. The physics simulation is one small piece of that. That video, then, is actually a jME video, not a bullet video.

“I removed the wheels and engine from my car, and now it doesn’t do anything!” Gee, no surprise there. And actually, look through the code base. jME does a TON of stuff not even directly related to rendering - audio tracks, particle effects, skeletal animation, scenegraph, tons and tons and tons of advanced math, networking, input, etc., etc., etc.

I’d really like to see a quote from a AAA game developer saying that jME is akin to a “student project.” Besides that, AAA game titles are usually targeting a distinctly different set of deployment options than jME is. AAA game titles are usually targeted at a single (or minimally forked) codebase running on PCs and consoles and AAA studios have the money and manpower to dedicate teams of expert C++ devs to writing highly optimized games that do just that. jME is targeted for game developers who want to make great games using Java. The two are very different audiences, so it’s no surprise that you don’t see AAA titles made with jME. This is more or less akin to comparing apples to oranges and wondering why neither one is a grapefruit. As far as I can tell, jME is the best (and most widely used) game engine for Java. A better question is: how is jME not relevant?

The modularity of jME is what gives it its power. If it were not like this then you wouldn’t be able to swap out SpiderMonkey for your own networking engine, or Bullet for your own physics, or the default lighting materials for PBR, etc., etc., etc… If you don’t want to deal with the complexity, then don’t drive a racecar. There are plenty of experienced game devs here who prove every month in the screenshot threads just how much of a “racecar” jME is, but unlike the racecar, jME is nice enough to hide the complexity from you until you’re ready to dive in and deal with it.

Bottom line: jME is a great engine and a very powerful one, but if you don’t like having to program (and apply good software design) to make a game, you’re using the wrong engine. That’s not jME’s fault.

7 Likes

There is posts around where i explain bugs, and even give fix for them sometimes. Last week i downloaded the last version of tonegod, just to find that a bug i commented, explained in details why it’s a bug and how to fix it is still there, untouched. Create a table, add a row, try to remove it and, bam, crash. Why ? Because of a call to the method “remove” on a stock list (java.util.List) with an int as parameter, where you should have an Integer (so you’ll ask to the list “remove this element”, not “remove the nth element”). It just can’t work, it never worked and will never work. And it’s still there.
I downloaded the last jme build (even if it says 3.0.1 … wasn’t it 3.1 ?) and … the rendering bug is still there. Try to do some offscreen rendering (create a viewport, a framebuffer, attach a geometry etc) in the simpleInit method and you’ll get terrible results. Partial fix for this ? Manually add “renderManager.render(0, false)” at the very beginning of the method, fix most problems (not all of them, they seem all gone after 1 or 2 frame, so you have to re-render your scene then).

And most problems aren’t bug, they are missing features. I mentioned the portal culling, the character control (except if you find cool to fly with you go down a steep, bump on every stairs, stick to the wall in air if you walk in its direction), the impossibility to update a part of buffer of a mesh (you have to resend the buffer you want to update, the impossibility to do any secure network without doing manually the chain certificate verification + message encryption/decryption + key management …
And when it’s not a bug, not a missing feature, it’s something wrongly done.
Why the hell can’t i give AssetLoader/Locator to the asset manager ? I can only give it classes of locators and loaders. So, no way to customize the creation of it with some parameters (like “locate things from THIS database” for a locator).
And why can’t I get a Locator from its class (just like you do for assetmanagers and controls) ?
I do have a file that contains both textual datas and a png image (encoded with base64). It’s like a font, but for multiple styles and in one single file, so it’s easy to import etc.
To load the file, i need to load the image. A PNG. So, what should i do ?

  1. re-write the png loading. Sounds dumb, right ?
  2. extends the assetmanager, take a scalpel and with a lot of usages of Java’ reflexivity, add missing features and fix it.
  3. throw away the entire assetmanager and rewrite my own.
  4. make my font loader both a locator and a loader. And as it’s not possible directly, thank to this “gimme a class, i’ll create an instance myself” bullshit, use global (static) variable. I load the font until i need to load the image. Then i store the decoded byte array of the image in a ByteArrayInputStream, in a static variable. Then, i request the assetmanager for the image named “a_dumb_placeholder_with_some_randomness_ending_with.png”. No locator will be able to locate it, except the font loader, which then will give the bytearrayinputstream in the openStream method.

Yes, it’s 4. And it’s ulgy as hell, but, still, works.

As i said it already : i have no problem in doing code, even a lot of it. I do have problems, however, doing only code and never a game. I have no problem doing my own sport choose factory, if then i can walk 100km with it. I do have problem if, in the end, i can’t do that walk.

I never had this problem with Qt (and I think it’s reasonable to call it “framework”).

If i remember well, it was errors in the core of the library, resulting in a crash of the jvm.

So your engine is only made of two external library and your works consists solely in duke taping them together ? I hope not.

not even directly related to rendering - audio tracks, particle effects, skeletal animation, scenegraph, tons and tons and tons of advanced math, networking, input

audio : made by openal. Duke tape.
Particle effects … made by you, and it’s so not done right that I had to scalpel it with reflexivity to add basic stuff like … particle influencer ?
Just a short pause here : you make an engine with the idea in mind of reusability, open source etc. Why, the heck are you using the keyword private ? And it’s not for security, because in a lot of places you have method with public and the comment “internal use only”. So, why “private” ? It just makes it harder to fix bugs. Put that in protected, and voilà.
skeletal animation and scene graph : i didn’t play with the skeletal animation, but how the scenegraph is not directly related to rendering ? I was even told to not use it server side, as it didn’t make sense without the rendering part.
Avanced math. A guy posted an improved version of the quaternion multiplication (btw : there is a big error in the quaternion. I don’t remember exaclty, i could find it, someting like a non “Local” method which does Local stuff). Something like 15 multiplications instead of 60, with more precise results. Answer : no no, it’s a core feature, it may cause problem. The comment in quaternion even said that you didn’t made it. No problem here, it’s a good thing to reuse working stuff but … duke tape (not that terrible actually, doesn’t come with a brand, it’s called quaternion at least).
input. Wow, input. You mean that no keyboard detection input ? For a very long time i say that game shouldn’t use key symbols (a, b, c, etc) but key positions. Yes, think about it a moment : when you press Z (or W, on a QWERTY keyboard) you are actually trying to press “this key under my finger extended”. Same apply for left, right, jump etc. You are not writing a roman, you are using a gamepad in disguise. So you should either use the direct positions of keys or do a reverse keymap on them (what people does in their mind when they decide key assignement).
For the rest, you use an input system designed for “sleeping” programs (no insult here : paint, word, editor in general are sleeping program : the program does nothing (or nothing in essence) and only react to input. So the pipeline of calling a method when an input happens is good) when games are active programs (the game has its own life, does thing even if you don’t do anything, It has its own “time arrow”. The result of this is that most “input callback” just put some boolean to true, because the time arrow initiated by the user action would interfere with the time arrow already existing in the program).
You also have no abstraction between the hardware and the logic. For example, it would make sense to have a trigger when “main action” is performed, this being the touch of a touch pad or the left clic or the mouse … or the action of an AI (subroutine) or an order from the server. It would decouple (not sure of the translation, once again) the hardware and the logic.
Even the emitter/listener system is a heavy and cumbersome system, compared to the signal slot existing in Qt (and with existing version in Java).
Or a system based on reflexivity : if a declare a method called “handle” and taking a “MouseMove” object, then the emission of a MouseMove toward me will call it. Same for network : the server would just have to declare methods and the message dispatching will be made automatically. Plus, you can extend it and add other “handle” method and extend then the procotol in the easiest way possible. The server will then not “send” message to client, but call “handle” on them (and, behind, it will be translated in a sending of the message and the call, if possible, of the “handle” associated method client side). And the client will call “handle” on its connection to the server the exact same way.

Yep, i did write a library like that, using java.nio, and it works as expected.

Mmmm maybe I’ll replay Skyrim, play the remastered edition. I need something to do with all my procrastination time

With all of that typing, you could have downloaded Unity and run through the tutorials by now.

2 Likes

Guys, come on…

May be @bubuche choose the wrong technology or language, but he choose to join this community. I don’t see any reason we have to prove him wrong on this point.

I don’t want to enter such hate conversation like this but I don’t think I like any kind of internet abuse… Just let the guy do anything he want that not harmful to us. People are people, they are different and weird in someway…

3 Likes

You could have sent a PR, maybe tonegod doesn’t have time to fix it at the moment.

I kinda agree with that :speak_no_evil: . Private is simply evil in most cases.

I guess she is not active since more than a year it seems. And yes that is open source, you can not rush in and place orders. You even have to accept a no. Or run your own open source project, that’s allowed. Really.

1 Like

Qt, oh, really free of issues framework? I had to deal with it during its Nokia/Digia times, and by that time it definitely had issues. Just to get it to work with its own Creator IDE on a Win PC had number of steps that weren’t even completely listed somewhere in one place (at least I couldn’t find such a place) and thus it wasn’t “a three-click” thing like with JME. Not near.
QML/QtQuick - ok, a wonderful idea, but it had lack of documentation, so you had to experiment a lot to find how exactly things work. From a 20-years mature project, in the end maintained by commercial company of Nokia’s scale, I would expect a more established workflow regarding features release. Cross-compilation… backward compatibility… well, we’ve gone too much to the side already. Yeah, Qt works in the end. But it’s not so quick and easy to get it to work the way you want it to work.

This is a total fabrication, by the way. Neither method is accurate. His 15 multiply version was inaccurate in a different way that might cause jitter in some common cases. I did everything short of proving that visually. It might be ok but why risk it? If you count the number of quaternion multiply calls made every frame it’s generally in the range of 6-10 times. Given all of the other stuff going on in a frame this reduction of multiplies will make zero measurable difference.

Private methods are used by the class to avoid 9 page methods or because several methods need to call the same sub-functionality repeatedly. Making these protected or public is a horrible horrible horrible idea. Protected methods should only be used when that functionality is SPECIFICALLY DESIGNED to be extended. The fact that you don’t know this shows how little actual software development experience you have.

No… because you have the source code. Fixing bugs is really easy without doing weird extension backflips. Modify the source, recompile, done.

JME already has a few too many protected methods and way way way too many protected fields. Designing a class for extension is more than just plopping a few ‘protected’ keywords around.

Anyway, I’m not sure what you are trying to accomplish at this point. You’ve already said you are moving on to something else and you are being a total jerk about everything else. So whatever it is you are actually trying to accomplish, you are failing miserably.

I look forward to you coming back in a few months, successful, and telling us how stupid we all are again. It will be great… but hurry to it, please.

The community’s interactions with him have always been like this. You can look back through his posting history if you like. He’s “joined the community” only in the sense that he drops in every now and then to insult and poop on peoples’ work in unconstructive ways. I don’t really think the community needs people like that… but might ignore it in some cases.

In this case, he’s already said he’s moving on to something else… so any additional insulting/pooping/ranting is just a waste of time. So I wish he would hurry and move on to whatever is better for him.

1 Like

Making my game I did a lot of code, but only few percent of it was a fix, redo or extension of JME’s base code. I use 3.0, not moved to 3.1. I fixed few bugs that are already spotted and removed in 3.1.
Btw, I don’t count my new rendering pipeline as a ‘fix to the engine’, because most ‘serious games’ created with ‘serious engines’ have its own, specific and customized pipeline too.

Really, 95% of Skullstone’s code is a game code. JME is only a solid basis which helps me to do things that I need to do and does not force me to do things that I doesn’t want.
I have my own GUI engine, because I just wanted to write a GUI engine, it gave me some fun. But I was too bored to make an entryfield just to give a name to savegame slot, so I used a Nifty one.
I had some troubles making things in game, most of them was my fault and a lack of knowledge, not an engine’s issue.

That’s all from me.

6 Likes

That may be the case for you, but not for others. Literally every framework in the history of programming has had or will have people who stop using it because it doesn’t fit their needs. It’s ironic that you brought up Qt, because about a month ago I started a project with Qt only to switch away when I discovered that the particular functionality I wanted would probably be easier to accomplish with something else. Sure, Qt could easily have done what I wanted, but I didn’t have the time then to learn the “Qt way” to accomplish it so I dumped my Qt specific code and moved on. Like I said… literally every framework. The fact that you have had to rewrite your code doesn’t mean that jME is crappy. The fact that I had to rewrite Qt code doesn’t mean that Qt is crappy. (And, as @RiccardoBlb said, Qt has all its own set of troubles. Setting it up initially was a pain.)

If you had a JVM crash, that was probably the fault of a native library or your usage of the engine. Probably not jME’s fault, and even if it was, then you found a bug. Bugs happen. Welcome to literally every framework in the history of programming.

I was making reference to your statement that if you took away rendering and physics there was hardly anything left to jME - and then I countered your claim by pointing out the multitude of things that jME does besides rendering and physics.

OpenAL is a very well established and supported library that jME uses internally to provide very high quality audio support. jME using OpenAL instead of its own is an example of a smart use of libraries (the whole point of libraries is that you do a good job once and nobody else has to reinvent the wheel). If jME didn’t use it, that would mean a whole ton of work that the devs had to put into reinventing the wheel instead of providing good higher-level engine functionality. In addition, supporting OpenAL means that audio engineers have the full power with jME that they can expect elsewhere. This is smart use of libraries, not duck tape.

Nobody can anticipate every person’s need for every feature. Missing a feature that I need != “not done right.” If you need a feature that isn’t there, code it and submit a PR - or politely ask the devs to consider doing it.

Good software design. Especially in a language like Java, there’s a lot to be said for using it.

A scene graph is a logical structure that’s useful but not necessary for rendering. You can render without a scene graph, and you can have a scene graph without a renderer. Whether or not you use one serverside is a design choice that hinges largely on what the server is responsible for. Sometimes it’s good to have a scene graph serverside, sometimes it isn’t.

There’s a good reason that nobody does it this way. The process for converting keyboard scancodes to key codes happens at the OS layer and is highly platform specific. If this is even possible on all major platforms (which I somewhat doubt), then it will require extremely low-level native code that isn’t at all portable. Players often expect to be able to re-map key bindings anyway. Give them an easy way to do that, and the issue goes away. jME provides very reasonable support for the types of input that games usually need. If you want higher-level event support, use one of the excellent community provided libraries (Lemur has outstanding input managing additions) or roll your own. It’s specific enough to individual projects that I’m not at all surprised that it’s not in jME core.

Internally they’re doing the same thing. Qt just does it with a different abstraction. Odds are that neither is “heavier” than the other. A system based on reflection, however, would be significantly more costly in terms of runtime resources. Most people probably wouldn’t want to see this as a default for that reason. In addition, reflection can make it hard to track what’s happening where. If people really want that, it’s probably pretty easy to add a reflective dispatcher to the existing system.

@pspeed added an RPC system to SpiderMonkey. if yours fits your purpose, good, but the fact that SpiderMonkey didn’t have built-in RPC for some time hardly means that it’s an inferior networking engine. Most game programmers probably don’t even use RPC much, if at all, which explains why SpiderMonkey didn’t have it initially.

This thread has been nothing but a rant from both sides with some people (atomixnmc) trying to make it stop.
What amazes me is that bubuche still comes back everytime another post larger than a thesis on the use of quantum mecanics in computer science.

1 Like

I wrote posts longer than that in my tongue language, but it’s a bit harder to do in english (especially during the evening, you can guess why). But it’s not fair to call it a rant or, as someone else said, say i am complaining in a not constructive way.

I am giving ideas. You may not like them, ok. But, still, it’s ideas.

Ok, it’s becoming personal isn’t it ? Just put your nose out of your book, I am talking about the real world here. You can say that private is for this, blablabla. But then you say “recompile”. What is the difference then ? I’ll not have more or less bug if i recompile the class with “protected” instead of “public”. And it will take time and, when later a new version of jme will come, I’ll not be able to use it without redoing every modification I did in it.
And it doesn’t make your engine any more sold anyway, cause i use reflection of copy-past of class to obtain what i need. It’s just heavier, boring and, actually, more a source of bugs than if you put “protected” in the first place. Plus, you’ll have no point until r, g, b, a of ColorRGBA will be public (same for Vector3f etc). Your engine is already, from this point of view, poorly designed. So your are halfway between “well designed” and “open-to-modification designed”, taking the worst of both side.
Reflexivity is a bad thing ? So what are you doing in your assetmanager ?
What are you doing in niftygui, where you need to have fully qualified names of every Controls (and, so, when you do refactoring or obfuscation everything break. Plus you can’t customize the creation of the control).
Is the method “getControl(TheControl.class)” matching the “good programming” principles ?

And, is a network library than automatically write fields onto the network, and consequently, write the actual state of an object in the procotol specification, respecting any OO principle ?

So, stop arguing about “good usage” of the “protected” keyword. Especially when so much aspects of the library need rework, when you put the extensibility of the engine as a reason to be proud of it.

Thanks.

I you received the private message I sent you some time ago. If this is for you pooping and insults, then i can do nothing for your. If things are bad, it’s better to say it, so there is a chance that someone will fix it. I even gave you advices (not best advices in the world, but still), to get a very nice non-answer from you.

I don’t have time to make a long answer tonight.