[Solved] Causes / Solutions "QueueIncomingReliableWarning"

Hello, I'm new here and even though I riffled through older posts I couldn't find something that solves my problem. Still, sorry if this has been previously asked. Also thanks in advance for reading through (I hope you do :lol: ) because although I've been programming for quite some time, this is my first time I deal with networks so I'm sure I'll ask some silly questions / things that don't make much sense / whatnot ;)

Long story short:

The Problem:
I recently started using PUN to make an online game which is played in a room between 10 people at most. Things work great (loved the automatic conversion tool!) but every once in a while I'll start receiving the following error: Received unknown status code: QueueIncomingReliableWarning which makes my clients freeze for a few frames. What's also weird for me is that I get the same error message up to 2-3 times with the same timeStamp (in the same frame). Finally, I also get the same error (some times) the moment a client enters the room. Unfortunately I can't consistently reproduce any of this to give you more concrete info.

Messages I send:
The only things I synchronize are the players' root position and rotation. I send RPCs for every action they take (that happens at most once every couple of seconds due to cooldowns), as well as their movement / rotation requests (pressing WASD) because those also trigger player animations that I want broadcasted to every client (these can happen every frame).
I don't know if there are different kinds of RPCs or different ways to send them and if so if i'm using the right ones - I saw something about buffered / unbuffered somewhere.

PUN Statistics I got:
I was initially worried that sending RPCs for the movement and rotation would cripple the system and if that's an issue I'll work something out, but my statistics display 2-3 MBs per minute from messages which is 33kbps... so I doubted that that's the problem.

I'm running out of info that seems relevant to the problem, so feel free to ask for specific details and I'll try to get them for you. Thanks in advance! :)

Eagerly awaiting a liferaft,
Konstantinos

Comments

  • Thanks for trying to find the answer in previous posts. I know this is not always easy and in this case, particularly tricky.

    In short:
    From time to time, you get a lot of messages and these pile up in the client. The limit for this warning is more or less random but the idea is: "if you see this warning a lot you should think about either sending less or consuming incoming messages faster".

    In detail:
    The "reliable" in this warning relates to reliable messages. These are ordered and guaranteed to reach each client. None of these can be skipped, no matter how old they get and how many are faster. If something is missing (and this can happen), everything waits for a repeat to happen.
    The result: If something is missing in a reliable sequence, everything else piles up. This happens faster in a 10 player game with lots of reliable updates. In the end, this is why you get the message.
    Unreliable messages are also sent in sequence but if updates 10 and 13 are available, then the client will use them and skip 11 and 12 if they arrive late. This is good to catch up with repeated / replaced info.

    When a player joins a room, it gets all the messages that are buffered (Instantiates, buffered RPCs e.g.), no matter when they happened. The new player also begins to get "live" events soon. This might also trigger the warning.

    To fix:
    You can try to reduce the number of messages sent by combining individual ones into something like 10 or 20 per second. This is solved by refactoring your logic and messages.
    You can also switch as many updates as possible to unreliable. If some value is sent 10 times per second, a dropped message is not the end of all. The next position update is coming soon.

    RPCs are always reliable. OnPhotonSerializeView can be either, depending on the PhotonView setting on the prefab / GameObject.

    In the end:
    If the warning happens only now and then, it's not a problem. The pausing is due to missing messages and waiting for a re-send by the other side. This can happen.
    Minimizing the amount of data sent is always good and will improve connection overall. Sending unreliable is "cheaper" than reliable commands but on the other hand, not all input / actions are suited for reliable.

    Not sure if that helps. :)
  • Not sure if that helps? Try "It solved everything" ;)

    I thought since messages were small in total (my traffic was ~30kbps due to messages and latency always low) they werent the problem, but as you mentioned the problem lied in the fact that they were all reliable (RPCs) and there was a lot of them (4-5 per frame >_< ).

    So, I rearranged some logic as you suggested, ensuring that all the updates are trigger-based (when something changes -> send an RPC) instead of just sending them every frame like I did before. I didn't even have to remove the unreliable transform (player's position / rotation) syncing, since it's all working like a charm.

    All in all, I haven't seen a warning / error in quite some time, hope that's the end of it.

    Either way, thanks a bunch!! :)
  • Thanks for the info! It's cool to know you could refactor all of it to run nicely!