【问题标题】:uvlib for game server用于游戏服务器的 uvlib
【发布时间】:2014-05-26 16:47:04
【问题描述】:

我知道有一些后台线程,它们执行 IO 操作等,然后调用我的回调。是否在一个线程中调用所有回调(= 不能同时执行两个回调)? 例如回调传递给uv_read_start (echo_read),当数据来自套接字连接时,应该调用它。 echo_read 是否总是在主线程中调用,而那些后台线程仅用于缓冲来自该套接字的数据? 我想用libuv 创建游戏服务器,但实际上我需要确定,一次只处理一个游戏数据包,而不是更多(否则会有很多同步问题,我可能需要实施全部来自地面)。

int main() {
    loop = uv_default_loop();

    uv_tcp_t server;
    uv_tcp_init(loop, &server);

    struct sockaddr_in bind_addr = uv_ip4_addr("0.0.0.0", 7000);
    uv_tcp_bind(&server, bind_addr);
    int r = uv_listen((uv_stream_t*) &server, 128, on_new_connection);
    if (r) {
        fprintf(stderr, "Listen error %s\n", uv_err_name(uv_last_error(loop)));
        return 1;
    }
    return uv_run(loop, UV_RUN_DEFAULT);
}

void on_new_connection(uv_stream_t *server, int status) {
    if (status == -1) {
        // error!
        return;
    }

    uv_tcp_t *client = (uv_tcp_t*) malloc(sizeof(uv_tcp_t));
    uv_tcp_init(loop, client);
    if (uv_accept(server, (uv_stream_t*) client) == 0) {
        uv_read_start((uv_stream_t*) client, alloc_buffer, echo_read);
    }
    else {
        uv_close((uv_handle_t*) client, NULL);
    }
}

【问题讨论】:

    标签: c node.js libuv


    【解决方案1】:

    是的,libuv 事件循环保证回调的处理是按顺序完成的,而不是并行的。

    这是使它们适用于游戏引擎的事件循环的关键思想,因为您不需要同步线程,从而避免了各种锁定机制的成本。如果您对数据进行修改,它们将在所有其他回调中保持一致。

    但是,uv_run 将只在一个核心上运行,并且具有足够的吞吐量,它只能让一个核心出汗。

    如果您正在为具有大量连接 (MMPORG) 的游戏编写服务器代码,那么您需要为每个内核创建一个线程并在每个内核中运行一个 uv 事件循环。如果我们谈论的是像反恐精英这样的游戏,那么一个事件循环就足够了。

    【讨论】:

      猜你喜欢
      • 2017-11-28
      • 1970-01-01
      • 1970-01-01
      • 2012-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-21
      • 1970-01-01
      相关资源
      最近更新 更多