Skip to content

Efficiently network tables

The net library has a net.WriteTable function that is able to send any data you throw at it. This is quite unoptimized.

Side Note: In my over 5 years of LUA experience I never have reached the 64kb limit with a net message.

Instead of writing a multi-net.WriteInt function or a C-like networking wrapper you could compress big tables and send them as pure data with net.WriteData.

This would change the process from net.WriteTable to: Convert the table to JSON, compress it and send it via net.WriteData.
This method requires a bit more CPU but it allows you to nearly "ignore" the limit on net-message sizes.

Example code

Normally you would do the following:

if SERVER then
    util.AddNetworkString("tabletest")
    net.Receive("tabletest",function(len,ply)
        print("Message-Size:",len)
        local myTable = net.ReadTable()
    end)
else
    net.Start("tabletest")
        net.WriteTable(HUGE_TABLE)
    net.SendToServer()
end

If you send a randomized, 100 element string array it shows the message size as 11208 (in my example).

Now you could rewrite the logic to instead send a compressed json string that is way smaller in size.
This means you have to send the length of data (as net.ReadData requires it) and then the data itself.

This would change the code to the following:

if SERVER then
    util.AddNetworkString("tabletest")
    net.Receive("tabletest",function(len,ply)
        print("Message-Size:",len)
        local textLength = net.ReadInt(17)
        local data = net.ReadData(textLength)
        local jsonText = util.Decompress(data)
        local myTable = util.JSONToTable(jsonText)
    end)
else
    net.Start("tabletest")
        local t = util.TableToJSON(HUGE_TABLE)
        local a = util.Compress(t)
        net.WriteInt(#a,17)
        net.WriteData(a,#a)
    net.SendToServer()
end

Now, if you send the same 100 element string array as the WriteTable example above it shows the message size as 7209, which is 2/3 of the original size!

Result

In comparison the different network-message lengths are:

DEFAULT-WRITETABLE-LENGTH:          11208
JSON-WRITESTRING-LENGTH:            12816
COMPRESSED-JSON-WRITEDATA-LENGTH:   7209