Announcement

Collapse
No announcement yet.

Multiplayer bugs becoming more prevalent - Harden & Improve Network / Multiplayer Support!

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

    [FEATURE REQUEST] Multiplayer bugs becoming more prevalent - Harden & Improve Network / Multiplayer Support!

    If folks have questions or comments, can they please put them in the thread and not PM them to me! Thanks

    Although for most people moving to 4.10 was relatively simple in comparison to other releases, for me personally it's been a bit of a nightmare. I'm currently working on two Multiplayer titles that although ambitious aren't doing anything outside the realms of a normal competitive multiplayer game. However, a lot of the time I find myself fighting issues purely because engine code hasn't been fully tested in a Multiplayer environment, and having to come up with some pretty significant workarounds. One such example that has since been fixed was that you couldn't change the pawn you possessed in Multiplayer - something that is pretty commonplace in a lot of MP games.

    So really I'm just creating this thread to try and draw attention to some of the biggest issues I've been experiencing with Netcode both in 4.10 and below, in the hope that Multiplayers get's the attention it deserves. I've linked a couple of the most major ones below but rather than just repeat myself, I really want to raise the issue for the need for a netcode hardening pass of some kind. As an example, here's a couple of issues I'm hitting since 4.10:

    Widgets Disappearing For Clients in Multiplayer
    This is probably the most frustrating of the bunch and definitely surfaced in 4.10. Whenever a client changes the Pawn they possess in a Multiplayer game, any sort of persistent User Widget stops ticking and therefore drawing too. I am yet to figure out why this is, but brought it to Nicks attention on Slack who indicated it may be related to Widgets being "torn down and rebuilt" when a player changes a pawn. I imagine there's a reason for this, but whatever it is, it doesn't work at all in Multiplayer. My game has vehicles (pawns) that players can hop in and out of (via possession). All you need to do is add a widget to the screen via a HUD class and test it in MP, and they'll stop working the minute I try to posses another object.

    The workaround for this is god-awful. You have to force-tick the widget by calling it's Tick function from another class, which completely voids the point of widgets not ticking when they're not supposed to be rendered. Once the widget starts drawing again, it's also ticking itself natively - so most of the time it's double-ticking. Needless to say, this is less than desirable.

    I'm trying to build a repro project for it, but it's going to take a bit of setup because it's Multiplayer. Nevertheless, answerhub post here: https://answers.unrealengine.com/que...r-clients.html

    Uint8 doesn't trigger OnRep_ functions if value is Zero
    This possibly occurs to multiple engine types and maybe even pre 4.10 - but I've been using uint8's for serialization / quantization of values for replication but found that if the value is zero, they won't trigger the Replicated Functions for clients. This doesn't just affect me though, since a lot of engine types do this natively (such as FRotators for example in FRepMovement) and therefore there will be some bugs in engine code. Again, to most people they won't be noticeable and there are workarounds, but this had me stumped literally for days and I feel like it's an oversight in the Engine netcode.

    Answerhub Post here: https://answers.unrealengine.com/que...tion-if-z.html

    ---

    It's also worth mentioning this; There were a fair few changes to Replication in 4.10 and yet not a single one of them was documented. For someone working on two multiplayer-focused titles this has proven to been an absolute nightmare. New options for FRepMovement for example weren't documented in the release notes despite being a pretty significant (and useful!) change. The only way to get around this was to compare relevant files on GitHub from version to version, which isn't foolproof - or hope you run into them at some point anyway.

    I realize most people aren't doing Multiplayer and for the majority of projects these kinds of bugs won't surface because I can't imagine most people don't have to be so conscious of bandwidth as I do - but it's already taken a significant number of releases to fix some age-old netcode bugs (such as pawn possession for example), and it would be a shame if the netcode didn't receive the same treatment as other areas of the engine. I personally would like to see some updates that really focuses on Multiplayer in the upcoming months. AFAIK, there's nothing planned on the trello. Most importantly - I'd appreciate it if changes that may affect multiplayer are tested in that environment as well as non-multiplayer ones. MP is after all a first-class feature of the engine.

    Many improvements to the engine could be made, a huge stack of changes and optimizations that Pete has made for Unreal Tournament being brought into the engine would be fantastic for example. ShooterGame and VehicleGame are fantastic resources that I can imagine took a lot of time and effort to put together. However, both are VERY old now (must be 2-3 years or more?) and neither scales very well past more than a handful of players. So on top of the engine improvements, a newer up-to-date MP example would also be a welcome gesture

    @Community - feel free to post any weirdness you are experiencing in MP, and of course share thoughts on a MP hardening pass on the engine.

    List of Features / Fixes / Improvements requested thus far.
    Last edited by TheJamsh; 01-01-2016, 09:04 AM.

    #2
    Thanks for posting this.

    MP seems to be something of a red-headed stepchild in UE4. I, too, would love to see more effort put into multiplayer.

    WIP Thread

    Comment


      #3
      Originally posted by Rhynedahll View Post
      Thanks for posting this.

      MP seems to be something of a red-headed stepchild in UE4. I, too, would love to see more effort put into multiplayer.
      +1

      ..........
      Acclivity Game Studios. Making a BP FPS, Tutorial Series on Blog : On Unreal Wiki : Twitch

      Comment


        #4
        Originally posted by Rhynedahll View Post
        Thanks for posting this.

        MP seems to be something of a red-headed stepchild
        I laughed
        would love to see more effort put into multiplayer.
        Agreed!

        feel free to post any weirdness you are experiencing in MP, and of course share thoughts on a MP hardening pass on the engine.
        My chat system disconnected the sending client when the message length >= 1024 characters (Fixed by implementing character limit): https://answers.unrealengine.com/que...g-reaches.html
        Marketplace Assets

        Advanced Mobile Input: Marketplace Page | Support Thread ――― Easy Input Remapping: Marketplace Page | Support Thread
        Multiplayer Blueprint Chat System: Marketplace Page | Support Thread ――― Closing Credits System: Marketplace Page | Support Thread
        Minesweeper Template: Marketplace Page | Support Thread ――― Maze Creator: Marketplace Page | Support Thread

        Comment


          #5
          Originally posted by TheJamsh View Post
          @Community - feel free to post any weirdness you are experiencing in MP, and of course share thoughts on a MP hardening pass on the engine.
          DateTime variables are not replicated at all
          Easy to use UMG Mini Map on the UE4 Marketplace.
          Forum thread: https://forums.unrealengine.com/show...-Plug-and-Play

          Comment


            #6
            Originally posted by John Alcatraz View Post
            DateTime variables are not replicated at all
            I believe I've experienced that as well, couldn't get my day night cycle to work, had to make my own date time struct.
            Marketplace Assets

            Advanced Mobile Input: Marketplace Page | Support Thread ――― Easy Input Remapping: Marketplace Page | Support Thread
            Multiplayer Blueprint Chat System: Marketplace Page | Support Thread ――― Closing Credits System: Marketplace Page | Support Thread
            Minesweeper Template: Marketplace Page | Support Thread ――― Maze Creator: Marketplace Page | Support Thread

            Comment


              #7
              Originally posted by John Alcatraz View Post
              DateTime variables are not replicated at all
              I'm fairly certain that's intentional, since the properties in that struct are not UPROPERTY's and therefore not considered for Replication. By design you probably don't want to replicate a struct like that anyway, it would be more efficient to replicate the float/int that all the components are derived from and have the client build their own Date-Time from that on the other side, otherwise you're wasting a lot of bandwidth.

              Comment


                #8
                Here's a bug with rep-notify data when trying to replicate a struct which has values inside changed separately.
                https://answers.unrealengine.com/que...e-propert.html

                Comment


                  #9
                  Originally posted by TheJamsh View Post
                  It's also worth mentioning this; There were a fair few changes to Replication in 4.10 and yet not a single one of them was documented. For someone working on two multiplayer-focused titles this has proven to been an absolute nightmare.
                  Hi,

                  thanks for this information! Can you enumerate some of the bugs / issues that you found? I think it's good to know for all the user that want to start MP games.

                  Best regards,
                  Daniel
                  Daniel Mihajlovic |Freelance 3D Artist | Showreel

                  Comment


                    #10
                    Hey Daniel/Polygon

                    I posted the two major ones I found, but in terms of what's changed there were a couple of things I've found so far. FRepMovement (Replicated Movement in BP) now has an option for what level of Quantization you want to apply to the FVectors and FRotators, and by default they have far less precision than they used to. For the most part you won't notice this, but I started noticing really 'steppy' rotation on my vehicles and particularly any object simulating physics and replicating, so I had to up the precision to Shorts instead of Bytes. (uint16 instead of uint8). It's a nice feature, but surprised nobody put it into the release notes.

                    Aside from that, the most major issue I've had so far has been with UMG widgets vanishing from screen.

                    There are the usual glitches with Audio in Multi-PIE too, some of which have been present since the beginning and/or pre-4.8, but I think the audio engine rewrite that's going on right now should help with some of those.

                    Comment


                      #11
                      Hey James,

                      thanks for the quick reply! I've not played around with the quantized movement replication so far but I'm a bit concerned that it might lead to a heavier stuttering behavior than before.
                      In 4.8 I've done some tests with movement replication in a top down moba style game and the old system caused a slight stuttering effect, too. So I hope that the new options don't make this issue even worse

                      Another thing that I've noticed in older releases was related to the ping of sessions. The "Get Ping" node returns always 9999 for me, even if the desired session that I joined ran smooth as hell - even via steam. Unfortunately I couldn't manage to find some time to check this in 4.10 but I really hope that Epic puts some more effort in MP in general

                      Best regards,
                      Daniel
                      Daniel Mihajlovic |Freelance 3D Artist | Showreel

                      Comment


                        #12
                        Yeah there are a lot of problems with the Ping node, which is bizarre seeing as it seems to work perfectly fine in C++. What you can try to do is get the Ping from the PlayerState, as that seems to be nearly accurate most of the time.

                        The stuttering you're experiencing - are you using a relatively small scale for your objects? It may be that they don't send updates often enough even, and therefore the client receives a low percentage of packets. tbh, there's any number of things it can be!

                        Comment


                          #13
                          Guys, why replicated expose on spawn variables not set on clients while construction script? How is that even works, that the reason of construction script in this case at all.
                          Owner not set as well.

                          Comment


                            #14
                            Thanks for those news.

                            I'm stuck in 4.9 for the moment, due to the SSL Perforce issue but I'm glad to learn those MP changes as it will highly impact our game. I must take care of those.

                            In MP chat did you succeed in getting all the characters send via Network? By example, "|" is not working and it truncated the following characters. I didn't had time to dig as the Chat system in my game in low priority for the moment, but if some of you have face this I'm glad to know if it's a bug to raise or not ^^

                            Speaking about Network MP, we also have stange log that I don't know how to understand / Fix,
                            https://answers.unrealengine.com/que...cket-loss.html
                            https://answers.unrealengine.com/que...ry-dump-m.html

                            Also log on network that have been fix in 4.10:
                            https://answers.unrealengine.com/que...alid-data.html

                            Comment


                              #15
                              Originally posted by CriErr View Post
                              Guys, why replicated expose on spawn variables not set on clients while construction script? How is that even works, that the reason of construction script in this case at all.
                              Owner not set as well.
                              They can't be because it simply doesn't work that way, the Constructor runs the instant the object is created in memory, not necessarily when it's in the world - and it's far too early to consider it for networking at that point. The actor has to be in-play to have a valid net connection / actor channel. Additionally, as soon as you introduce even a few microseconds of latency - you're entire solution will break. The first thing to understand about MP programming is that it really is entirely different to programming a local-only game.

                              The correct way to set this up would be to create a struct of all the variables you feel you have to send immediately, and when the client eventually receives them from the server, they can run an update function which sets those vars accordingly and performs any tasks. You need to write your code in such a way that it can handle any networking situation, whether it be latency, packet loss, packet order etc. UE takes care of the latter two for you mostly. Owner also has to be set from the Server, and if the client has no knowledge about that actor yet, it can't set that up.

                              EDIT: You can also use Deferred Actor Spawning in C++, which will allow you to setup properties before the actor sends it's initial replication packet.

                              Originally posted by Elvince View Post
                              In MP chat did you succeed in getting all the characters send via Network? By example, "|" is not working and it truncated the following characters. I didn't had time to dig as the Chat system in my game in low priority for the moment, but if some of you have face this I'm glad to know if it's a bug to raise or not ^^
                              I'll be sure to post here if I find any issues, I haven't got as far as implementing a chat system yet! Are you using FString to replicate the data? FString shouldn't suffer any truncation AFAIK, but FNames will since they are case-insensitive (but cost have the bandwidth of FString).

                              EDIT:
                              As for the History Dump overflow - I believe that's caused when vars or RPC's that are queued for replication start to overflow the buffer, and therefore you have the potential for clients to lose sync. i think that's what it is anyway but I haven't found an easy way to debug it. It would be quite nice actually, if the network profiler showed this kind of stuff as well. It's super-rad for monitoring bandwidth but a little extra profiling wouldn't go amiss.

                              MP, especially in PIE is just a pure nightmare to debug if you're in Visual Studio. It's actually easier in BP because you can select the debug object and the debug world (Client 1, Server etc.) Not easy to do in VS
                              Last edited by TheJamsh; 12-31-2015, 03:44 PM.

                              Comment

                              Working...
                              X