首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >游戏服务器uvlib

游戏服务器uvlib
EN

Stack Overflow用户
提问于 2014-03-10 08:00:20
回答 1查看 836关注 0票数 0

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

代码语言:javascript
复制
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);
    }
}
EN

回答 1

Stack Overflow用户

发布于 2014-05-26 16:47:05

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

如果你正在为一个有很多连接(MMPORG)的游戏编写服务器代码,那么你需要为每个核心创建一个线程,并在每个线程中运行一个uv事件循环。如果我们讨论的是counter strike这样的游戏,一个事件循环就足够了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22289921

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档