簡體   English   中英

uvlib游戲服務器

[英]uvlib for game server

我知道有一些后台線程,它們執行IO操作等,然后,調用我的回調。 是否所有的回調都在一個線程中調用(=不能同時執行兩個回調)? 例如,回調傳遞給uv_read_startecho_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);
    }
}

是的,libuv事件循環保證回調的處理是順序進行的,而不是並行進行的。

這是事件循環的關鍵思想,它使它們適用於游戲引擎,因為您不需要同步線程,因此避免了各種鎖定機制的成本。 如果您對數據進行修改,則它們將在所有其他回調中保持一致。

但是,uv_run將僅在一個內核上運行,並且具有足夠的吞吐量,它將只能使一個內核發汗。

如果您要為具有很多連接(MMPORG)的游戲編寫服務器代碼,則需要為每個內核創建一個線程,並在每個內核中運行uv事件循環。 如果我們在談論反擊之類的游戲,那么一個事件循環就足夠了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM