Archive 17/01/2023.

Networking

JamesK89

First off fantastic job guys! I remember checking out Urho some time ago and definitely seeing the potential and since then I am very impressed with how far it has come.

But to the point I was wondering if networking (aka scene replication) is going to get more attention?
From what I can tell with the demos it seems to be fully working but from what I’ve heard on the forums and /r/gamedev is that it lacks latency compensation of any kind.

I’ve seen a couple people say they think Urho shouldn’t have too much focus on connectivity if any at all but from my understanding Urho is aiming to be a game engine, whereas say Ogre and Irrlicht are for the most part strictly graphics engines, so I feel Urho having networking as part of its core as essential.

I’ve also seen some discussion on kNet being outdated or not well maintained.
I can’t say that kNet is something I’m familiar with but enet is probably a viable alternative and RakNet is open source now under a relatively liberal BSD license since their acquisition by Oculus.

While I’d love to write something with Urho networking isn’t my strong suite so I’m feeling a tendency to move back toward Torque3D because it has a complete networking solution out of the box even though the engine is a pain to work with but I’d much rather work with Urho for my projects.

cadaver

Welcome to the forums!

The lack of latency compensation / client prediction is a known and acknowledged problem. It also could be said that the built-in networking is to some degree a proof of concept and it’s likely that a “real” game has to rewrite it, as we cannot eg. test performance in truly massive gameplay situations.

We can make very little assumptions of the games or applications being written with Urho. So currently the networking subsystem takes on just the task of replicating attributes from the server to client as efficiently as possible, as this is a well-defined task that can be implemented without game-specific hacks. One thing we can assume is that physics is used to control game characters, and prediction coupled with a general rigid body physics system is a rather hard problem, as when the client simulates the player character ahead, and a correction comes from the server, how do you rewind just the player’s physics?

I guess Unity is in a similar situation, as it can also assume very little of the games, uses physics, and implements a default networking model that doesn’t lag compensate.

The networking library being used pretty much doesn’t matter, as they usually give you a reliable stream over UDP, where messages can be tagged in various ways (reliable, ordered, or not). kNet already gives this functionality. I have used enet in the past and it’s not as flexible, but it’s good for implementing a Quake3-like protocol. Quake3-style protocols are good as long as the unreliable frame state being sent to clients doesn’t exceed a single UDP datagram’s size.

In summary: we rather have a robust but not lag compensating default network solution, than one that attempts to poorly lag compensate or uses game type-specific hacks. Of course contributions to improve are welcome, but it’s likely that solutions would involve either making the clients authoritative over own movement, or adding a specific “rewindable” FPS character controller that doesn’t properly interact with physics. Neither are ideal as a generic solution.

JamesK89

After giving it some thought I have a tendency to agree with you; something that might work great for an FPS would probably fair poorly for a racing game or an RTS.
Of course as Urho3D begins to build a reputation (I remember when no one knew what Irrlicht was) I would expect people might start building frameworks for building specific types of games which should make getting certain projects up and running easier, so it is probably best Urho3D just exposes an abstraction that takes care of the dirty work of setting up and maintaining connections.

I have to say looking at the sample code I feel very pleased with Urho3D and its potential.
It sort of reminds me of Unity (node-component based, scriptable) but without the bondage of being proprietary software.
I really look forward to building something with it as soon as I get some time.

practicing01

No lag code builtin? Bummer! I was looking forward to using the networking stuff. If there are different solutions to different game-types then provide solutions for all of them :smiley: (or the most common ones). Perhaps as logic components or subsystems. Maybe resources already exist that are modular enough to be plugged into urho, kinda like assimp. Also, there are some open source engines that might have code simple enough to be “borrowed” too like T3D: github.com/GarageGames/Torque3D … source/sim If anyone has links to information on this subject, I think it would be a good idea to post them in this thread, who knows, it might turn into something productive!

cadaver

kNet contains the NetworkSimulator class for lag & packet loss & corruption testing. It’s not directly exposed in Urho3D Network API but you can access it yourself. Note: I’ve not tested it myself so I will not make any claims of how well it works. For example, if you wanted to add 100ms delay to all packets you send to the server (ServerConnection must have been created first by connecting.)

    kNet::UDPMessageConnection* conn = static_cast<kNet::UDPMessageConnection*>(network->GetServerConnection()->GetMessageConnection());
    kNet::NetworkSimulator& sim = conn->NetworkSendSimulator();
    sim.enabled = true;
    sim.constantPacketSendDelay = 100.0f;
practicing01

I’ve been skimming through networking articles found through google while I wait for my “New Build” thread problem and these look really helpfull:
github.com/juj/kNet/blob/stable … cyTest.cpp
developer.valvesoftware.com/wik … Networking

What ways could the network simulator be used strategically to help us with this topic? Does it automatically interpolate values, in essence doing exactly what we want?

cadaver

If you for example were writing a client prediction code, the NetworkSimulator could help to simulate a latency in local testing. Or simulate packet losses. In other words it will simulate various “bad” conditions. It will not do anything proactive like interpolating network message data.