Technical solution to eliminate desync in single-player sessions
" You apparently read my post backwards. 1. Games that use TCP are games that can't tolerate packet loss for other reasons, e.g. lockstep RTSes. 2. You stall with TCP because that is in fact the specification of TCP; you don't get data until the underlying network architecture guarantees it is the exact data that was sent. The reason almost all games use UDP is because that delay is unacceptable and the effects of minor packet loss irrelevant. 3. Hence why games use UDP. Again, try reading my post again. 4. ++ |
|
" TCP SACK has been implemented for ages. Even with regular ACK schemes you don't stall for seconds unless you're using tin cans and string to transfer data. If you mean checksums, UDP is checksummed too. Also yeah, sorry, I read that backwards. |
|
" 1. You need a fallback mechanism to handle cases where the UDP stream is interrupted or the client diverges too far from the server to correct. 2. The TCP-based resync mechanism is already working and tested and there's no compelling reason to replace it with a different fallback. " No it's not a round-trip, it's simply delayed by a single ping as I explained above. In practice, the amount of latency isn't critical so long as the client can estimate the ping accurately enough to avoid instability. " Appears that you don't quite understand how this type of feedback works. The client does not wait for any such UDP update before proceeding with its simulation. The client is not dependent on the UDP updates for any vital information at all, it is fully capable of working as an open-loop simulator just as it does today. " No, there are no instant teleports, that would be a type of resync. What happens instead: 1. Client uses latency estimate to correlate server's UDP position data to client's positions 1575ms ago. 2. Client predicts server's current simulation progress based on the server's reported UDP position data of 1575ms prior. 3. Client calculates discrepancies between its current positions and server's predicted current positions. 4. Client calculates trajectory corrections (angle and velocity) scaled to reduce the calculated discrepancies. 5. Client continues its own simulation with player and enemy trajectories corrected to more closely converge towards the server's. Note that this discrepancy-reduction loop does not wait for any particular event to occur on either the client or the server. It operates continuously to provide server position data that enables the client to incrementally reduce discrepancies before they accumulate to the point where a resync is required. Last edited by RogueMage#7621 on Nov 24, 2013, 12:17:02 AM
|
|
" I disagree about it not being feasible. First off, since the person is solo then you can generate the entire loot table when the person enters a zone based on, I think, 3-5 variables which is less work than item rolls take presently. Second off, these maps could be distributed to the client in much the same way that distributed computing projects distribute their work units. The problem is that you'd need very esoteric encryption for these work units or else you'd have those security concerns you were talking about. Thirdly, if players really wanted this implemented then I don't think they would like the client security needed to prevent abuse by things like speed hacks and map hacks. Fourthly and finally, the method and means to achieve a product with seamless gameplay between online and offline mode would be better spent on a new product, as people that think this game should be playable offline and solo are quite possibly overdosing on all of the paste they ate. IGN : Reamus
|
|
" Why would you generate the entire loot table when the map's created? You generate it lazily when you need to actually roll for drops. " It has to be able to be decrypted or it's useless. Let me introduce you to ReadProcessMemory() or CreateRemoteThread(). Also, most games like this just send the seed value needed to generate the map instead of the entire map itself. " Speed hacks are relatively easy to limit: if player movement goes past a certain bubble in a certain timeframe you disconnect them. In practice nobody will care in this game because you can always use Faster Attacks Leap Slam if you need to go somewhere. " Yes, seamless offline and online gameplay has never happened before. What's a Diablo 2? (Mind, open bnet was hack-ridden) |
|
*disclaimer: only read some of this massive post and im not a programmer.
Ok so what I have seen, specifically from the devs and the programmer gamers here is more or less a proposal from gamers on how to fix the issue being rebutted by the developers as to why it wont work/not worth it. How about a laymen's suggestion? Do whatever every other game out there is doing that doesn't have epic desync. This system you have now might be epic in stopping cheaters, but its making all your non cheating players suffer...and when it comes down to it....im not seeing some hacker in pvp decimating me....im still getting gold farmer bot spam...I don't care if someone ill never see in game botted to level cap and farmed awesome stuff. I just want to play the game without fighting the fact that at no time does my game client and server know exactly where the hell I am and where the hell mobs are in game. I cant think of a single other ARPG or mmorpg for that matter...even online FPS...that have this issue (yeah im sure there is desync but its not effecting game play on my end) Regardless, its becoming a running joke about this game...its the number one issue with the game...as it effects everyone (even if you have fanboys who refuse to admit it) and it creates a worse gaming experience than knowing some twit is out there hacking his critical strikes or whatever. Make fixing this a priority. New content doesn't mean much when the core of the game is busted. Its the only thing stopping your game from being a fantastic game in the eyes of people who are not total fanboys. just for try, for see and for know
|
|
" Yep, my point ive been trying to make the whole time. Fixing desync is way more important than the side effect of hackers potentially being able to crit more, etc. Online games were not meant to be 'fair'. People play 18 hours per day and RMT, how are you going to compete with them? You can't, so why cry over spilt milk. Top priority should be an enjoyable game experience where you don't randomly die due to desync. Second priority should be to ban/detect hacks/hackers on the server-side. As long as dupes, speed hack, god-mode, and other things aren't possible (which can disrupt the economy), then the game experience will not change. Last edited by qwave#5074 on Nov 24, 2013, 1:43:44 AM
|
|
"No, you wouldn't. Stream interrupted? Restart stream. Problem solved. "Yes, it is. Remember that the client simulation as a whole is a one-way-ping ahead of the server; thus, whenever the client simulation depends on the server to send it something, it's a round-trip ping behind. "You are literally arguing against your own suggestion, saying that the client is not dependent on it and that it is not vital. "Either "1575ms ago" is a typo or you're crazy. There's far too many possibilities for divergence for the client to predict that far in advance. "It fucking should wait for something: some degree of user input. The player isn't an AI, it's something with the power to make prediction-shattering decisions in real time, which is something you seem to want to ignore. When Stephen Colbert was killed by HYDRA's Project Insight in 2014, the comedy world lost a hero. Since his life model decoy isn't up to the task, please do not mistake my performance as political discussion. I'm just doing what Steve would have wanted. Last edited by ScrotieMcB#2697 on Nov 24, 2013, 2:07:57 AM
|
|
I thought about this some more.
Player: I still think at least the position of the player should be resynced every 500ms. That would result in an additional bandwith usage of maybe 32 Bytes per second. If there is actually X, Y and Z coordinates it would be something like 48 Bytes per second. That won't stop the mobs from desyncing but it will prevent yourself from desyncing. Mobs: When it comes to mobs I also could imagine kind of a request system. Instead of resyncing everything on screen it could just resync on request like: Resync mouse-overed mob immidiately. Maybe include a timer for this so the mouse-overed mob doesn't get resynced nonstop. Once every 2-3 sec should be enough. Resync mobs that should be in range of an aoe attack according to client. If the client says: This mob should be in range of an aoe attack: Resync it. If the client can't tell something like this the server still could do this automatically just not that frequent and only if attacks are involved and the mob is in their range. Again with a timer of 2-3 sec so it doesn't happen nonstop. This should happen regardless of the mob being successfully hit or not. Nonstop resync for special situations every 2-3 sec, but only for certain mobs. Here I'm thinking about situations like boss fights. For example vaal. In case of a party of 6 people the vaal fight would result in something like 224 Bytes every 2-3 seconds. Or in case of X, Y and Z coordinates: Something like 336 Bytes every 2-3 seconds. This treatment should be done for each unique mob. Another example: Dominus Fight I never actually counted them but there are like 5-6 unique mobs during the vaal finght. So again: In case of a party of 6 people this would result in a bandwidth usage of something like 384 Bytes every 2-3 seconds; Or for X/Y/Z something like 576 Bytes every 2-3 seconds. Conclusion: Even if this isn't the fail-prove system everybody wants to have at least it would be nice temporary fix. Most of the dangerous situations should be covered. The three possibilities to resync mobs could also have a shared timer so a mob doesn't get resynced because of an aoe attack when it was just resynced because of a mouse-over. Or in case of special situations like boss fights if mobs are resynced nonstop mouse-over and attack resync would be deactivated completely. What do you think? This should very well be possible with a modern server. Last edited by grasmann#3903 on Nov 24, 2013, 5:10:57 AM
|
|
In general, UDP is a far superior choice for doing stuff like updating the position of monesters and your own characters, and its typically how games use UDP. TCP is obviously completely reliable (assuming the physical connection still exists), but it has a ridiculous overhead, anyone who studied uni level networking and had a look at the TCP standard would understand this
This is pretty irrelevant because current PoE, if I am not mistaken, doesn't actually stream positions of monesters, it does frequent checks (which is not the same thing) to see if the client and/or server is in sync. UDP would make sense if PoE mechanics were mainly server side, but they aren't |
|