{"id":7489,"date":"2026-07-24T13:52:37","date_gmt":"2026-07-24T05:52:37","guid":{"rendered":"https:\/\/i007.cc\/wordpress\/?p=7489"},"modified":"2026-07-24T16:08:25","modified_gmt":"2026-07-24T08:08:25","slug":"%e8%ae%b2%e8%ae%b2%e9%95%bf%e8%bf%9e%e6%8e%a5%e7%9a%84%e6%b8%b8%e6%88%8f%e6%9c%8d%e5%8a%a1%e5%99%a8%e6%9c%80%e4%bd%b3%e8%ae%be%e8%ae%a1","status":"publish","type":"post","link":"https:\/\/i007.cc\/wordpress\/archives\/7489","title":{"rendered":"\u8bb2\u8bb2\u957f\u8fde\u63a5\u7684\u6e38\u620f\u670d\u52a1\u5668\u6700\u4f73\u8bbe\u8ba1"},"content":{"rendered":"<div role=\"feed\" aria-label=\"Chat messages\" aria-describedby=\"_r_1on_\" aria-busy=\"false\" data-find-provider-scope=\"\">\n<div data-sizer-excess=\"0\" data-rocksteady-sizer=\"\">\n<div data-rs-index=\"8\" data-index=\"8\">\n<div tabindex=\"0\" role=\"article\" aria-setsize=\"10\" aria-posinset=\"9\" aria-label=\"Message 9 of 10\">\n<div data-test-render-count=\"2\">\n<div class=\"mb-1 mt-[var(--msg-gap,1.5rem)] group group\/message-row\">\n<div class=\"flex flex-col items-end gap-1\">\n<div class=\"group relative inline-flex gap-2 bg-bg-300 dark:[[data-darker-default]_&amp;]:bg-bg-000 rounded-xl pl-2.5 py-[var(--msg-bubble-py,0.625rem)] break-words text-text-100 transition-all max-w-[75ch] flex-col !px-[var(--msg-bubble-px,1rem)] max-w-[85%]\" data-user-message-bubble=\"true\">\n<div class=\"flex flex-row gap-2 relative\">\n<div class=\"flex-1\">\n<div class=\"font-large !font-user-message py-0.5 grid grid-cols-1 gap-2 relative [&amp;_ul]:!space-y-0 [&amp;_ol]:!space-y-0 [&amp;_ul]:pl-8 [&amp;_ol]:pl-8\" data-testid=\"user-message\">\u957f\u8fde\u63a5\u6e38\u620f\u670d\u52a1\u5668\u7684\u672c\u8d28\u6311\u6218<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div data-rs-index=\"9\" data-index=\"9\" data-last-message=\"true\">\n<div tabindex=\"-1\" role=\"article\" aria-setsize=\"10\" aria-posinset=\"10\" aria-label=\"Message 10 of 10\">\n<div data-test-render-count=\"1\">\n<div class=\"group group\/message-row\">\n<div class=\"group relative relative pb-[var(--msg-assistant-pb,0.75rem)]\" data-is-streaming=\"false\">\n<div class=\"font-claude-response relative leading-[1.65rem] [&amp;_pre&gt;div]:bg-bg-000\/50 [&amp;_pre&gt;div]:border-0.5 [&amp;_pre&gt;div]:border-border-400 [&amp;_.ignore-pre-bg&gt;div]:bg-transparent [&amp;_.standard-markdown_:is(p,blockquote,h1,h2,h3,h4,h5,h6)]:pl-2 [&amp;_.standard-markdown_:is(p,blockquote,ul,ol,h1,h2,h3,h4,h5,h6)]:pr-8 [&amp;_.progressive-markdown_:is(p,blockquote,h1,h2,h3,h4,h5,h6)]:pl-2 [&amp;_.progressive-markdown_:is(p,blockquote,ul,ol,h1,h2,h3,h4,h5,h6)]:pr-8\">\n<div class=\"grid grid-rows-[auto_auto] min-w-0\">\n<div class=\"row-start-2 col-start-1 relative grid grid-rows-[auto_auto] isolate min-w-0\">\n<div class=\"row-start-1 col-start-1 relative z-[2] min-w-0\">\n<div class=\"standard-markdown grid-cols-1 grid [&amp;_&gt;_*]:min-w-0 gap-3 [&amp;_&gt;_*:last-child]:mb-0 print:block print:[&amp;_&gt;_*_+_*]:mt-3 standard-markdown\">\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\">\u6e38\u620f\u670d\u52a1\u5668\u548c\u666e\u901a HTTP \u670d\u52a1\u5668\u6709\u6839\u672c\u6027\u7684\u533a\u522b\uff1a<\/p>\n<ul class=\"[li_&amp;]:mb-0 [li_&amp;]:mt-1 [li_&amp;]:gap-1 [&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc flex flex-col gap-1 pl-8 mb-3 print:block print:space-y-1\" dir=\"ltr\">\n<li class=\"font-claude-response-body whitespace-normal break-words pl-2\"><strong>HTTP<\/strong>\uff1a\u8bf7\u6c42\u2192\u54cd\u5e94\u2192\u65ad\u5f00\uff0c\u65e0\u72b6\u6001\uff0c\u4efb\u610f\u6269\u5bb9<\/li>\n<li class=\"font-claude-response-body whitespace-normal break-words pl-2\"><strong>\u6e38\u620f\u957f\u8fde\u63a5<\/strong>\uff1a\u8fde\u63a5\u5efa\u7acb\u2192\u6301\u7eed\u53cc\u5411\u901a\u4fe1\u2192\u7ef4\u62a4\u72b6\u6001\u2192\u5904\u7406\u5b9e\u65f6\u4e8b\u4ef6<\/li>\n<\/ul>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\">\u8fd9\u5e26\u6765\u4e09\u4e2a\u6838\u5fc3\u96be\u9898\uff1a<strong>\u72b6\u6001\u7ba1\u7406<\/strong>\uff08\u73a9\u5bb6\u6570\u636e\u5728\u54ea\uff09\u3001<strong>\u540c\u6b65<\/strong>\uff08\u591a\u73a9\u5bb6\u6570\u636e\u4e00\u81f4\u6027\uff09\u3001<strong>\u5b9e\u65f6\u6027<\/strong>\uff08\u6beb\u79d2\u7ea7\u5ef6\u8fdf\uff09\u3002<\/p>\n<hr class=\"border-border-200 border-t-0.5 my-3 mx-1.5\" \/>\n<h3 class=\"text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold\" dir=\"ltr\">\u4e00\u3001\u6574\u4f53\u67b6\u6784<\/h3>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\">\u4e00\u4e2a\u4e2d\u7b49\u89c4\u6a21\uff08\u4e07\u7ea7\u5e76\u53d1\uff09\u7684\u6e38\u620f\u670d\u52a1\u5668\u67b6\u6784\u5206\u4e09\u5c42\uff1a<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\r\n\u5ba2\u6237\u7aef     \u2502  Mobile \/ PC \/ Console Client          \u2502\r\n          \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\r\n                          \u2502 TCP \/ WebSocket \/ KCP\r\n          \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25bc\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\r\n\u63a5\u5165\u5c42     \u2502  Gateway \/ Connector                   \u2502  \u2190 \u53ea\u7ba1\u8fde\u63a5\uff0c\u4e0d\u7ba1\u903b\u8f91\r\n          \u2502  \u7ef4\u62a4 session\uff0c\u8f6c\u53d1\u6d88\u606f\uff0c\u5fc3\u8df3\u68c0\u6d4b        \u2502\r\n          \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\r\n                          \u2502 \u5185\u7f51 RPC \/ MQ\r\n     \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\r\n\u903b\u8f91\u5c42\u2502                   \u2502                        \u2502\r\n     \u2502  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510  \u250c\u2500\u25bc\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u2502\r\n     \u2502  \u2502 Room\/Scene \u2502  \u2502  Player    \u2502  \u2502  Match \u2502\u2502\r\n     \u2502  \u2502  Server    \u2502  \u2502  Service   \u2502  \u2502  Maker \u2502\u2502\r\n     \u2502  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u2502\r\n     \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\r\n                          \u2502\r\n          \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25bc\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\r\n\u5b58\u50a8\u5c42     \u2502  Redis (\u70ed\u6570\u636e)  \u2502  MySQL\/PG (\u6301\u4e45\u5316)   \u2502\r\n          \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<\/pre>\n<p>&nbsp;<\/p>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\"><strong>\u63a5\u5165\u5c42\u548c\u903b\u8f91\u5c42\u5206\u79bb<\/strong>\u662f\u6700\u91cd\u8981\u7684\u67b6\u6784\u51b3\u7b56\uff0c\u539f\u56e0\u540e\u9762\u8be6\u8bf4\u3002<\/p>\n<hr class=\"border-border-200 border-t-0.5 my-3 mx-1.5\" \/>\n<h3 class=\"text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold\" dir=\"ltr\">\u4e8c\u3001\u7f51\u7edc I\/O \u6a21\u578b<\/h3>\n<h4 class=\"text-text-100 mt-2 -mb-1 text-base font-bold\" dir=\"ltr\">\u534f\u8bae\u9009\u578b<\/h4>\n<div class=\"overflow-x-auto w-full px-2 mb-6 print:overflow-x-visible\" dir=\"ltr\">\n<table class=\"min-w-full border-collapse text-sm leading-[1.7] whitespace-normal\">\n<thead class=\"text-left\">\n<tr>\n<th class=\"text-text-100 border-b-0.5 border-[hsl(var(--border-300)\/0.6)] py-2 pr-4 align-top font-bold\" scope=\"col\">\u534f\u8bae<\/th>\n<th class=\"text-text-100 border-b-0.5 border-[hsl(var(--border-300)\/0.6)] py-2 pr-4 align-top font-bold\" scope=\"col\">\u5ef6\u8fdf<\/th>\n<th class=\"text-text-100 border-b-0.5 border-[hsl(var(--border-300)\/0.6)] py-2 pr-4 align-top font-bold\" scope=\"col\">\u53ef\u9760\u6027<\/th>\n<th class=\"text-text-100 border-b-0.5 border-[hsl(var(--border-300)\/0.6)] py-2 pr-4 align-top font-bold\" scope=\"col\">\u9002\u7528\u573a\u666f<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td class=\"border-b-0.5 border-[hsl(var(--border-300)\/0.3)] py-2 pr-4 align-top\">TCP<\/td>\n<td class=\"border-b-0.5 border-[hsl(var(--border-300)\/0.3)] py-2 pr-4 align-top\">\u4e2d<\/td>\n<td class=\"border-b-0.5 border-[hsl(var(--border-300)\/0.3)] py-2 pr-4 align-top\">\u6709\u5e8f\u53ef\u9760<\/td>\n<td class=\"border-b-0.5 border-[hsl(var(--border-300)\/0.3)] py-2 pr-4 align-top\">\u5361\u724c\u3001\u56de\u5408\u5236\u3001MMO<\/td>\n<\/tr>\n<tr>\n<td class=\"border-b-0.5 border-[hsl(var(--border-300)\/0.3)] py-2 pr-4 align-top\">WebSocket<\/td>\n<td class=\"border-b-0.5 border-[hsl(var(--border-300)\/0.3)] py-2 pr-4 align-top\">\u4e2d<\/td>\n<td class=\"border-b-0.5 border-[hsl(var(--border-300)\/0.3)] py-2 pr-4 align-top\">\u6709\u5e8f\u53ef\u9760<\/td>\n<td class=\"border-b-0.5 border-[hsl(var(--border-300)\/0.3)] py-2 pr-4 align-top\">\u7f51\u9875\u6e38\u620f\u3001\u8de8\u5e73\u53f0<\/td>\n<\/tr>\n<tr>\n<td class=\"border-b-0.5 border-[hsl(var(--border-300)\/0.3)] py-2 pr-4 align-top\">UDP (KCP\/QUIC)<\/td>\n<td class=\"border-b-0.5 border-[hsl(var(--border-300)\/0.3)] py-2 pr-4 align-top\">\u4f4e<\/td>\n<td class=\"border-b-0.5 border-[hsl(var(--border-300)\/0.3)] py-2 pr-4 align-top\">\u81ea\u63a7<\/td>\n<td class=\"border-b-0.5 border-[hsl(var(--border-300)\/0.3)] py-2 pr-4 align-top\">FPS\u3001MOBA\u3001\u5b9e\u65f6\u5bf9\u6218<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\">\u7eaf UDP \u9002\u5408\u5bf9\u5ef6\u8fdf\u6781\u5ea6\u654f\u611f\u7684\u573a\u666f\uff0c\u4f46\u4f60\u8981\u81ea\u5df1\u5904\u7406\u4e22\u5305\u91cd\u4f20\u3001\u4e71\u5e8f\u3002KCP \u662f\u76ee\u524d\u6700\u5e38\u7528\u7684&#8221;\u53ef\u9760 UDP&#8221;\u534f\u8bae\uff0c\u5728 UDP \u4e4b\u4e0a\u5b9e\u73b0\u4e86 ARQ\uff0c\u5ef6\u8fdf\u6bd4 TCP \u4f4e\u7ea6 30%\uff5e40%\u3002<\/p>\n<h4 class=\"text-text-100 mt-2 -mb-1 text-base font-bold\" dir=\"ltr\">Reactor \u6a21\u578b\uff08\u5355\u7ebf\u7a0b\u4e8b\u4ef6\u5faa\u73af\uff09<\/h4>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\">\u8fd9\u662f\u6240\u6709\u9ad8\u6027\u80fd\u7f51\u7edc\u670d\u52a1\u5668\u7684\u57fa\u7840\uff1a<\/p>\n<div class=\"relative group\/copy bg-bg-000\/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100\" tabindex=\"0\" role=\"group\" aria-label=\"Code\">\n<div class=\"sticky opacity-0 group-hover\/copy:opacity-100 group-focus-within\/copy:opacity-100 top-2 py-2 h-12 w-0 float-right\">\n<div class=\"absolute right-0 h-8 px-2 items-center inline-flex z-10\"><\/div>\n<\/div>\n<div class=\"overflow-x-auto\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\r\n                    \u2502        Event Loop            \u2502\r\n                    \u2502                              \u2502\r\n  \u7f51\u7edc I\/O \u2500\u2500\u2500\u2500\u2500\u2500\u25ba \u2502  epoll_wait()                \u2502\r\n                    \u2502      \u2502                       \u2502\r\n  \u5b9a\u65f6\u5668  \u2500\u2500\u2500\u2500\u2500\u2500\u25ba \u2502      \u25bc                       \u2502\r\n                    \u2502  dispatch to handlers        \u2502\r\n  \u4fe1\u53f7    \u2500\u2500\u2500\u2500\u2500\u2500\u25ba \u2502      \u2502                       \u2502\r\n                    \u2502      \u25bc                       \u2502\r\n                    \u2502  \u6267\u884c handler\uff08\u975e\u963b\u585e\uff01\uff09     \u2502\r\n                    \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\"><strong>\u9ec4\u91d1\u6cd5\u5219\uff1a\u4e8b\u4ef6\u5faa\u73af\u7ebf\u7a0b\u91cc\u6c38\u8fdc\u4e0d\u80fd\u6709\u963b\u585e\u64cd\u4f5c\u3002<\/strong>\u00a0\u6570\u636e\u5e93\u67e5\u8be2\u3001\u6587\u4ef6 I\/O\u3001\u4efb\u4f55\u00a0<code class=\"bg-text-200\/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]\">sleep()<\/code>\uff0c\u5fc5\u987b\u6254\u5230\u5176\u4ed6\u7ebf\u7a0b\u6216\u7528\u5f02\u6b65\u7248\u672c\u3002<\/p>\n<h4 class=\"text-text-100 mt-2 -mb-1 text-base font-bold\" dir=\"ltr\">\u5178\u578b\u7684\u8fde\u63a5\u5904\u7406\u4ee3\u7801\u7ed3\u6784\uff08\u4ee5 Asio \u4e3a\u4f8b\uff09<\/h4>\n<div class=\"relative group\/copy bg-bg-000\/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100\" tabindex=\"0\" role=\"group\" aria-label=\"cpp code\">\n<div class=\"sticky opacity-0 group-hover\/copy:opacity-100 group-focus-within\/copy:opacity-100 top-2 py-2 h-12 w-0 float-right\">\n<div class=\"absolute right-0 h-8 px-2 items-center inline-flex z-10\"><\/div>\n<\/div>\n<div class=\"text-text-500 font-small p-3.5 pb-0\">cpp<\/div>\n<div class=\"overflow-x-auto\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">class GameSession : public std::enable_shared_from_this&lt;GameSession&gt; {\r\npublic:\r\n    explicit GameSession(tcp::socket socket, io_context&amp; ctx)\r\n        : socket_(std::move(socket))\r\n        , heartbeat_timer_(ctx)\r\n        , session_id_(generate_id()) {}\r\n\r\n    void start() {\r\n        update_heartbeat();\r\n        co_spawn(socket_.get_executor(),\r\n                 [self = shared_from_this()]() { return self-&gt;read_loop(); },\r\n                 detached);\r\n    }\r\n\r\nprivate:\r\n    awaitable&lt;void&gt; read_loop() {\r\n        try {\r\n            while (true) {\r\n                \/\/ \u5148\u8bfb 4 \u5b57\u8282\u5305\u5934\uff08\u5305\u542b\u6d88\u606f\u957f\u5ea6\uff09\r\n                uint32_t header;\r\n                co_await async_read(socket_,\r\n                    buffer(&amp;header, 4), use_awaitable);\r\n\r\n                auto msg_len = ntohl(header) &amp; 0x00FFFFFF;  \/\/ \u4f4e24\u4f4d\u662f\u957f\u5ea6\r\n                auto msg_cmd = (ntohl(header) &gt;&gt; 24);        \/\/ \u9ad88\u4f4d\u662f\u547d\u4ee4\u7c7b\u578b\r\n\r\n                if (msg_len &gt; MAX_MSG_SIZE) {\r\n                    disconnect(\"oversized packet\");\r\n                    co_return;\r\n                }\r\n\r\n                std::vector&lt;uint8_t&gt; body(msg_len);\r\n                co_await async_read(socket_,\r\n                    buffer(body), use_awaitable);\r\n\r\n                handle_message(msg_cmd, body);\r\n            }\r\n        } catch (std::exception&amp;) {\r\n            on_disconnect();\r\n        }\r\n    }\r\n\r\n    void handle_message(uint8_t cmd, const std::vector&lt;uint8_t&gt;&amp; body) {\r\n        reset_heartbeat();  \/\/ \u6536\u5230\u6d88\u606f\uff0c\u91cd\u7f6e\u5fc3\u8df3\u8ba1\u65f6\r\n        dispatcher_.dispatch(cmd, shared_from_this(), body);\r\n    }\r\n\r\n    void update_heartbeat() {\r\n        heartbeat_timer_.expires_after(30s);\r\n        heartbeat_timer_.async_wait([self = shared_from_this()](auto ec) {\r\n            if (!ec) {\r\n                self-&gt;disconnect(\"heartbeat timeout\");\r\n            }\r\n        });\r\n    }\r\n\r\n    tcp::socket socket_;\r\n    steady_timer heartbeat_timer_;\r\n    uint64_t session_id_;\r\n};<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<hr class=\"border-border-200 border-t-0.5 my-3 mx-1.5\" \/>\n<h3 class=\"text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold\" dir=\"ltr\">\u4e09\u3001\u6d88\u606f\u534f\u8bae\u8bbe\u8ba1<\/h3>\n<h4 class=\"text-text-100 mt-2 -mb-1 text-base font-bold\" dir=\"ltr\">\u5305\u5934\u683c\u5f0f<\/h4>\n<div class=\"relative group\/copy bg-bg-000\/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100\" tabindex=\"0\" role=\"group\" aria-label=\"Code\">\n<div class=\"sticky opacity-0 group-hover\/copy:opacity-100 group-focus-within\/copy:opacity-100 top-2 py-2 h-12 w-0 float-right\">\n<div class=\"absolute right-0 h-8 px-2 items-center inline-flex z-10\"><\/div>\n<\/div>\n<div class=\"overflow-x-auto\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">0                   1                   2                   3\r\n 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1\r\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\r\n\u2502  Magic (2B)  \u2502  Version (1B)  \u2502  Flag (1B)  \u2502  Length (4B)     \u2502\r\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\r\n\u2502  CmdId (2B)  \u2502  Seq (2B)      \u2502  Timestamp (8B)                \u2502\r\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\r\n\u2502  Body (Length bytes, Protobuf \/ FlatBuffers \/ MessagePack)      \u2502\r\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\">\u51e0\u4e2a\u5173\u952e\u5b57\u6bb5\u7684\u8bbe\u8ba1\u539f\u56e0\uff1a<\/p>\n<ul class=\"[li_&amp;]:mb-0 [li_&amp;]:mt-1 [li_&amp;]:gap-1 [&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc flex flex-col gap-1 pl-8 mb-3 print:block print:space-y-1\" dir=\"ltr\">\n<li class=\"font-claude-response-body whitespace-normal break-words pl-2\"><strong>Magic<\/strong>\uff1a\u5feb\u901f\u8fc7\u6ee4\u975e\u6cd5\u8fde\u63a5\uff0c\u8282\u7701\u89e3\u6790\u5f00\u9500<\/li>\n<li class=\"font-claude-response-body whitespace-normal break-words pl-2\"><strong>Seq\uff08\u5e8f\u5217\u53f7\uff09<\/strong>\uff1a\u5ba2\u6237\u7aef\u53d1\u51fa\u7684\u8bf7\u6c42\u643a\u5e26 seq\uff0c\u670d\u52a1\u5668\u54cd\u5e94\u65f6\u5e26\u4e0a\u540c\u4e00\u4e2a seq\uff0c\u5ba2\u6237\u7aef\u7528\u6765\u5339\u914d\u8bf7\u6c42\u548c\u54cd\u5e94\uff08\u505a\u8d85\u65f6\u91cd\u8bd5\u65f6\u975e\u5e38\u91cd\u8981\uff09<\/li>\n<li class=\"font-claude-response-body whitespace-normal break-words pl-2\"><strong>Timestamp<\/strong>\uff1a\u7528\u4e8e\u5ef6\u8fdf\u7edf\u8ba1\u548c\u53cd\u5916\u6302\u68c0\u6d4b<\/li>\n<li class=\"font-claude-response-body whitespace-normal break-words pl-2\"><strong>Flag<\/strong>\uff1a\u538b\u7f29\u6807\u5fd7\u4f4d\uff0cbody \u8d85\u8fc7\u9608\u503c\u65f6\u542f\u7528\u538b\u7f29<\/li>\n<\/ul>\n<h4 class=\"text-text-100 mt-2 -mb-1 text-base font-bold\" dir=\"ltr\">\u5e8f\u5217\u5316\u683c\u5f0f\u9009\u62e9<\/h4>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\"><strong>Protobuf<\/strong>\uff1a\u5b57\u6bb5\u6709 ID\uff0c\u5411\u540e\u517c\u5bb9\u597d\uff0c\u751f\u6001\u6210\u719f\uff0c\u9996\u9009\u3002<br \/>\n<strong>FlatBuffers<\/strong>\uff1a\u96f6\u62f7\u8d1d\u8bfb\u53d6\uff0c\u9002\u5408\u5bf9\u8c61\u5f88\u5927\u3001\u9700\u8981\u968f\u673a\u8bbf\u95ee\u5b57\u6bb5\u7684\u573a\u666f\uff08\u6bd4\u5982\u5730\u56fe\u6570\u636e\uff09\u3002<br \/>\n<strong>MessagePack<\/strong>\uff1a\u52a8\u6001\u7c7b\u578b\uff0c\u9002\u5408\u5feb\u901f\u8fed\u4ee3\u7684\u5c0f\u56e2\u961f\u6216\u811a\u672c\u8bed\u8a00\u3002<\/p>\n<hr class=\"border-border-200 border-t-0.5 my-3 mx-1.5\" \/>\n<h3 class=\"text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold\" dir=\"ltr\">\u56db\u3001\u6e38\u620f\u4e3b\u5faa\u73af\uff08Game Loop \/ Tick\uff09<\/h3>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\">\u8fd9\u662f\u6e38\u620f\u670d\u52a1\u5668\u548c\u666e\u901a\u670d\u52a1\u5668\u6700\u5927\u7684\u533a\u522b\u3002\u6e38\u620f\u4e16\u754c\u9700\u8981<strong>\u5b9a\u671f\u63a8\u8fdb\u72b6\u6001<\/strong>\uff0c\u4e0d\u80fd\u53ea\u54cd\u5e94\u5ba2\u6237\u7aef\u4e8b\u4ef6\u3002<\/p>\n<div class=\"relative group\/copy bg-bg-000\/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100\" tabindex=\"0\" role=\"group\" aria-label=\"cpp code\">\n<div class=\"sticky opacity-0 group-hover\/copy:opacity-100 group-focus-within\/copy:opacity-100 top-2 py-2 h-12 w-0 float-right\">\n<div class=\"absolute right-0 h-8 px-2 items-center inline-flex z-10\"><\/div>\n<\/div>\n<div class=\"text-text-500 font-small p-3.5 pb-0\">cpp<\/div>\n<div class=\"overflow-x-auto\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">class Room {\r\npublic:\r\n    void start_game_loop() {\r\n        \/\/ \u5178\u578b\u6e38\u620f\uff1a66ms tick\uff08\u7ea615\u5e27\/\u79d2\uff09\r\n        \/\/ \u7ade\u6280\u6e38\u620f\uff1a33ms tick\uff08\u7ea630\u5e27\/\u79d2\uff09\r\n        \/\/ FPS\uff1a16ms tick\uff08\u7ea660\u5e27\/\u79d2\uff09\r\n        tick_timer_.expires_after(TICK_INTERVAL);\r\n        tick_timer_.async_wait([this](auto ec) {\r\n            if (!ec) tick();\r\n        });\r\n    }\r\n\r\nprivate:\r\n    void tick() {\r\n        auto now = Clock::now();\r\n        auto dt  = now - last_tick_;\r\n        last_tick_ = now;\r\n\r\n        \/\/ 1. \u5904\u7406\u672c\u5e27\u79ef\u7d2f\u7684\u6240\u6709\u8f93\u5165\r\n        process_pending_inputs();\r\n\r\n        \/\/ 2. \u66f4\u65b0\u6e38\u620f\u72b6\u6001\r\n        update_physics(dt);\r\n        update_ai(dt);\r\n        update_skills(dt);\r\n        check_collisions();\r\n\r\n        \/\/ 3. \u5411\u6240\u6709\u5ba2\u6237\u7aef\u5e7f\u64ad\u672c\u5e27\u72b6\u6001\r\n        broadcast_world_state();\r\n\r\n        \/\/ 4. \u8c03\u5ea6\u4e0b\u4e00\u5e27\r\n        tick_timer_.expires_at(tick_timer_.expiry() + TICK_INTERVAL);\r\n        tick_timer_.async_wait([this](auto ec) {\r\n            if (!ec) tick();\r\n        });\r\n    }\r\n\r\n    void process_pending_inputs() {\r\n        \/\/ \u8f93\u5165\u961f\u5217\uff1a\u7f51\u7edc\u7ebf\u7a0b\u6536\u5230\u6d88\u606f\u540e push\uff0c\u6e38\u620f\u7ebf\u7a0b tick \u65f6 pop\r\n        \/\/ \u8fd9\u662f\u7ebf\u7a0b\u5b89\u5168\u7684\u5173\u952e\u8fb9\u754c\r\n        InputMsg msg;\r\n        while (input_queue_.try_pop(msg)) {\r\n            apply_player_input(msg.player_id, msg.action);\r\n        }\r\n    }\r\n\r\n    void broadcast_world_state() {\r\n        \/\/ \u4e0d\u662f\u6bcf\u5e27\u90fd\u5168\u91cf\u5e7f\u64ad\uff0c\u800c\u662f\u5dee\u91cf\uff08delta\uff09\u5e7f\u64ad\r\n        auto delta = world_.compute_delta(last_broadcast_state_);\r\n        if (!delta.empty()) {\r\n            for (auto&amp; [id, session] : players_) {\r\n                session-&gt;send(serialize(delta));\r\n            }\r\n            last_broadcast_state_ = world_.snapshot();\r\n        }\r\n    }\r\n\r\n    static constexpr auto TICK_INTERVAL = std::chrono::milliseconds(66);\r\n    steady_timer tick_timer_;\r\n    ConcurrentQueue&lt;InputMsg&gt; input_queue_;  \/\/ \u552f\u4e00\u7684\u7ebf\u7a0b\u95f4\u901a\u4fe1\u70b9\r\n    WorldState world_;\r\n    WorldState last_broadcast_state_;\r\n};<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\"><strong>\u5173\u952e\u539f\u5219\uff1a\u6e38\u620f\u903b\u8f91\u5728\u5355\u4e00\u7ebf\u7a0b\u91cc\u987a\u5e8f\u6267\u884c\uff0c\u5b8c\u5168\u907f\u514d\u9501\u3002<\/strong>\u00a0\u7f51\u7edc\u7ebf\u7a0b\u53ea\u8d1f\u8d23\u628a\u6d88\u606f\u63a8\u5165\u961f\u5217\uff0c\u6e38\u620f\u7ebf\u7a0b\u5728 tick \u65f6\u7edf\u4e00\u5904\u7406\u3002<\/p>\n<hr class=\"border-border-200 border-t-0.5 my-3 mx-1.5\" \/>\n<h3 class=\"text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold\" dir=\"ltr\">\u4e94\u3001\u72b6\u6001\u7ba1\u7406\u4e0e\u7ebf\u7a0b\u6a21\u578b<\/h3>\n<h4 class=\"text-text-100 mt-2 -mb-1 text-base font-bold\" dir=\"ltr\">Actor \u6a21\u578b<\/h4>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\">\u6bcf\u4e2a Room\/Scene \u662f\u4e00\u4e2a\u72ec\u7acb\u7684 Actor\uff0c\u62e5\u6709\u81ea\u5df1\u7684\u72b6\u6001\u548c\u6d88\u606f\u961f\u5217\uff0c\u4e0d\u5171\u4eab\u4efb\u4f55\u53ef\u53d8\u6570\u636e\uff1a<\/p>\n<div class=\"relative group\/copy bg-bg-000\/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100\" tabindex=\"0\" role=\"group\" aria-label=\"Code\">\n<div class=\"sticky opacity-0 group-hover\/copy:opacity-100 group-focus-within\/copy:opacity-100 top-2 py-2 h-12 w-0 float-right\">\n<div class=\"absolute right-0 h-8 px-2 items-center inline-flex z-10\"><\/div>\n<\/div>\n<div class=\"overflow-x-auto\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">\u7f51\u7edc\u7ebf\u7a0b\u6c60           \u903b\u8f91\u7ebf\u7a0b\u6c60\r\n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500        \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\nThread-0:  \u2500\u2500msg\u2500\u2500\u25ba Room-1 (single thread)\r\nThread-1:  \u2500\u2500msg\u2500\u2500\u25ba Room-2 (single thread)\r\nThread-2:  \u2500\u2500msg\u2500\u2500\u25ba Room-3 (single thread)\r\n...<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\">\u8fd9\u4e2a\u6a21\u578b\u7684\u597d\u5904\uff1a<\/p>\n<ul class=\"[li_&amp;]:mb-0 [li_&amp;]:mt-1 [li_&amp;]:gap-1 [&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc flex flex-col gap-1 pl-8 mb-3 print:block print:space-y-1\" dir=\"ltr\">\n<li class=\"font-claude-response-body whitespace-normal break-words pl-2\">Room \u5185\u90e8\u5b8c\u5168\u65e0\u9501\uff0c\u903b\u8f91\u7b80\u5355<\/li>\n<li class=\"font-claude-response-body whitespace-normal break-words pl-2\">Room \u4e4b\u95f4\u5929\u7136\u9694\u79bb\uff0c\u4e00\u4e2a Room \u5d29\u6e83\u4e0d\u5f71\u54cd\u5176\u4ed6 Room<\/li>\n<li class=\"font-claude-response-body whitespace-normal break-words pl-2\">\u6c34\u5e73\u6269\u5c55\u7b80\u5355\uff0c\u628a Room \u8fc1\u79fb\u5230\u5176\u4ed6\u8fdb\u7a0b\/\u673a\u5668\u5373\u53ef<\/li>\n<\/ul>\n<h4 class=\"text-text-100 mt-2 -mb-1 text-base font-bold\" dir=\"ltr\">\u73a9\u5bb6\u72b6\u6001\u5206\u5c42<\/h4>\n<div class=\"relative group\/copy bg-bg-000\/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100\" tabindex=\"0\" role=\"group\" aria-label=\"Code\">\n<div class=\"sticky opacity-0 group-hover\/copy:opacity-100 group-focus-within\/copy:opacity-100 top-2 py-2 h-12 w-0 float-right\">\n<div class=\"absolute right-0 h-8 px-2 items-center inline-flex z-10\"><\/div>\n<\/div>\n<div class=\"overflow-x-auto\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">L1: \u4f1a\u8bdd\u5185\u5b58\uff08GameSession\uff09\r\n    \u2514\u2500 \u8fde\u63a5\u72b6\u6001\u3001\u5e8f\u5217\u53f7\u3001\u672a\u53d1\u9001\u7684\u6d88\u606f\u7f13\u51b2\r\n    \r\nL2: \u623f\u95f4\u5185\u5b58\uff08Room\uff09\r\n    \u2514\u2500 \u5f53\u524d\u4f4d\u7f6e\u3001\u8840\u91cf\u3001\u6280\u80fd CD \u7b49\u5b9e\u65f6\u72b6\u6001\uff08\u6bcf\u5e27\u53d8\u5316\uff09\r\n    \r\nL3: Redis\uff08\u70ed\u6570\u636e\uff09\r\n    \u2514\u2500 \u80cc\u5305\u3001\u8d27\u5e01\u3001\u597d\u53cb\u5217\u8868\uff08\u5206\u949f\u7ea7\u6301\u4e45\u5316\uff09\r\n    \r\nL4: MySQL\uff08\u51b7\u6570\u636e\uff09\r\n    \u2514\u2500 \u5386\u53f2\u5bf9\u6218\u8bb0\u5f55\u3001\u8d26\u5355\u3001\u957f\u671f\u7edf\u8ba1\uff08\u5f02\u6b65\u843d\u5e93\uff09<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\">\u5199\u5165\u65f6\u9075\u5faa\uff1a<strong>\u5148\u6539 L2 \u5185\u5b58\uff0c\u5f02\u6b65\u5199 L3 Redis\uff0c\u5f02\u6b65\u5199 L4 MySQL<\/strong>\u3002<br \/>\n\u8bfb\u53d6\u65f6\u9075\u5faa\uff1a<strong>L2 \u2192 L3 \u2192 L4<\/strong>\uff0c\u9010\u5c42\u7a7f\u900f\u3002<\/p>\n<hr class=\"border-border-200 border-t-0.5 my-3 mx-1.5\" \/>\n<h3 class=\"text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold\" dir=\"ltr\">\u516d\u3001\u63a5\u5165\u5c42\u4e0e\u903b\u8f91\u5c42\u5206\u79bb\u7684\u4ef7\u503c<\/h3>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\">\u8fd9\u662f\u67b6\u6784\u91cc\u6700\u91cd\u8981\u7684\u51b3\u7b56\uff0c\u4e0d\u505a\u8fd9\u4e2a\u5206\u79bb\u4f1a\u9762\u4e34\u707e\u96be\uff1a<\/p>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\"><strong>\u4e0d\u5206\u79bb\u65f6\u7684\u95ee\u9898<\/strong>\uff1a<\/p>\n<ul class=\"[li_&amp;]:mb-0 [li_&amp;]:mt-1 [li_&amp;]:gap-1 [&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc flex flex-col gap-1 pl-8 mb-3 print:block print:space-y-1\" dir=\"ltr\">\n<li class=\"font-claude-response-body whitespace-normal break-words pl-2\">\u903b\u8f91\u670d\u91cd\u542f \u2192 \u73a9\u5bb6\u5168\u90e8\u65ad\u7ebf<\/li>\n<li class=\"font-claude-response-body whitespace-normal break-words pl-2\">\u903b\u8f91\u670d\u6269\u5bb9 \u2192 \u9700\u8981\u91cd\u65b0\u8d1f\u8f7d\u5747\u8861\uff0c\u8001\u8fde\u63a5\u5168\u65ad<\/li>\n<li class=\"font-claude-response-body whitespace-normal break-words pl-2\">\u4e00\u4e2a bug \u5d29\u4e86\u903b\u8f91 \u2192 \u8fde\u63a5\u5168\u4e22<\/li>\n<\/ul>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\"><strong>\u5206\u79bb\u540e<\/strong>\uff1a<\/p>\n<div class=\"relative group\/copy bg-bg-000\/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100\" tabindex=\"0\" role=\"group\" aria-label=\"Code\">\n<div class=\"sticky opacity-0 group-hover\/copy:opacity-100 group-focus-within\/copy:opacity-100 top-2 py-2 h-12 w-0 float-right\">\n<div class=\"absolute right-0 h-8 px-2 items-center inline-flex z-10\"><\/div>\n<\/div>\n<div class=\"overflow-x-auto\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">\u73a9\u5bb6\u8fde\u63a5 \u2192 Gateway\uff08\u957f\u671f\u7a33\u5b9a\uff0c\u51e0\u4e4e\u4e0d\u91cd\u542f\uff09\r\n                \u2502\r\n                \u2502 \u5185\u7f51\u77ed\u8fde\u63a5 \/ \u6d88\u606f\u961f\u5217\r\n                \u25bc\r\n           Logic Server\uff08\u53ef\u4ee5\u968f\u610f\u91cd\u542f\u3001\u6269\u7f29\u5bb9\u3001\u6eda\u52a8\u66f4\u65b0\uff09<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\">Gateway \u53ea\u7ef4\u62a4\u00a0<code class=\"bg-text-200\/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]\">session_id \u2192 logic_server_addr<\/code>\u00a0\u7684\u6620\u5c04\u8868\uff0c\u903b\u8f91\u670d\u91cd\u542f\u65f6\uff0c\u73a9\u5bb6\u8fde\u63a5\u4e0d\u65ad\uff0cGateway \u628a\u6d88\u606f\u8def\u7531\u5230\u65b0\u7684\u903b\u8f91\u670d\u5373\u53ef\u5b9e\u73b0<strong>\u70ed\u66f4\u65b0<\/strong>\u3002<\/p>\n<hr class=\"border-border-200 border-t-0.5 my-3 mx-1.5\" \/>\n<h3 class=\"text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold\" dir=\"ltr\">\u4e03\u3001\u65ad\u7ebf\u91cd\u8fde\u8bbe\u8ba1<\/h3>\n<div class=\"relative group\/copy bg-bg-000\/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100\" tabindex=\"0\" role=\"group\" aria-label=\"Code\">\n<div class=\"sticky opacity-0 group-hover\/copy:opacity-100 group-focus-within\/copy:opacity-100 top-2 py-2 h-12 w-0 float-right\">\n<div class=\"absolute right-0 h-8 px-2 items-center inline-flex z-10\"><\/div>\n<\/div>\n<div class=\"overflow-x-auto\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">\u5ba2\u6237\u7aef                          \u670d\u52a1\u5668\r\n   \u2502                               \u2502\r\n   \u2502   \u65ad\u7ebf\uff08TCP FIN \/ \u8d85\u65f6\uff09        \u2502\r\n   \u2502                               \u2502  \u2190 session \u4e0d\u7acb\u5373\u9500\u6bc1\r\n   \u2502                               \u2502     \u542f\u52a830\u79d2\u5012\u8ba1\u65f6\r\n   \u2502   \u91cd\u65b0\u8fde\u63a5\uff0c\u643a\u5e26 session_token  \u2502\r\n   \u2502 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25ba\u2502\r\n   \u2502                               \u2502  \u2190 \u9a8c\u8bc1 token\uff0c\u6062\u590d\u72b6\u6001\r\n   \u2502   \u65ad\u7ebf\u671f\u95f4\u79ef\u7d2f\u7684\u4e8b\u4ef6\uff08\u589e\u91cf\u540c\u6b65\uff09  \u2502\r\n   \u2502 \u25c4\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502\r\n   \u2502                               \u2502\r\n   \u2502   \u7ee7\u7eed\u6e38\u620f                     \u2502<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\">\u5b9e\u73b0\u8981\u70b9\uff1a<\/p>\n<ul class=\"[li_&amp;]:mb-0 [li_&amp;]:mt-1 [li_&amp;]:gap-1 [&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc flex flex-col gap-1 pl-8 mb-3 print:block print:space-y-1\" dir=\"ltr\">\n<li class=\"font-claude-response-body whitespace-normal break-words pl-2\">Session token \u8981\u6709\u6709\u6548\u671f\uff08\u4e00\u822c 30\uff5e60 \u79d2\uff09\uff0c\u8fc7\u671f\u540e\u72b6\u6001\u6e05\u7406<\/li>\n<li class=\"font-claude-response-body whitespace-normal break-words pl-2\">\u65ad\u7ebf\u671f\u95f4\u53d1\u751f\u7684\u6e38\u620f\u4e8b\u4ef6\u8981\u8bb0\u5f55\u5728\u73af\u5f62\u7f13\u51b2\u533a\u91cc\uff0c\u91cd\u8fde\u540e\u91cd\u653e<\/li>\n<li class=\"font-claude-response-body whitespace-normal break-words pl-2\">\u5ba2\u6237\u7aef\u8981\u6709\u672c\u5730\u72b6\u6001\u5feb\u7167\uff0c\u7ed3\u5408\u670d\u52a1\u5668\u589e\u91cf\u6570\u636e\u505a\u5bf9\u8d26<\/li>\n<\/ul>\n<hr class=\"border-border-200 border-t-0.5 my-3 mx-1.5\" \/>\n<h3 class=\"text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold\" dir=\"ltr\">\u516b\u3001\u540c\u6b65\u7b56\u7565\uff1a\u5982\u4f55\u5904\u7406\u591a\u73a9\u5bb6\u4e00\u81f4\u6027<\/h3>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\">\u8fd9\u662f\u6e38\u620f\u670d\u52a1\u5668\u6700\u6709\u6280\u672f\u6df1\u5ea6\u7684\u95ee\u9898\uff0c\u4e3b\u8981\u6709\u4e24\u79cd\u6d41\u6d3e\uff1a<\/p>\n<h4 class=\"text-text-100 mt-2 -mb-1 text-base font-bold\" dir=\"ltr\">\u72b6\u6001\u540c\u6b65\uff08State Sync\uff09<\/h4>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\">\u670d\u52a1\u5668\u662f\u6743\u5a01\uff0c\u5b9a\u671f\u628a<strong>\u6700\u7ec8\u72b6\u6001<\/strong>\u5e7f\u64ad\u7ed9\u6240\u6709\u5ba2\u6237\u7aef\u3002<\/p>\n<div class=\"relative group\/copy bg-bg-000\/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100\" tabindex=\"0\" role=\"group\" aria-label=\"Code\">\n<div class=\"sticky opacity-0 group-hover\/copy:opacity-100 group-focus-within\/copy:opacity-100 top-2 py-2 h-12 w-0 float-right\">\n<div class=\"absolute right-0 h-8 px-2 items-center inline-flex z-10\"><\/div>\n<\/div>\n<div class=\"overflow-x-auto\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">\u670d\u52a1\u5668\u6bcf\u5e27\uff1a\r\n  1. \u6536\u96c6\u6240\u6709\u73a9\u5bb6\u8f93\u5165\r\n  2. \u8ba1\u7b97\u65b0\u7684\u4e16\u754c\u72b6\u6001\r\n  3. \u5e7f\u64ad {position, hp, animation_state, ...} \u7ed9\u6240\u6709\u4eba\r\n\r\n\u5ba2\u6237\u7aef\uff1a\r\n  \u6536\u5230\u72b6\u6001 \u2192 \u63d2\u503c\uff08Interpolation\uff09\u5e73\u6ed1\u663e\u793a\r\n  \u672c\u5730\u9884\u6d4b \u2192 \u53d1\u51fa\u8f93\u5165\u65f6\u7acb\u5373\u672c\u5730\u6267\u884c\uff08\u5ba2\u6237\u7aef\u9884\u6d4b\uff09\r\n  \u6536\u5230\u6743\u5a01\u72b6\u6001 \u2192 \u5bf9\u8d26\uff0c\u5982\u6709\u504f\u5dee\u5219\u56de\u6eda\u4fee\u6b63\uff08Reconciliation\uff09<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\">\u4f18\u70b9\uff1a\u9632\u5916\u6302\u80fd\u529b\u5f3a\uff0c\u670d\u52a1\u5668\u6821\u9a8c\u4e00\u5207\u3002<br \/>\n\u7f3a\u70b9\uff1a\u5e26\u5bbd\u6d88\u8017\u5927\uff0c\u5ef6\u8fdf\u654f\u611f\u3002<\/p>\n<h4 class=\"text-text-100 mt-2 -mb-1 text-base font-bold\" dir=\"ltr\">\u5e27\u540c\u6b65\uff08Lockstep \/ Frame Sync\uff09<\/h4>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\">\u670d\u52a1\u5668\u53ea\u8f6c\u53d1\u6240\u6709\u73a9\u5bb6\u7684<strong>\u8f93\u5165<\/strong>\uff0c\u5ba2\u6237\u7aef\u7528\u76f8\u540c\u7684\u8f93\u5165\u81ea\u5df1\u8ba1\u7b97\u72b6\u6001\uff0c\u4fdd\u8bc1\u6240\u6709\u7aef\u8ba1\u7b97\u7ed3\u679c\u4e00\u81f4\u3002<\/p>\n<div class=\"relative group\/copy bg-bg-000\/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100\" tabindex=\"0\" role=\"group\" aria-label=\"Code\">\n<div class=\"sticky opacity-0 group-hover\/copy:opacity-100 group-focus-within\/copy:opacity-100 top-2 py-2 h-12 w-0 float-right\">\n<div class=\"absolute right-0 h-8 px-2 items-center inline-flex z-10\"><\/div>\n<\/div>\n<div class=\"overflow-x-auto\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">\u670d\u52a1\u5668\u6bcf\u5e27\uff1a\r\n  \u6536\u96c6\u6240\u6709\u73a9\u5bb6\u7684\u64cd\u4f5c\u6307\u4ee4\r\n  \u5e7f\u64ad {frame_id, player_inputs[]} \u7ed9\u6240\u6709\u4eba\r\n\r\n\u5ba2\u6237\u7aef\uff1a\r\n  \u7528\u540c\u4e00\u5957\u786e\u5b9a\u6027\u903b\u8f91\uff0c\u7528\u540c\u6837\u7684\u8f93\u5165\uff0c\u7b97\u51fa\u540c\u6837\u7684\u7ed3\u679c\r\n  \u8981\u6c42\uff1a\u968f\u673a\u6570\u79cd\u5b50\u76f8\u540c\uff0c\u6d6e\u70b9\u6570\u7528\u5b9a\u70b9\u6570\u66ff\u4ee3\uff0c\u7269\u7406\u5f15\u64ce\u786e\u5b9a\u6027<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\">\u4f18\u70b9\uff1a\u5e26\u5bbd\u6781\u4f4e\uff08\u53ea\u4f20\u8f93\u5165\uff09\uff0c\u6218\u6597\u5f55\u50cf\u5929\u7136\u652f\u6301\uff08\u91cd\u653e\u8f93\u5165\u5e8f\u5217\u5373\u53ef\uff09\u3002<br \/>\n\u7f3a\u70b9\uff1a\u4efb\u4f55\u4e0d\u786e\u5b9a\u6027\uff08\u6d6e\u70b9\u8bef\u5dee\u3001\u5e73\u53f0\u5dee\u5f02\uff09\u90fd\u4f1a\u5bfc\u81f4\u4e0d\u540c\u6b65\uff1b\u65ad\u7ebf\u91cd\u8fde\u9700\u8981\u4ece\u5934\u91cd\u7b97\u3002<\/p>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\">MOBA\uff08\u738b\u8005\u8363\u8000\u3001Dota\uff09\u901a\u5e38\u7528\u5e27\u540c\u6b65\uff0cMMO \u901a\u5e38\u7528\u72b6\u6001\u540c\u6b65\u3002<\/p>\n<hr class=\"border-border-200 border-t-0.5 my-3 mx-1.5\" \/>\n<h3 class=\"text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold\" dir=\"ltr\">\u4e5d\u3001\u51e0\u4e2a\u5fc5\u987b\u89e3\u51b3\u7684\u7ec6\u8282\u95ee\u9898<\/h3>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\"><strong>\u5927\u5305\u5206\u7247\u4e0e Nagle \u7b97\u6cd5<\/strong><\/p>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\">TCP \u9ed8\u8ba4\u5f00\u542f Nagle \u7b97\u6cd5\uff08\u5c0f\u5305\u5408\u5e76\uff09\uff0c\u5bf9\u5b9e\u65f6\u6e38\u620f\u6709\u5bb3\uff0c\u5fc5\u987b\u5173\u6389\uff1a<\/p>\n<div class=\"relative group\/copy bg-bg-000\/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100\" tabindex=\"0\" role=\"group\" aria-label=\"cpp code\">\n<div class=\"sticky opacity-0 group-hover\/copy:opacity-100 group-focus-within\/copy:opacity-100 top-2 py-2 h-12 w-0 float-right\">\n<div class=\"absolute right-0 h-8 px-2 items-center inline-flex z-10\"><\/div>\n<\/div>\n<div class=\"text-text-500 font-small p-3.5 pb-0\">cpp<\/div>\n<div class=\"overflow-x-auto\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">socket.set_option(tcp::no_delay(true));<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\"><strong>\u5199\u7f13\u51b2\u80cc\u538b<\/strong><\/p>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\">\u5f53\u5ba2\u6237\u7aef\u6536\u5305\u6162\uff08\u5f31\u7f51\uff09\u65f6\uff0c\u670d\u52a1\u5668\u5199\u7f13\u51b2\u4f1a\u79ef\u538b\u3002\u5fc5\u987b\u8bbe\u4e0a\u9650\uff0c\u8d85\u8fc7\u5219\u65ad\u5f00\uff0c\u5426\u5219\u5185\u5b58\u4f1a\u65e0\u9650\u589e\u957f\uff1a<\/p>\n<div class=\"relative group\/copy bg-bg-000\/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100\" tabindex=\"0\" role=\"group\" aria-label=\"cpp code\">\n<div class=\"sticky opacity-0 group-hover\/copy:opacity-100 group-focus-within\/copy:opacity-100 top-2 py-2 h-12 w-0 float-right\">\n<div class=\"absolute right-0 h-8 px-2 items-center inline-flex z-10\"><\/div>\n<\/div>\n<div class=\"text-text-500 font-small p-3.5 pb-0\">cpp<\/div>\n<div class=\"overflow-x-auto\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">void send(std::vector&lt;uint8_t&gt; data) {\r\n    if (send_queue_.size() &gt; MAX_QUEUE_SIZE) {\r\n        disconnect(\"send buffer overflow\");\r\n        return;\r\n    }\r\n    send_queue_.push(std::move(data));\r\n    if (!writing_) do_write();\r\n}<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\"><strong>\u6d88\u606f\u5408\u5e76\uff08Batch\uff09<\/strong><\/p>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\">\u6e38\u620f\u91cc\u5f88\u591a\u5c0f\u6d88\u606f\uff08\u4f4d\u7f6e\u66f4\u65b0\uff09\u53ef\u4ee5\u5408\u5e76\u6210\u4e00\u4e2a\u5305\u53d1\u9001\uff0c\u51cf\u5c11\u7cfb\u7edf\u8c03\u7528\u6b21\u6570\u548c\u5305\u5934\u5f00\u9500\uff1a<\/p>\n<div class=\"relative group\/copy bg-bg-000\/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100\" tabindex=\"0\" role=\"group\" aria-label=\"cpp code\">\n<div class=\"sticky opacity-0 group-hover\/copy:opacity-100 group-focus-within\/copy:opacity-100 top-2 py-2 h-12 w-0 float-right\">\n<div class=\"absolute right-0 h-8 px-2 items-center inline-flex z-10\"><\/div>\n<\/div>\n<div class=\"text-text-500 font-small p-3.5 pb-0\">cpp<\/div>\n<div class=\"overflow-x-auto\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">void flush() {\r\n    \/\/ \u628a\u672c\u5e27\u6240\u6709\u5f85\u53d1\u6d88\u606f\u5408\u5e76\u6210\u4e00\u4e2a iovec\uff0c\u4e00\u6b21 writev \u8c03\u7528\r\n    std::vector&lt;asio::const_buffer&gt; buffers;\r\n    while (!pending_.empty()) {\r\n        buffers.push_back(asio::buffer(pending_.front()));\r\n        pending_.pop();\r\n    }\r\n    async_write(socket_, buffers, ...);\r\n}<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<hr class=\"border-border-200 border-t-0.5 my-3 mx-1.5\" \/>\n<h3 class=\"text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold\" dir=\"ltr\">\u5341\u3001\u76d1\u63a7\u4e0e\u53ef\u89c2\u6d4b\u6027<\/h3>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\">\u6e38\u620f\u670d\u52a1\u5668\u7684\u76d1\u63a7\u6307\u6807\u8981\u6bd4\u666e\u901a\u670d\u52a1\u7cbe\u7ec6\u5f97\u591a\uff1a<\/p>\n<div class=\"relative group\/copy bg-bg-000\/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100\" tabindex=\"0\" role=\"group\" aria-label=\"Code\">\n<div class=\"sticky opacity-0 group-hover\/copy:opacity-100 group-focus-within\/copy:opacity-100 top-2 py-2 h-12 w-0 float-right\">\n<div class=\"absolute right-0 h-8 px-2 items-center inline-flex z-10\"><\/div>\n<\/div>\n<div class=\"overflow-x-auto\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">\u8fde\u63a5\u5c42\u6307\u6807\uff1a\r\n  \u5728\u7ebf\u4eba\u6570\u3001\u6bcf\u79d2\u65b0\u589e\u8fde\u63a5\u3001\u65ad\u7ebf\u7387\u3001\u65ad\u7ebf\u539f\u56e0\u5206\u5e03\r\n\r\n\u7f51\u7edc\u5c42\u6307\u6807\uff1a\r\n  RTT \u5206\u5e03\uff08P50\/P95\/P99\uff09\u3001\u4e22\u5305\u7387\u3001\u91cd\u4f20\u7387\r\n  \u5165\u7ad9\u5e26\u5bbd\u3001\u51fa\u7ad9\u5e26\u5bbd\u3001\u6bcf\u8fde\u63a5\u5e73\u5747\u5e26\u5bbd\r\n\r\n\u903b\u8f91\u5c42\u6307\u6807\uff1a\r\n  Tick \u8017\u65f6\uff08\u5fc5\u987b &lt; TICK_INTERVAL\uff09\u3001Tick \u5ef6\u8fdf\u7387\r\n  \u6d88\u606f\u961f\u5217\u79ef\u538b\u6df1\u5ea6\u3001\u6d88\u606f\u5904\u7406\u8017\u65f6\u5206\u5e03\r\n  \u6bcf\u79cd\u6d88\u606f\u7684 QPS\r\n\r\n\u4e1a\u52a1\u6307\u6807\uff1a\r\n  \u623f\u95f4\u6570\u3001\u5e73\u5747\u623f\u95f4\u4eba\u6570\u3001\u5339\u914d\u7b49\u5f85\u65f6\u95f4\r\n  \u6218\u6597\u65f6\u957f\u5206\u5e03\u3001\u5f02\u5e38\u9000\u51fa\u7387<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\">Tick \u8017\u65f6\u662f\u6700\u5173\u952e\u7684\u5065\u5eb7\u6307\u6807\u3002\u5982\u679c 66ms \u7684 tick \u8017\u65f6\u8d85\u8fc7 66ms\uff0c\u6e38\u620f\u903b\u8f91\u5f00\u59cb\u8ffd\u4e0d\u4e0a\u5b9e\u65f6\uff0c\u73a9\u5bb6\u4f1a\u611f\u53d7\u5230\u660e\u663e\u5361\u987f\u3002<\/p>\n<hr class=\"border-border-200 border-t-0.5 my-3 mx-1.5\" \/>\n<h3 class=\"text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold\" dir=\"ltr\">\u5341\u4e00\u3001\u538b\u6d4b\u65f6\u7684\u7279\u6b8a\u6ce8\u610f\u4e8b\u9879<\/h3>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\">HTTP \u670d\u52a1\u538b\u6d4b\u5f88\u7b80\u5355\uff0c\u53d1\u8bf7\u6c42\u5c31\u884c\u3002\u6e38\u620f\u957f\u8fde\u63a5\u538b\u6d4b\u96be\u5f97\u591a\uff0c\u9700\u8981\u6a21\u62df\u771f\u5b9e\u7684\u5ba2\u6237\u7aef\u884c\u4e3a\uff1a<\/p>\n<ul class=\"[li_&amp;]:mb-0 [li_&amp;]:mt-1 [li_&amp;]:gap-1 [&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc flex flex-col gap-1 pl-8 mb-3 print:block print:space-y-1\" dir=\"ltr\">\n<li class=\"font-claude-response-body whitespace-normal break-words pl-2\">\u6bcf\u4e2a\u865a\u62df\u7528\u6237\u9700\u8981\u7ef4\u62a4\u72b6\u6001\uff08\u4e0d\u662f\u65e0\u72b6\u6001\u7684\u8bf7\u6c42\uff09<\/li>\n<li class=\"font-claude-response-body whitespace-normal break-words pl-2\">\u9700\u8981\u6a21\u62df\u5fc3\u8df3\u3001\u767b\u5f55\u6d41\u7a0b\u3001\u623f\u95f4\u5339\u914d<\/li>\n<li class=\"font-claude-response-body whitespace-normal break-words pl-2\">\u9700\u8981\u6a21\u62df\u5f31\u7f51\uff08\u968f\u673a\u5ef6\u8fdf\u3001\u4e22\u5305\uff09\u4e0b\u7684\u8868\u73b0<\/li>\n<li class=\"font-claude-response-body whitespace-normal break-words pl-2\">\u538b\u6d4b\u65f6\u95f4\u8981\u591f\u957f\uff08\u81f3\u5c11\u51e0\u5341\u5206\u949f\uff09\uff0c\u627e\u5185\u5b58\u6cc4\u6f0f<\/li>\n<\/ul>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\">\u5e38\u7528\u5de5\u5177\uff1a\u81ea\u7814\u673a\u5668\u4eba\u5ba2\u6237\u7aef\uff08\u590d\u7528\u6e38\u620f\u5ba2\u6237\u7aef\u7684\u7f51\u7edc\u5c42\uff09\uff0c\u6216\u8005 Locust \u914d\u5408\u81ea\u5b9a\u4e49\u534f\u8bae\u63d2\u4ef6\u3002<\/p>\n<hr class=\"border-border-200 border-t-0.5 my-3 mx-1.5\" \/>\n<h3 class=\"text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold\" dir=\"ltr\">\u6700\u540e\uff1a\u6280\u672f\u6808\u63a8\u8350<\/h3>\n<div class=\"overflow-x-auto w-full px-2 mb-6 print:overflow-x-visible\" dir=\"ltr\">\n<table class=\"min-w-full border-collapse text-sm leading-[1.7] whitespace-normal\">\n<thead class=\"text-left\">\n<tr>\n<th class=\"text-text-100 border-b-0.5 border-[hsl(var(--border-300)\/0.6)] py-2 pr-4 align-top font-bold\" scope=\"col\">\u5c42\u6b21<\/th>\n<th class=\"text-text-100 border-b-0.5 border-[hsl(var(--border-300)\/0.6)] py-2 pr-4 align-top font-bold\" scope=\"col\">C++ \u9009\u578b<\/th>\n<th class=\"text-text-100 border-b-0.5 border-[hsl(var(--border-300)\/0.6)] py-2 pr-4 align-top font-bold\" scope=\"col\">Go \u9009\u578b<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td class=\"border-b-0.5 border-[hsl(var(--border-300)\/0.3)] py-2 pr-4 align-top\">\u7f51\u7edc\u6846\u67b6<\/td>\n<td class=\"border-b-0.5 border-[hsl(var(--border-300)\/0.3)] py-2 pr-4 align-top\">Asio \/ libuv<\/td>\n<td class=\"border-b-0.5 border-[hsl(var(--border-300)\/0.3)] py-2 pr-4 align-top\">net \/ gnet<\/td>\n<\/tr>\n<tr>\n<td class=\"border-b-0.5 border-[hsl(var(--border-300)\/0.3)] py-2 pr-4 align-top\">\u5e8f\u5217\u5316<\/td>\n<td class=\"border-b-0.5 border-[hsl(var(--border-300)\/0.3)] py-2 pr-4 align-top\">Protobuf \/ FlatBuffers<\/td>\n<td class=\"border-b-0.5 border-[hsl(var(--border-300)\/0.3)] py-2 pr-4 align-top\">Protobuf<\/td>\n<\/tr>\n<tr>\n<td class=\"border-b-0.5 border-[hsl(var(--border-300)\/0.3)] py-2 pr-4 align-top\">\u5185\u90e8 RPC<\/td>\n<td class=\"border-b-0.5 border-[hsl(var(--border-300)\/0.3)] py-2 pr-4 align-top\">gRPC \/ nanomsg<\/td>\n<td class=\"border-b-0.5 border-[hsl(var(--border-300)\/0.3)] py-2 pr-4 align-top\">gRPC<\/td>\n<\/tr>\n<tr>\n<td class=\"border-b-0.5 border-[hsl(var(--border-300)\/0.3)] py-2 pr-4 align-top\">\u70ed\u6570\u636e<\/td>\n<td class=\"border-b-0.5 border-[hsl(var(--border-300)\/0.3)] py-2 pr-4 align-top\">Redis (hiredis)<\/td>\n<td class=\"border-b-0.5 border-[hsl(var(--border-300)\/0.3)] py-2 pr-4 align-top\">go-redis<\/td>\n<\/tr>\n<tr>\n<td class=\"border-b-0.5 border-[hsl(var(--border-300)\/0.3)] py-2 pr-4 align-top\">\u6301\u4e45\u5316<\/td>\n<td class=\"border-b-0.5 border-[hsl(var(--border-300)\/0.3)] py-2 pr-4 align-top\">MySQL + sqlpp11<\/td>\n<td class=\"border-b-0.5 border-[hsl(var(--border-300)\/0.3)] py-2 pr-4 align-top\">GORM<\/td>\n<\/tr>\n<tr>\n<td class=\"border-b-0.5 border-[hsl(var(--border-300)\/0.3)] py-2 pr-4 align-top\">\u65e5\u5fd7<\/td>\n<td class=\"border-b-0.5 border-[hsl(var(--border-300)\/0.3)] py-2 pr-4 align-top\">spdlog<\/td>\n<td class=\"border-b-0.5 border-[hsl(var(--border-300)\/0.3)] py-2 pr-4 align-top\">zap<\/td>\n<\/tr>\n<tr>\n<td class=\"border-b-0.5 border-[hsl(var(--border-300)\/0.3)] py-2 pr-4 align-top\">\u76d1\u63a7<\/td>\n<td class=\"border-b-0.5 border-[hsl(var(--border-300)\/0.3)] py-2 pr-4 align-top\">Prometheus + Grafana<\/td>\n<td class=\"border-b-0.5 border-[hsl(var(--border-300)\/0.3)] py-2 pr-4 align-top\">\u540c\u5de6<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\">C++ \u9002\u5408\u5bf9\u6027\u80fd\u6781\u5ea6\u654f\u611f\u7684\u6218\u6597\u670d\uff08FPS\/MOBA \u6838\u5fc3\u903b\u8f91\uff09\uff0cGo \u9002\u5408\u5feb\u901f\u5f00\u53d1\u5927\u90e8\u5206\u4e1a\u52a1\u903b\u8f91\uff08\u5927\u5385\u3001\u5339\u914d\u3001\u793e\u4ea4\uff09\u3002\u5f88\u591a\u56e2\u961f\u7684\u5b9e\u8df5\u662f\uff1a<strong>\u6218\u6597\u670d C++\uff0c\u5176\u4ed6\u670d Go<\/strong>\uff0c\u901a\u8fc7 Protobuf + gRPC \u901a\u4fe1\u3002<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u957f\u8fde\u63a5\u6e38\u620f\u670d\u52a1\u5668\u7684\u672c\u8d28\u6311\u6218 \u6e38\u620f\u670d\u52a1\u5668\u548c<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"colormag_page_container_layout":"default_layout","colormag_page_sidebar_layout":"default_layout","footnotes":""},"categories":[24],"tags":[],"class_list":["post-7489","post","type-post","status-publish","format-standard","hentry","category-value_docs"],"_links":{"self":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/posts\/7489","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/comments?post=7489"}],"version-history":[{"count":5,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/posts\/7489\/revisions"}],"predecessor-version":[{"id":7494,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/posts\/7489\/revisions\/7494"}],"wp:attachment":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/media?parent=7489"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/categories?post=7489"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/tags?post=7489"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}