My friend and I are making a node.js game, and we have been testing CPU. After profiling, it was determined that this process called zlib is sucking most of the CPU/RAM.

3 clients connected to a game is fine, but when 12~13 players are connected it uses 58% where zlib is using about 30% of this CPU.

<!-- language-all: lang-none -->

>     inclusive      self           name
>     ticks   total  ticks   total
>     64775   58.5%  64775   58.5%  /lib/x86_64-linux-gnu/libc-2.19.so
>     25001   22.6%    224    0.2%  LazyCompile: *callback zlib.js:409
>     //this one is a different zlib
>     7435    6.7%     82    0.1%  LazyCompile: ~callback zlib.js:409

Is there any way to decrease the CPU usage from this? Or is there a reason why it is increasing so much?

I have done some reading and I am told it is from socket.io, so here is our section of socket sending most of the data:

<!-- language-all: lang-js -->
 
    for (var i = 0; i < users.length; i++) {
        if (u.room == users[i].room && users[i].x + users[i].radius >= u.x - u.screenWidth / 2 - 20 && users[i].x - users[i].radius <= u.x + u.screenWidth / 2 + 20 && users[i].y + users[i].radius >= u.y - u.screenHeight / 2 - 20 && users[i].y - users[i].radius <= u.y + u.screenHeight / 2 + 20) {
            if (users[i].id == u.id) {
                visiblePlayers.push({
                    x: users[i].x,
                    y: users[i].y,
                    angle: users[i].angle,
                    hue: users[i].hue,
                    radius: users[i].radius,
                    squeeze: users[i].squeeze,
                    name: users[i].name,
                    dead: users[i].dead,
                    isPlayer: true,
                    kills: users[i].kills
                });
            } else {
                visiblePlayers.push({
                    x: users[i].x,
                    y: users[i].y,
                    angle: users[i].angle,
                    hue: users[i].hue,
                    radius: users[i].radius,
                    squeeze: users[i].squeeze,
                    name: users[i].name,
                    dead: users[i].dead
                });
            }
            // SEND DYING INFO: (FOR OFFLINE ANIMATION):
            if (users[i].dying) {
                visiblePlayers[visiblePlayers.length - 1].dying = true;
            }
        }
    }
    var visibleEnergy = [];
    for (var i = 0; i < energies.length; i++) {
        if (u.firstSend || (energies[i].updated && energies[i].room == u.room)) {
            var anim = energies[i].animate;
            if (u.firstSend)
                anim = true;
            visibleEnergy.push({
                x: energies[i].x,
                y: energies[i].y,
                radius: energies[i].radius,
                index: i,
                animate: anim,
                hue: energies[i].hue,
                room: energies[i].room
            });
        }
    }

    // SEND PLAYER UPDATES TO CLIENTS:
    sockets[u.id].emit('serverTellPlayerMove', visiblePlayers,
        visibleEnergy);