For each frame, all systems update and sync. If a system takes longer to run, the other systems have to wait for it to finish. This is the biggest complaint against lock step. In free step , all systems run at separate frequencies… they update and sync based on events.
For example, if you declare a primitive variable as volatile , the compiler is not permitted to cache it in a register — a common optimization that would be disastrous if that variable were shared among multiple threads. So the general rule is, if you have variables of primitive type that must be shared among multiple threads, declare those variables volatile. I thought was useful until the last few weeks, when it finally dawned on me or if you prefer, got through my thick head that volatile is almost useless for multi-threaded programming.
Will dual core enhance your gaming experience? Tim Sweeney, the leading developer behind the Unreal 3 engine, was so kind to answer our questions about multi-threaded development with concise answers. I will update this article as soon as I discover new resources… Multithreaded Programming Guide : A complete multithreading programming guide by Sun MicroSystem. This article shows some examples of multithreaded designs and explains how to create, synchronize and debug threads.
Lockless Programming Considerations for Xbox and Microsoft Windows Lockless programming is a way to safely share changing data between multiple threads without the cost of acquiring and releasing locks. Lockless programming is particularly complex on Xbox Designing the Framework of a Parallel Game Engine : this paper describes the architecture of a multi-threaded game engine that is designed to scale to as many processors as are available. Multi-threaded Rendering and Physics Simulation : Learn how to decouple rendering and physical simulation in a multi-threaded environment with a simple physical simulation demonstration.
You are trying to solve a problem that isn't a problem. You seem to think that my approach significantly sacrifices determinism when it really doesn't. You should be more worried about what happens when one player shoots another as he blows himself up in an explosion large enough to kill the first, which is exactly what that article you linked to points out, and in turn this implies that any indeterminacy created by my technique is manageable! So by definition the insanity you have created here isn't even necessary!
You keep referring to the CIV V engine so you probably have read a lot about it.
I can't seem to find it. I am well aware of possible latency issues and solutions between client and server, but all those issues can be solved by letting the client's extrapolate game states and make a prediction of the changes caused by local actions. The difficulty lies in restoring game states on wrongful predictions, which for some games can be solved by sending a complete game state on conflict only.
For non-deterministic game engines this is way more difficult because each client's game state is by definition almost always wrong. To solve this for non-deterministic game engine you'll need to send position-information pretty much non-stop to prevent out-of-sync weirdness. So really, I do understand. I'm just saying that latency issues are not a good excuse to drop determinism.
The "problem" I tried to "solve" is creating a non blocking multithreaded deterministic game loop. You probably agree with me that this isn't easy to accomplish, just a couple of hour ago you claimed that determinism is impossible. You keep saying that I " missed the point " or that I " misunderstand " and calling my implementation " horrendous ".
Why are you saying such provocative things? Most of them not even true: - the sleep 0 loop - impossibility of non-determinism - floating point errors make it non-determinsitic - network packets arriving in the wrong order - very difficult to integrate external physics module I've shown you a different method of applying multithreading and it 'does' have advantages, even if you don't agree with me. This is the pseudo-code of my render loop.
The only mutex is used when switching states. No waiting, ever! Can't get much faster then that right? It is even possible to render at a higher FPS then the update-FPS because all positions are automatically extrapolated and inconsistencies are solved automatically. Not so "horrendous" now, is it? Even if the game is rendering at a meager 10FPS, the game speeds remains steady while still being deterministic.
Maybe we just have different goals for or engine.
Especially for game-engines, there are seldom situations where a "one solution fits all" can be applied. You just said you tried specifically to solve the problem of determinancy, when I argue that it is not a significant problem in the first place, due to it needing to be solved elsewhere, and thus you are needlessly solving a problem that doesn't exist. All you have done to defend against this point is say that it can be managed, which is exactly what I pointed out. I call your method horrendous because the render thread itself is attempting to extrapolate out positions, which is a big no-no, and you use a complicated object hierarchy, plus the internal design of the engine is complex and therefore susceptible to incredibly bizarre bugs.
In fact, everything you do causes the exact problems that made me throw out my own multithreaded implementation due to potentially inconsistent physics states and lag. So if you don't consider those things to be a problem, then why would you offer your engine as an alternative to mine? Mine does nearly the same thing and has the same problems. You basically did the same thing I did except in a much more roundabout, complicated way. You solved nothing.
I think you meant "determinism is impossible". It is not about 'managing determinism', it either is, or isn't deterministic. Simple as that. It not something you 'solve'. The best way for being deterministic is by creating a fixed time step for updating the world e. I find it really strange that you talk about the impossibility of determinism, we are talking about the same thing right?.
Get the item you ordered or get your money back. Viewed times. Therefore it seems like a waste to update some AI logic and then immediately block the simulation thread to wait on the GPU to complete the render of a frame. Unity will then wait on frame 0 to be completely rendered before proceeding. Facebook Twitter YouTube. There are various things you could do to speed it up, for instance, if you are loading copies of a single script in each of the threads, you could compile it to lua bytecode before you launch any of the threads, then put the buffer into shared memory, and have the scripts load the shared byte code without changing.
Just download the sample from my website and see that at update-frame the position of the balls are always the same no matter at what FPS you're running at. If you claim it isn't please give me an example. You say extrapolation of position in the render thread is a big no-no. There is absolutely nothing wrong that, I don't know where you got that idea. There is nothing wrong it as long as you don't actually modify the state which I don't. You also call the internal design of my engine complex to the point it is susceptible to bizarre bugs.
Complexity is an "eye of the beholder" thing. I have no problem understanding what is going, maybe it's too complex from your point of view, but not from mine. However, it is not something I recommend to anybody that is trying to make a game it is better to use an existing engine.
My solution does not have any problems so, I'm not sure why you are saying that we share the same problems. If you manage to convince me that you model is also deterministic, while being able to render at any FPS without a slow down of the game than you'll convince me that your simpler implementation is probably the better one.
If you don't care about a deterministic game which you don't, because you don't even believe in the existence of it then my way of approaching things must seem unnecessary complex. I totally agree. If you don't care about stuff like that, then I too would have used a simpler method.
I really am interested in reading that. This discussion inspired me to type up some stuff of why determinism is a nice thing to have. I still in the process of creating a new version of the engine IF that is your definition of determinism, then every single solution I have ever built for this, including every single solution I will ever build, will be deterministic, and therefore I have absolutely no idea how ensuring that your engine was deterministic had any effect on your engine design. This is one of the reasons I abandoned several of my previous attempts, because of the potentially invalid physics state that would be rendered, even if the physics state itself was always consistent.
Rather than solve that problem, you simply make it worse. I keep pointing out problems your solution has, yet you continue to insist they are not problems. Here's how you guarantee determinism in my model: Make all calculations depend on the previous frames' stale data.
Ensure data gathering is done on the frame start sync step. Poof, its now deterministic. Of course, it now has a frame of lag, too, just like your solution does, even with extrapolation of positions because it is physically impossible for it to account for input it doesn't know about. Come on, it is a normal English word with a clear-cut definition. It is not like I'm making up words here. It's also really important for games not all type of games though , so I thought you would be fairly familiar with the term. My extrapolation does not invalidate the physics state.
Assuming the update-thread runs at 60 FPS then at worst case the extrapolation will account for max. This extrapolation is only used for rendering and not for modifying the physics state. If something goes through a wall because of extrapolation then at the next update frame it will already have been set to the right coordinates. You keep pointing out problems where there are none, yet you continue to insist that there are.
The comments you make, like the one on invalidating a physics state, makes me doubt you have actually read it. I get the impression that you just have glanced over it and thought that it's just some overly complicated jibberish. I don't mind if you don't want to read it, but please don't come up with obviously wrong 'problems' that my engine has. If you make all calculation depend on the previous frame and gather input at start of the frame, then you're missing one important step.
The physics should run at a fixed steps per second, shall we say 60FPS? Now imagine, if you will, your game being rendered on a Hertz monitor. If you decide to render at FPS you're only rendering 60 new frames per second. Simply increasing how many times you update per second won't help you that much. For your engine it is really weird to fix the update-thread to a certain FPS, as they are just 'jobs added to the queue'. The best thing you said is " I have absolutely no idea how ensuring that your engine was deterministic had any effect on your engine design.
Maybe this is the reason why I have such a difficult time explaining to you how determinism should be enforced. On the other hand you say " every single solution I have ever built for this [ If you render your game at FPS how often you call your physics library? You want to update the positions times otherwise rendering with such a high speed has no real benefit.
Calculating physics with a time step determined by rendering speed will break determinism. Box 2D physics are only deterministic of the timestep is constant. Civilization 5 is a turn based game which simplifies creating network-protocols and replay-files, so there is no real added benefit for adding determinism in such a game. This is why I stated previously that the engine for Civilization 5 has it very easy.
An RTS has way more hurdles to overcome so I'm more impressed with the engine used in Supreme Commander 2 and Starcraft 2, even if they don't look as beautiful. It is ignorant to think that CIV's approach is a one-solution-fits-all, which is exactly why I've posted the links on a deterministic non-blocking render loop.
Multi-Threaded Game Engine Design shows experienced game developers how to apply multi-thread techniques to game programming technology to improve. Multi-threaded Game Engine Design. James Tulip. Charles Sturt University. School of Information Technology. Panorama Av, Bathurst, +61 2
If you'd like, I can come up with some resources that explain what determinism is, why it is important for certain type of games, why it is difficult to have determinism without fixing render-FPS and how determinism helps in simplifying network protocols for games among other things. Do you now understand why your game engine is not able to be deterministic without severe consequences?
Thanks for the link on CIV5's engine presentation. Eric5h5 , Nov 9, Yep I get that, read the second paragraph as well I think that OpenCL seems to be the most supported and compatible one and has a bevy of C wrappers for it. This video shows a great example of the kind of speeds that can be achieved when the power in modern GPU's are released. Arowx , Nov 10, Joined: Nov 12, Posts: DallonF , Nov 10, Joined: Dec 29, Posts: 12, I'm not asking Unity to just throw together something I'm asking them to turn Unity into a multi-threaded heterogeneous game engine that will take advantage of the cores available on the CPU and GPU of the platform it is running on.
I just write a component based game in Unity as usual and press play. Arowx , Nov 11, OK changing a transform, if this is an atomic activity you have the problem of threads clashing and stalling, but if changes to a transform are queued and processed prior to a render update then you can choose between accuracy and frame rate. Also separate sub systems can have priorities, e. Joined: Apr 29, Posts: 1, I think we could all agree that if it was possible to take full advantage of say 8 or 12 cores in a cpu, and milk the graphics card s for all it's worth, we would want Unity to be doing that.
I'd say ignore all the nay-sayers, and keep the faith.
I'm pretty sure that multi-threaded solutions are where people want to go, to take the most advantage of multi-core processors they possibly can. I mean who wouldn't? If Unity doesn't adapt or continue to innovate, it will quickly be left behind. That's just how technology is. Of course making multi-threading worth the costs and drawbacks isn't easy, but I'm sure some smart guy will figure out a way to make it work, and work well.
They probably already have. Velo , Nov 11,