{"id":284163,"date":"2017-03-30T13:10:02","date_gmt":"2017-03-30T09:10:02","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=284163"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=284163","title":{"rendered":"\u0410\u043d\u0430\u043b\u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 Quake"},"content":{"rendered":"<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/d32\/0d6\/ffa\/d320d6ffa37f59fd21361a0ae1a0aaab.jpg\" alt=\"image\"\/><\/p>\n<p>  \u042f \u0441 \u0443\u0434\u043e\u0432\u043e\u043b\u044c\u0441\u0442\u0432\u0438\u0435\u043c \u043f\u043e\u0433\u0440\u0443\u0437\u0438\u043b\u0441\u044f \u0432 \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u0435 <a href=\"https:\/\/github.com\/id-Software\">\u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 Quake World<\/a> \u0438 \u0438\u0437\u043b\u043e\u0436\u0438\u043b \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u0432\u0441\u0451, \u0447\u0442\u043e \u044f \u043f\u043e\u043d\u044f\u043b. \u041d\u0430\u0434\u0435\u044e\u0441\u044c, \u044d\u0442\u043e \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0436\u0435\u043b\u0430\u044e\u0449\u0438\u043c \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f. \u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0430 \u043d\u0430 \u0447\u0435\u0442\u044b\u0440\u0435 \u0447\u0430\u0441\u0442\u0438:<\/p>\n<ul>\n<li>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430<\/li>\n<li>\u0421\u0435\u0442\u044c<\/li>\n<li>\u041f\u0440\u043e\u0433\u043d\u043e\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/li>\n<li>\u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f<\/li>\n<\/ul>\n<p><a name=\"habracut\"><\/a>  <\/p>\n<h2>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430<\/h2>\n<p>  <\/p>\n<h3>\u041a\u043b\u0438\u0435\u043d\u0442 Quake<\/h3>\n<p>  \u0418\u0437\u0443\u0447\u0435\u043d\u0438\u0435 Quake \u0441\u0442\u043e\u0438\u0442 \u043d\u0430\u0447\u0430\u0442\u044c \u0441 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 <code>qwcl<\/code> (\u043a\u043b\u0438\u0435\u043d\u0442\u0430). \u0422\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430 <code>WinMain<\/code> \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 <b>sys_win.c<\/b>. \u0412\u043a\u0440\u0430\u0442\u0446\u0435 \u043a\u043e\u0434 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cpp\">\tWinMain \t{ \t\twhile (1) \t\t{ \t\t\t\tnewtime = Sys_DoubleTime (); \t\t\t\ttime = newtime - oldtime; \t\t\t\tHost_Frame (time) \t\t\t\t{ \t\t\t\t\tsetjmp \t\t\t\t\tSys_SendKeyEvents \t\t\t\t\tIN_Commands \t\t\t\t\tCbuf_Execute \t\t\t\t\t \t\t\t\t\t\/* \u0421\u0435\u0442\u044c *\/ \t\t\t\t\tCL_ReadPackets \t\t\t\t\tCL_SendCmd \t\t\t\t\t \t\t\t\t\t\/* \u041f\u0440\u043e\u0433\u043d\u043e\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\/\/\u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0438 *\/ \t\t\t\t\tCL_SetUpPlayerPrediction(false) \t\t\t\t\tCL_PredictMove \t\t\t\t\tCL_SetUpPlayerPrediction(true) \t\t\t\t\tCL_EmitEntities \t\t\t\t\t \t\t\t\t\t\/* \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f *\/ \t\t\t\t\tSCR_UpdateScreen \t\t\t\t} \t\t\t\toldtime = newtime; \t\t} \t} <\/code><\/pre>\n<p>  \u0417\u0434\u0435\u0441\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u0442\u0440\u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 Quake World:<\/p>\n<ul>\n<li> <b>\u0421\u0435\u0442\u044c<\/b> <code>CL_ReadPackets<\/code> \u0438 <code>CL_SendCmd<\/code><\/li>\n<li> <b>\u041f\u0440\u043e\u0433\u043d\u043e\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/b> <code>CL_SetUpPlayerPrediction<\/code>, <code>CL_PredictMove<\/code> \u0438 <code>CL_EmitEntities<\/code><\/li>\n<li><b>\u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f<\/b> <code>SCR_UpdateScreen<\/code><\/li>\n<\/ul>\n<p>  <b>\u0421\u0435\u0442\u0435\u0432\u043e\u0439<\/b> \u0441\u043b\u043e\u0439 (\u0442\u0430\u043a\u0436\u0435 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0439 Net Channel) \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043c\u0438\u0440\u0435 \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e <code>frames<\/code> (\u043c\u0430\u0441\u0441\u0438\u0432 <code>frame_t<\/code>). \u041e\u043d\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u0432 \u0441\u043b\u043e\u0439 <b>\u043f\u0440\u043e\u0433\u043d\u043e\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/b>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0438, \u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u044b\u0432\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u0444\u043e\u0440\u043c\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0439 \u043e \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 (<code>cl_visedicts<\/code>) \u0441 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435\u043c \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 (POV). VisEdicts \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0432 \u0441\u043b\u043e\u0435 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438 POV (<code>cl.sim*<\/code>) \u0434\u043b\u044f \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430 \u0441\u0446\u0435\u043d\u044b.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/5f2\/50d\/d17\/5f250dd17a4e712b362d566885b9b94b.jpg\"\/><\/p>\n<p>  <code>setjmp<\/code>:<\/p>\n<p>  \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u043a\u043e\u0434\u0430, \u0435\u0441\u043b\u0438 \u0441\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0447\u0442\u043e-\u0442\u043e \u043f\u043b\u043e\u0445\u043e\u0435, \u0442\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0441\u044e\u0434\u0430.<\/p>\n<p>  <code>Sys_SendKeyEvents<\/code>:<\/p>\n<p>  \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u041e\u0421 Windows, \u0441\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u043e\u043a\u043d\u0430 \u0438 \u0442.\u043f. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0434\u0432\u0438\u0436\u043a\u0430 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u043e\u043a\u043d\u043e \u0441\u0432\u0451\u0440\u043d\u0443\u0442\u043e, \u0442\u043e \u043c\u0438\u0440 \u043d\u0435 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u0442\u0441\u044f).<\/p>\n<p>  <code>IN_Commands<\/code>:<\/p>\n<p>  \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0432\u0432\u043e\u0434\u0435 \u0441 \u0434\u0436\u043e\u0439\u0441\u0442\u0438\u043a\u0430.<\/p>\n<p>  <code>Cbuf_Execute<\/code>:<\/p>\n<p>  \u0412 \u043a\u0430\u0436\u0434\u043e\u043c \u0446\u0438\u043a\u043b\u0435 \u0438\u0433\u0440\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0432 \u0431\u0443\u0444\u0435\u0440\u0435. \u041a\u043e\u043c\u0430\u043d\u0434\u044b \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043d\u0441\u043e\u043b\u044c, \u043d\u043e \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u0438\u0439\u0442\u0438 \u0438 \u043e\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0438\u043b\u0438 \u0434\u0430\u0436\u0435 \u043e\u0442 \u043d\u0430\u0436\u0430\u0442\u0438\u044f \u043a\u043b\u0430\u0432\u0438\u0448\u0438.<\/p>\n<p>  \u0418\u0433\u0440\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 <code>exec quake.rc<\/code> \u0432 \u0431\u0443\u0444\u0435\u0440\u0435 \u043a\u043e\u043c\u0430\u043d\u0434.<\/p>\n<p>  <code>CL_ReadPackets<\/code> \u0438 <code>CL_SendCmd<\/code>:<\/p>\n<p>  \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 <b>\u0441\u0435\u0442\u0435\u0432\u043e\u0439<\/b> \u0447\u0430\u0441\u0442\u0438 \u0434\u0432\u0438\u0436\u043a\u0430.<\/p>\n<p>  <code>CL_SendCmd<\/code> \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0432\u0432\u043e\u0434 \u043c\u044b\u0448\u0438 \u0438 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044b, \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u0442\u0435\u043c \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f.<\/p>\n<p>  \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0432 Quake World \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f UDP, \u043d\u0430\u0434\u0451\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0430\u0441\u044c \u043d\u0430\u0431\u043e\u0440\u043e\u043c sequence\/sequenceACK \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 netChannel. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u043b\u0430\u0441\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e. \u0421\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u043d\u0435 \u0431\u044b\u043b\u043e \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439 \u043d\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0443 \u043f\u0430\u043a\u0435\u0442\u043e\u0432, \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u043b\u0438\u0441\u044c \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0447\u0430\u0449\u0435. \u0421\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u0443 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u043b\u043e\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \u043f\u0430\u043a\u0435\u0442 \u0431\u044b\u043b \u043f\u043e\u043b\u0443\u0447\u0435\u043d \u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0431\u044b\u043b\u0430 \u043d\u0438\u0436\u0435 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438. \u042d\u0442\u043e\u0442 \u043f\u0440\u0435\u0434\u0435\u043b \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u043b\u0441\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u043c \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u043b\u0441\u044f \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440.<\/p>\n<p>  \u0412\u0435\u0441\u044c \u0440\u0430\u0437\u0434\u0435\u043b \u00ab\u0421\u0435\u0442\u044c\u00bb \u043f\u043e\u0441\u0432\u044f\u0449\u0451\u043d \u044d\u0442\u043e\u0439 \u0442\u0435\u043c\u0435.<\/p>\n<p>  <code>CL_SetUpPlayerPrediction<\/code>, <code>CL_PredictMove<\/code> \u0438 <code>CL_EmitEntities<\/code>:<\/p>\n<p>  \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u043b\u0438 <b>\u043f\u0440\u043e\u0433\u043d\u043e\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/b> \u0432 \u0434\u0432\u0438\u0436\u043a\u0435 \u0438 \u0440\u0430\u0441\u0447\u0451\u0442 \u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0439. \u0412 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043e\u043d\u0438 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u044b \u0434\u043b\u044f \u0431\u043e\u0440\u044c\u0431\u044b \u0441 \u043b\u0430\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u043f\u043e \u0441\u0435\u0442\u0438.<\/p>\n<p>  \u042d\u0442\u043e\u0439 \u0442\u0435\u043c\u0435 \u043f\u043e\u0441\u0432\u044f\u0449\u0451\u043d \u0432\u0435\u0441\u044c \u0440\u0430\u0437\u0434\u0435\u043b \u00ab\u041f\u0440\u043e\u0433\u043d\u043e\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u00bb.<\/p>\n<p>  <code>SCR_UpdateScreen<\/code>:<\/p>\n<p>  <b>\u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f<\/b> \u0432 \u0434\u0432\u0438\u0436\u043a\u0435. \u0412 \u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f BSP\/PVS. \u0417\u0434\u0435\u0441\u044c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u0434\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438 <code>include<\/code>\/<code>define<\/code>. \u0414\u0432\u0438\u0436\u043e\u043a Quake \u043c\u043e\u0436\u0435\u0442 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u0442\u044c \u043c\u0438\u0440 \u0438\u043b\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e, \u0438\u043b\u0438 \u0441 \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u044b\u043c \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435\u043c.<\/p>\n<p>  \u042d\u0442\u043e\u043c\u0443 \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u043f\u043e\u0441\u0432\u044f\u0449\u0451\u043d \u0440\u0430\u0437\u0434\u0435\u043b \u00ab\u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f\u00bb.<\/p>\n<h3>\u041e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \u0430\u0440\u0445\u0438\u0432\u0430 zip \u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/h3>\n<p>  <u>\u041e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 zip:<\/u><\/p>\n<p>  \u0412 \u0430\u0440\u0445\u0438\u0432\u0435 q1sources.zip \u0435\u0441\u0442\u044c \u0434\u0432\u0435 \u043f\u0430\u043f\u043a\u0438\/\u0434\u0432\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 Visual Studio: <code>QW<\/code> and <code>WinQuake<\/code>.<\/p>\n<ul>\n<li><code>WinQuake<\/code> \u2014 \u044d\u0442\u043e \u043a\u043e\u0434 \u0441 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0451\u043d\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0439 \u043a\u0430\u043a \u0435\u0434\u0438\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 (\u0432 \u0438\u0434\u0435\u0430\u043b\u0435 \u044d\u0442\u043e \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0434\u0432\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430, \u0435\u0441\u043b\u0438 DOS \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u043b\u0430 \u0438\u0445). \u0418\u0433\u0440\u0430 \u043f\u043e \u0441\u0435\u0442\u0438 \u0431\u044b\u043b\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 LAN.<\/li>\n<li><code>QW<\/code> \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0435\u043a\u0442 \u00abQuake World\u00bb, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0441\u0435\u0440\u0432\u0435\u0440 \u0438 \u043a\u043b\u0438\u0435\u043d\u0442 \u0434\u043e\u043b\u0436\u043d\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0448\u0438\u043d\u0430\u0445 (\u0437\u0430\u043c\u0435\u0442\u044c\u0442\u0435, \u0447\u0442\u043e \u0442\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u2014 \u044d\u0442\u043e <code>WinMain<\/code> (\u0432 <code>sys_win.c<\/code>), \u0430 \u0442\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u2014 <code>main<\/code> (\u0442\u043e\u0436\u0435 \u0432 <code>sys_win.c<\/code>)).<\/li>\n<\/ul>\n<p>  \u042f \u0438\u0437\u0443\u0447\u0438\u043b Quake World \u0441 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u043e\u043c openGL. \u0412 \u044d\u0442\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0435\u0441\u0442\u044c \u0447\u0435\u0442\u044b\u0440\u0435 \u043f\u043e\u0434\u043f\u0440\u043e\u0435\u043a\u0442\u0430:<\/p>\n<ul>\n<li><code>gas2asm<\/code> \u2014 \u0443\u0442\u0438\u043b\u0438\u0442\u0430 \u0434\u043b\u044f \u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0438\u0437 GNU ASM \u0432 x86 ASM<\/li>\n<li><code>qwcl<\/code> \u2014 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0430\u044f \u0447\u0430\u0441\u0442\u044c Quake<\/li>\n<li><code>QWFwd<\/code> \u2014 \u043f\u0440\u043e\u043a\u0441\u0438, \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0434 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u043c\u0438 Quake<\/li>\n<li><code>qwsv<\/code> \u2014 \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c Quake<\/li>\n<\/ul>\n<p>  <u>\u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044f:<\/u><\/p>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 Windows \u0438 SDK DirectX \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044f \u0432 Visual Studio 2008 \u0432\u044b\u044f\u0432\u043b\u044f\u0435\u0442 \u043e\u0434\u043d\u0443 \u043e\u0448\u0438\u0431\u043a\u0443:<\/p>\n<pre><code class=\"cpp\">.\\net_wins.c(178) : error C2072: '_errno' : initialization of a function<\/code><\/pre>\n<p>  \u0412 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f <code>_errno<\/code> \u2014 \u044d\u0442\u043e \u043c\u0430\u043a\u0440\u043e\u0441 Microsoft, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u0434\u043b\u044f \u0447\u0435\u0433\u043e-\u0442\u043e \u0434\u0440\u0443\u0433\u043e\u0433\u043e. \u041c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u044d\u0442\u0438 \u043e\u0448\u0438\u0431\u043a\u0438, \u0437\u0430\u043c\u0435\u043d\u0438\u0432 \u0438\u043c\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0441 <code>_errno<\/code> \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043d\u0430 <code>qerrno<\/code>.<\/p>\n<p>  <code>net_wins.c<\/code><\/p>\n<pre><code class=\"cpp\">\tif (ret == -1)  \t{  \t\tint qerrno = WSAGetLastError();    \t\tif (qerrno == WSAEWOULDBLOCK)  \t\t\treturn false;  \t\tif (qerrno == WSAEMSGSIZE) {  \t\t\tCon_Printf (&quot;Warning:  Oversize packet from %s\\n&quot;,  \t\t\t\tNET_AdrToString (net_from));  \t\t\treturn false;  \t\t}      \t\tSys_Error (&quot;NET_GetPacket: %s&quot;, strerror(qerrno));  \t}<\/code><\/pre>\n<p>  \u041a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u0449\u0438\u043a \u0436\u0430\u043b\u0443\u0435\u0442\u0441\u044f \u043d\u0430 LIBC.lib \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 qwcl. \u041f\u0440\u043e\u0441\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u044c\u0442\u0435 \u0435\u0433\u043e \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u00abIgnored Library\u00bb \u0438 \u0441\u0431\u043e\u0440\u043a\u0430 \u0447\u0435\u0442\u044b\u0440\u0451\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0441\u044f.<\/p>\n<h3>\u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b<\/h3>\n<p>  \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 IDE \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u0434\u043e\u0448\u043b\u0430 Visual Studio Express (\u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u0430\u044f). \u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u043d\u0438\u0433, \u0435\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0433\u043b\u0443\u0431\u0436\u0435 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u0432 \u0434\u0432\u0438\u0436\u043a\u0435 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 BSP\/PVS, Id Software \u0438 Quake:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/c31\/8db\/c0f\/c318dbc0f45560dd97b0041a05d625c7.jpg\"\/> <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/bca\/c54\/a3c\/bcac54a3c179a4f59fb22ffa0c671706.jpg\"\/> <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/7ec\/5af\/fae\/7ec5affaec3e1410f66dae38f9d5a42c.jpg\"\/> <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/40d\/6b4\/613\/40d6b461398911ee769abd88b7796ea3.jpg\"\/><\/p>\n<p>  \u041c\u043e\u044f \u043f\u043e\u043b\u043a\u0430 \u0441 \u043a\u043d\u0438\u0433\u0430\u043c\u0438 \u043d\u0430 \u043d\u0435\u0434\u0435\u043b\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c Quake \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b\u0430 \u0442\u0430\u043a:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/66c\/444\/167\/66c444167f3dcd6e33bd2f1ecc17c68b.jpg\"\/><\/p>\n<h2>\u0421\u0435\u0442\u044c<\/h2>\n<p>  \u0421\u0435\u0442\u0435\u0432\u0430\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 QuakeWorld \u0432 \u0441\u0432\u043e\u0451 \u0432\u0440\u0435\u043c\u044f \u0441\u0447\u0438\u0442\u0430\u043b\u0430\u0441\u044c \u043f\u043e\u0442\u0440\u044f\u0441\u0430\u044e\u0449\u0435\u0439 \u0438\u043d\u043d\u043e\u0432\u0430\u0446\u0438\u0435\u0439. \u0412\u043e \u0432\u0441\u0435\u0445 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u0438\u0433\u0440\u0430\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f \u0442\u043e\u0442 \u0436\u0435 \u043f\u043e\u0434\u0445\u043e\u0434.<\/p>\n<h3>\u0421\u0435\u0442\u0435\u0432\u043e\u0439 \u0441\u0442\u0435\u043a<\/h3>\n<p>  \u042d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0440\u043d\u043e\u0439 \u0435\u0434\u0438\u043d\u0438\u0446\u0435\u0439 \u043e\u0431\u043c\u0435\u043d\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439 \u0432 Quake \u0431\u044b\u043b\u0430 <code>\u043a\u043e\u043c\u0430\u043d\u0434\u0430<\/code>. \u041e\u043d\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u0438, \u0437\u0434\u043e\u0440\u043e\u0432\u044c\u044f, \u0443\u0449\u0435\u0440\u0431\u0430 \u0438\u0433\u0440\u043e\u043a\u0430 \u0438 \u0442.\u0434. \u0412 TCP\/IP \u0435\u0441\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u043b\u0438\u0441\u044c \u0431\u044b \u0432 \u0441\u0438\u043c\u0443\u043b\u044f\u0446\u0438\u0438 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 (\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438, \u043d\u0430\u0434\u0451\u0436\u043d\u043e\u0441\u0442\u044c \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438, \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043f\u043e\u0440\u044f\u0434\u043a\u0430 \u043f\u0430\u043a\u0435\u0442\u043e\u0432), \u043d\u043e \u0432 \u0434\u0432\u0438\u0436\u043a\u0435 Quake World \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u043d\u0435\u043b\u044c\u0437\u044f \u0431\u044b\u043b\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c (\u043e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f \u0432 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u043c Quake). \u0412 \u0448\u0443\u0442\u0435\u0440\u0430\u0445 \u043e\u0442 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043b\u0438\u0446\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f, \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u0430\u044f \u0432\u043e\u0432\u0440\u0435\u043c\u044f, \u043d\u0435 \u0441\u0442\u043e\u0438\u0442 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u0441\u044b\u043b\u043a\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u044b\u043b \u0432\u044b\u0431\u0440\u0430\u043d UDP\/IP. \u0414\u043b\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u043d\u0430\u0434\u0451\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u0440\u044f\u0434\u043a\u0430 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u0441\u043b\u043e\u0439 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438 &quot;<code>NetChannel<\/code>&quot;.<\/p>\n<p>  \u0421 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f OSI <code>NetChannel<\/code> \u0443\u0434\u043e\u0431\u043d\u043e \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d \u043f\u043e\u0432\u0435\u0440\u0445 UDP:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/e0c\/e02\/0a5\/e0ce020a56a377506c7293ad2013e818.jpg\"\/><\/p>\n<p>  \u0418\u0442\u0430\u043a, \u043f\u043e\u0434\u0432\u0435\u0434\u0451\u043c \u0438\u0442\u043e\u0433: \u0434\u0432\u0438\u0436\u043e\u043a \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 <code>\u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c\u0438<\/code>. \u041a\u043e\u0433\u0434\u0430 \u043d\u0443\u0436\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0438\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435, \u043e\u043d \u043f\u043e\u0440\u0443\u0447\u0430\u0435\u0442 \u044d\u0442\u0443 \u0437\u0430\u0434\u0430\u0447\u0443 \u043c\u0435\u0442\u043e\u0434\u0430\u043c <code>Netchan_Transmit<\/code> \u0438 <code>Netchan_Process<\/code> \u0438\u0437 <code>netchan.c <\/code> (\u044d\u0442\u0438 \u043c\u0435\u0442\u043e\u0434\u044b \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b \u0434\u043b\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u0430).<\/p>\n<h3>\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a NetChannel<\/h3>\n<p>  \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a NetChannel \u0438\u043c\u0435\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443:  <\/p>\n<table>\n<tr>\n<th>\u0411\u0438\u0442\u043e\u0432\u043e\u0435 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435<\/th>\n<th>\u0411\u0438\u0442\u044b 0-15<\/th>\n<th>16-31<\/th>\n<\/tr>\n<tr>\n<td>0<\/td>\n<td colspan=\"2\">Sequence<\/td>\n<\/tr>\n<tr>\n<td>32<\/td>\n<td colspan=\"2\">ACK Sequence<\/td>\n<\/tr>\n<tr>\n<td>64<\/td>\n<td>QPort<\/td>\n<td>\u041a\u043e\u043c\u0430\u043d\u0434\u044b<\/td>\n<\/tr>\n<tr>\n<td>94<\/td>\n<td colspan=\"2\">&#8230;<\/td>\n<\/tr>\n<\/table>\n<ul>\n<li>Sequence \u2014 \u044d\u0442\u043e \u0447\u0438\u0441\u043b\u043e <code>int<\/code>, \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c\u043e\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u0435\u043c \u0438 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u044e\u0449\u0435\u0435\u0441\u044f \u043d\u0430 \u0435\u0434\u0438\u043d\u0438\u0446\u0443 \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u0439 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0435 \u043f\u0430\u043a\u0435\u0442\u0430. <code>Sequence<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432\u043e \u043c\u043d\u043e\u0433\u0438\u0445 \u0446\u0435\u043b\u044f\u0445, \u043d\u043e \u0441\u0430\u043c\u0430\u044f \u0432\u0430\u0436\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u2014 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u044f \u0443\u0442\u0435\u0440\u044f\u043d\u043d\u044b\u0445\/\u0434\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445\/\u0432\u043d\u0435\u043e\u0447\u0435\u0440\u0435\u0434\u043d\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 UDP. \u0421\u0430\u043c\u044b\u0439 \u0437\u043d\u0430\u0447\u0438\u043c\u044b\u0439 \u0431\u0438\u0442 \u044d\u0442\u043e\u0433\u043e \u0446\u0435\u043b\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435 \u0447\u0430\u0441\u0442\u044c\u044e sequence, \u0430 \u0444\u043b\u0430\u0433\u043e\u043c, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u043c \u043d\u0430 \u0442\u043e, \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043b\u0438 (<code>\u043a\u043e\u043c\u0430\u043d\u0434\u0430<\/code>) <u>\u043d\u0430\u0434\u0451\u0436\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435<\/u> (\u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e\u0431 \u044d\u0442\u043e\u043c \u043f\u043e\u0437\u0436\u0435).<\/li>\n<li>ACK Sequence \u2014 \u044d\u0442\u043e \u0442\u043e\u0436\u0435 <code>int<\/code>, \u043e\u043d\u043e \u0440\u0430\u0432\u043d\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c\u0443 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u043c\u0443 \u0447\u0438\u0441\u043b\u0443 sequence. \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0435\u043c\u0443 \u0434\u0440\u0443\u0433\u0430\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u0430 NetChannel \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u043f\u0430\u043a\u0435\u0442 \u0431\u044b\u043b \u0443\u0442\u0435\u0440\u044f\u043d.<\/li>\n<li>QPort \u2014 \u044d\u0442\u043e \u043e\u0431\u0445\u043e\u0434 \u043e\u0448\u0438\u0431\u043a\u0438 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0442\u043e\u0440\u043e\u0432 NAT (\u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0441\u043c. \u0432 \u043a\u043e\u043d\u0446\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u0430). \u0415\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u2014 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e, \u0437\u0430\u0434\u0430\u0432\u0430\u0435\u043c\u043e\u0435 \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u0430.<\/li>\n<li>\u041a\u043e\u043c\u0430\u043d\u0434\u044b: \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0435 \u0437\u043d\u0430\u0447\u0438\u043c\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435.<\/li>\n<\/ul>\n<p>  <\/p>\n<h3>\u041d\u0430\u0434\u0451\u0436\u043d\u044b\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f<\/h3>\n<p>  \u041d\u0435\u043d\u0430\u0434\u0451\u0436\u043d\u044b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432 \u043f\u0430\u043a\u0435\u0442 UDP, \u043e\u043d \u043f\u043e\u043c\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c \u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u043c \u0447\u0438\u0441\u043b\u043e\u043c sequence \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f: \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044e \u043d\u0435 \u0432\u0430\u0436\u043d\u043e, \u0431\u0443\u0434\u0435\u0442 \u043b\u0438 \u043e\u043d \u043f\u043e\u0442\u0435\u0440\u044f\u043d. \u041d\u0430\u0434\u0451\u0436\u043d\u044b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0438\u043d\u0430\u0447\u0435. \u0413\u043b\u0430\u0432\u043d\u043e\u0435 \u2014 \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u043c\u0435\u0436\u0434\u0443 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u0435\u043c \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u0435\u043c \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u043d\u0435\u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0451\u043d\u043d\u044b\u0439 \u043d\u0430\u0434\u0451\u0436\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442 UDP<\/p>\n<p>  \u0412 \u043a\u0430\u0436\u0434\u043e\u043c \u0438\u0433\u0440\u043e\u0432\u043e\u043c \u0446\u0438\u043a\u043b\u0435 \u043f\u0440\u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u043d\u043e\u0432\u043e\u0439 \u043d\u0430\u0434\u0451\u0436\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043e\u043d\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 <code>message_buf<\/code> (\u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0439 \u0447\u0435\u0440\u0435\u0437 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e <code>message<\/code>) (<b>1<\/b>). \u041d\u0430\u0431\u043e\u0440 \u043d\u0430\u0434\u0451\u0436\u043d\u044b\u0445 \u043a\u043e\u043c\u0430\u043d\u0434 \u0437\u0430\u0442\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u0438\u0437 <code>message<\/code> \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 <code>reliable_buf<\/code> (<b>2<\/b>). \u042d\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 <code>reliable_buf<\/code> \u043f\u0443\u0441\u0442 (\u0435\u0441\u043b\u0438 \u043e\u043d \u043d\u0435 \u043f\u0443\u0441\u0442, \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u0440\u0430\u043d\u0435\u0435 \u0431\u044b\u043b \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d \u0434\u0440\u0443\u0433\u043e\u0439 \u043d\u0430\u0431\u043e\u0440 \u043a\u043e\u043c\u0430\u043d\u0434 \u0438 \u0435\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u043a\u0430 \u043d\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u043e).<\/p>\n<p>  \u0417\u0430\u0442\u0435\u043c \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442 UDP: \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a NetChannel (<b>3<\/b>), \u0437\u0430\u0442\u0435\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 <code>reliable_buf<\/code> \u0438 \u0442\u0435\u043a\u0443\u0449\u0438\u0435 \u043d\u0435\u043d\u0430\u0434\u0451\u0436\u043d\u044b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b (\u043f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u0430).<\/p>\n<p>  \u041d\u0430 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0449\u0435\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 UDP \u043f\u0430\u0440\u0441\u0438\u0442\u0441\u044f, \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0435 \u0447\u0438\u0441\u043b\u043e <code>sequence<\/code> \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u0432 \u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u0435 <code>sequence ACK<\/code> (<b>4<\/b>) (\u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0431\u0438\u0442\u043e\u0432\u044b\u043c \u0444\u043b\u0430\u0433\u043e\u043c, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u043c \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u043f\u0430\u043a\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043d\u0430\u0434\u0451\u0436\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435).<\/p>\n<p>  \u041f\u0440\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c\u043e\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0438:<\/p>\n<ul>\n<li>\u0415\u0441\u043b\u0438 \u0431\u0438\u0442\u043e\u0432\u044b\u0439 \u0444\u043b\u0430\u0433 \u043d\u0430\u0434\u0451\u0436\u043d\u043e\u0441\u0442\u0438 \u0438\u043c\u0435\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 true, \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u043f\u0430\u043a\u0435\u0442 UDP \u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044e. NetChannel \u043c\u043e\u0436\u0435\u0442 \u043e\u0447\u0438\u0441\u0442\u0438\u0442\u044c <code>reliable_buf<\/code> (<b>5<\/b>) \u0438 \u0433\u043e\u0442\u043e\u0432 \u043a \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u0430 \u043a\u043e\u043c\u0430\u043d\u0434.<\/li>\n<li>\u0415\u0441\u043b\u0438 \u0431\u0438\u0442\u043e\u0432\u044b\u0439 \u0444\u043b\u0430\u0433 \u043d\u0430\u0434\u0451\u0436\u043d\u043e\u0441\u0442\u0438 \u0438\u043c\u0435\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 false, \u0442\u043e \u043f\u0430\u043a\u0435\u0442 UDP \u043d\u0435 \u0434\u043e\u0448\u0451\u043b \u0434\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f. NetChannel \u0434\u0435\u043b\u0430\u0435\u0442 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u0443\u044e \u043f\u043e\u043f\u044b\u0442\u043a\u0443 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e <code>reliable_buf<\/code>. \u041d\u043e\u0432\u044b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043d\u0430\u043a\u0430\u043f\u043b\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0432 <code>message_buf<\/code>. \u0415\u0441\u043b\u0438 \u043c\u0430\u0441\u0441\u0438\u0432 \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f, \u0442\u043e \u043a\u043b\u0438\u0435\u043d\u0442 \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f.<\/li>\n<\/ul>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/2f4\/d33\/a64\/2f4d33a643635a384c8ea3775d9c7c95.jpg\"\/><\/p>\n<h3>\u041a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438<\/h3>\n<p>  \u041d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044f \u043f\u043e\u043d\u044f\u043b, \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u0430. \u041a\u043b\u0438\u0435\u043d\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0432\u043e\u0435\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0447\u0430\u0449\u0435.<\/p>\n<p>  \u041f\u0435\u0440\u0432\u043e\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438, \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435: \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043f\u0430\u043a\u0435\u0442, \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \u043f\u0430\u043a\u0435\u0442 \u0431\u044b\u043b \u043f\u043e\u043b\u0443\u0447\u0435\u043d \u043e\u0442 \u043a\u043b\u0438\u0435\u043d\u0442\u0430. \u0412\u0442\u043e\u0440\u043e\u0439 \u0442\u0438\u043f \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u2014 \u044d\u0442\u043e \u00abchoke\u00bb, \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a\u043b\u0438\u0435\u043d\u0442 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 <code>rate<\/code>. \u041e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0443 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439, \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u044f \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0434\u0430\u043d\u043d\u044b\u0445, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0445 \u043a\u043b\u0438\u0435\u043d\u0442\u0443.<\/p>\n<h3>\u0412\u0430\u0436\u043d\u044b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b<\/h3>\n<p>  \u041a\u043e\u043c\u0430\u043d\u0434\u044b \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u043a\u043e\u0434 \u0442\u0438\u043f\u0430, \u0445\u0440\u0430\u043d\u044f\u0449\u0438\u0439\u0441\u044f \u0432 <code>\u0431\u0430\u0439\u0442\u0435<\/code>, \u0437\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043f\u043e\u043b\u0435\u0437\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u044b. \u041d\u0430\u0432\u0435\u0440\u043d\u043e, \u0441\u0430\u043c\u044b\u043c\u0438 \u0432\u0430\u0436\u043d\u044b\u043c\u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u0434\u0430\u044e\u0449\u0438\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u0438\u0433\u0440\u044b (<code>frame_t<\/code>):<\/p>\n<ul>\n<li><code>svc_packetentities<\/code> \u0438 <code>svc_deltapacketentities<\/code>: \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u044e\u0442 \u0442\u0430\u043a\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u043a\u0430\u043a \u0441\u043b\u0435\u0434\u044b \u043e\u0442 \u0440\u0430\u043a\u0435\u0442, \u0432\u0437\u0440\u044b\u0432\u044b, \u0447\u0430\u0441\u0442\u0438\u0446\u044b \u0438 \u0442.\u0434.<\/li>\n<li><code>svc_playerinfo<\/code>: \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043e \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0438\u0433\u0440\u043e\u043a\u0430, \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u0438 \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0432 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445.<\/li>\n<\/ul>\n<p>  <\/p>\n<h3>\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e qport<\/h3>\n<p>  Qport \u0431\u044b\u043b \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a NetChannel \u0434\u043b\u044f \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043e\u0448\u0438\u0431\u043a\u0438. \u0414\u043e qport \u0441\u0435\u0440\u0432\u0435\u0440 Quake \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043b \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u043f\u043e \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0438 \u00ab\u0443\u0434\u0430\u043b\u0451\u043d\u043d\u044b\u0439 IP-\u0430\u0434\u0440\u0435\u0441, \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u044b\u0439 \u043f\u043e\u0440\u0442 UDP\u00bb. \u0427\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e \u0445\u043e\u0440\u043e\u0448\u043e, \u043d\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0442\u043e\u0440\u044b NAT \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e \u043c\u0435\u043d\u044f\u0442\u044c \u0441\u0432\u043e\u044e \u0441\u0445\u0435\u043c\u0443 \u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u0438 \u043f\u043e\u0440\u0442\u043e\u0432 (\u0443\u0434\u0430\u043b\u0451\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u0440\u0442\u0430 UDP). \u041f\u043e\u0440\u0442 UDP \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043d\u0435\u043d\u0430\u0434\u0451\u0436\u043d\u044b\u043c, \u0438 \u0414\u0436\u043e\u043d \u041a\u0430\u0440\u043c\u0430\u043a (John Carmack) \u043e\u0431\u044a\u044f\u0441\u043d\u0438\u043b, \u0447\u0442\u043e \u043e\u043d \u0440\u0435\u0448\u0438\u043b \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043b\u0438\u0435\u043d\u0442 \u043f\u043e \u00ab\u0443\u0434\u0430\u043b\u0451\u043d\u043d\u043e\u043c\u0443 IP-\u0430\u0434\u0440\u0435\u0441\u0443, Qport \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0435 NetChannel\u00bb. \u042d\u0442\u043e \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u043b\u043e \u043e\u0448\u0438\u0431\u043a\u0443 \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0443 \u043d\u0430 \u043b\u0435\u0442\u0443 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u043f\u043e\u0440\u0442 \u043e\u0442\u0432\u0435\u0442\u0430 UDP.<\/p>\n<h3>\u0412\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u043b\u0430\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u0438<\/h3>\n<p>  \u0414\u0432\u0438\u0436\u043e\u043a Quake \u0445\u0440\u0430\u043d\u0438\u0442 64 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u043a\u043e\u043c\u0430\u043d\u0434\u044b (\u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 <code>frame_t<\/code>: <code>frames<\/code>) \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 <code>senttime<\/code>. \u041a \u043d\u0438\u043c \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u043e \u0447\u0438\u0441\u043b\u0443 sequence, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u043c\u0443 \u0434\u043b\u044f \u0438\u0445 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 (<code>outgoing_sequence<\/code>).<\/p>\n<pre><code class=\"cpp\">\tframe = &cl.frames[cls.netchan.outgoing_sequence & UPDATE_MASK]; \tframe-&gt;senttime = realtime; \t\t\t\t \t\/\/\u041e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u043f\u0430\u043a\u0435\u0442\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0443<\/code><\/pre>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u043e\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0432\u0440\u0435\u043c\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0438\u0437 <code>sequenceACK<\/code>. \u041b\u0430\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"cpp\">\t\/\/\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043e\u0442\u0432\u0435\u0442\u0430 \u043e\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \t\t\t\t \tframe = &cl.frames[cls.netchan.incoming_acknowledged & UPDATE_MASK]; \tframe-&gt;receivedtime = realtime; \tlatency = frame-&gt;receivedtime - frame-&gt;senttime;<\/code><\/pre>\n<p>  <\/p>\n<h3>\u042d\u043b\u0435\u0433\u0430\u043d\u0442\u043d\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f<\/h3>\n<p>  <u>\u0417\u0430\u0446\u0438\u043a\u043b\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0430<\/u><br \/>  \u0421\u0435\u0442\u0435\u0432\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0434\u0432\u0438\u0436\u043a\u0430 \u0445\u0440\u0430\u043d\u0438\u0442 64 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 UDP. \u041d\u0430\u0438\u0432\u043d\u044b\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0445\u043e\u0434\u0430 \u043f\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0443 \u0431\u044b\u043b\u043e \u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u043e\u0441\u0442\u0430\u0442\u043a\u0430 \u0446\u0435\u043b\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0434\u0435\u043b\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"cpp\">arrayIndex = (oldArrayIndex+1) % 64;<\/code><\/pre>\n<p>  \u0412\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u043e\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0435\u0439 \u0418 \u0434\u043b\u044f UPDATE_MASK. UPDATE_MASK \u0440\u0430\u0432\u043d\u044f\u0435\u0442\u0441\u044f 64-1.<\/p>\n<pre><code class=\"cpp\">arrayIndex = (oldArrayIndex+1) & UPDATE_MASK;<\/code><\/pre>\n<p>  \u041d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u043a\u043e\u0434 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cpp\">\t\tframe_t *newpacket;  \t\t\t\t \t\tnewpacket = &frames[cls.netchan.incoming_sequence&UPDATE_MASK];<\/code><\/pre>\n<p>  <b><u>\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435: \u0432\u043e\u0442 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u043e\u0442 Dietrich Epp \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441 \u043e\u0441\u0442\u0430\u0442\u043a\u043e\u043c:<\/u><\/b><\/p>\n<pre><code class=\"cpp\">\u0415\u0441\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0447\u0430\u0441\u0442\u044c\u044e, \u0433\u0434\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441 \u043e\u0441\u0442\u0430\u0442\u043a\u043e\u043c \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f &quot;\u043d\u0430\u0438\u0432\u043d\u044b\u043c&quot;.  \u0412\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u0440\u0430\u0437\u043d\u0438\u0446\u044b \u043c\u0435\u0436\u0434\u0443 \u043e\u0441\u0442\u0430\u0442\u043a\u043e\u043c \u0446\u0435\u043b\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0438 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u043c \u0418:  \u0421\u043e\u0437\u0434\u0430\u0451\u043c \u0444\u0430\u0439\u043b file.c:  unsigned int modulo(unsigned int x) { return x % 64; } unsigned int and(unsigned int x) { return x & 63; }  \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c gcc -S file.c \u0438 \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0444\u0430\u0439\u043b \u0432\u044b\u0432\u043e\u0434\u0430 file.s.  \u0417\u0430\u043c\u0435\u0442\u043d\u043e, \u0447\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u043e \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b, \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u0443\u044e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044e! \u0422\u043e \u0436\u0435 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043a &quot;\u043e\u0441\u0442\u0440\u043e\u0443\u043c\u043d\u044b\u043c&quot; \u0440\u0435\u0448\u0435\u043d\u0438\u044f\u043c \u0442\u0438\u043f\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f &lt;&lt; 5 \u0432\u043c\u0435\u0441\u0442\u043e *32.  \u0422\u0430\u043a\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0434\u0435\u043b\u0430\u044e\u0442 \u043a\u043e\u0434 \u043c\u0435\u043d\u0435\u0435 \u0447\u0438\u0442\u0430\u0435\u043c\u044b\u043c, \u0430 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432 \u043d\u0435 \u0434\u0430\u044e\u0442,  \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0441\u0447\u0438\u0442\u0430\u044e, \u0447\u0442\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0441 &lt;&lt; 5 \u0438\u043b\u0438 & 63 &quot;\u043d\u0430\u0438\u0432\u043d\u044b&quot;, \u0430 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0441 *32 \u0438\u043b\u0438 %64 \u0431\u043e\u043b\u0435\u0435 \u0443\u043c\u043d\u044b.  --Dietrich  .globl modulo     .type    modulo, @function modulo:     pushl    %ebp     movl    %esp, %ebp     movl    8(%ebp), %eax     andl    $63, %eax     popl    %ebp     ret     .size    modulo, .-modulo .globl and     .type    and, @function and:     pushl    %ebp     movl    %esp, %ebp     movl    8(%ebp), %eax     andl    $63, %eax     popl    %ebp     ret     .size    and, .-and<\/code><\/pre>\n<p>  <\/p>\n<h2>\u041f\u0440\u043e\u0433\u043d\u043e\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/h2>\n<p>  \u041c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044e NetChannel \u0434\u043b\u044f \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u043e\u0431\u043c\u0435\u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u043c\u0438. \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u0443\u0437\u043d\u0430\u0435\u043c, \u043a\u0430\u043a \u043b\u0430\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u043a\u043e\u043c\u043f\u0435\u043d\u0441\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u0440\u043e\u0433\u043d\u043e\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0412\u043e\u0442 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u0434\u043b\u044f \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044f:<\/p>\n<ul>\n<li><a href=\"http:\/\/fabiensanglard.net\/quakeSource\/johnc-log.aug.htm\">\u0421\u0442\u0430\u0442\u044c\u044f<\/a> \u0441\u0430\u043c\u043e\u0433\u043e \u0414\u0436\u043e\u043d\u0430 \u041a\u0430\u0440\u043c\u0430\u043a\u0430.<\/li>\n<li>\u0414\u0440\u0443\u0433\u0430\u044f <a href=\"http:\/\/developer.valvesoftware.com\/wiki\/Latency_Compensating_Methods_in_Client\/Server_In-game_Protocol_Design_and_Optimization\">\u0441\u0442\u0430\u0442\u044c\u044f<\/a> (<a href=\"http:\/\/fabiensanglard.net\/quakeSource\/Lag_Compensation.zip\">\u0430\u0440\u0445\u0438\u0432<\/a>) \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 Valve \u0441 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u0434\u0432\u0438\u0436\u043a\u0430 Half-life (\u0432 Half-life \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u0432\u0438\u0436\u043e\u043a Quake).<\/li>\n<\/ul>\n<p>  <\/p>\n<h3>\u041f\u0440\u043e\u0433\u043d\u043e\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/h3>\n<p>  \u041f\u0440\u043e\u0433\u043d\u043e\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u2014 \u044d\u0442\u043e, \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u0441\u043b\u043e\u0436\u043d\u0435\u0439\u0448\u0430\u044f, \u043c\u0435\u043d\u044c\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u0437\u0430\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0438 \u0432\u0430\u0436\u043d\u0435\u0439\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0434\u0432\u0438\u0436\u043a\u0430 Quake World. \u0426\u0435\u043b\u044c \u043f\u0440\u043e\u0433\u043d\u043e\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u2014 \u043f\u043e\u0431\u0435\u0434\u0438\u0442\u044c \u043b\u0430\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u043a\u043e\u043c\u043f\u0435\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0443\u044e \u0441\u0440\u0435\u0434\u0435 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438. \u041f\u0440\u043e\u0433\u043d\u043e\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u0430. \u042d\u0442\u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u00abClient Side Prediction\u00bb. \u041d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0442\u0435\u0445\u043d\u0438\u043a\u0438 \u043a\u043e\u043c\u043f\u0435\u043d\u0441\u0430\u0446\u0438\u0438 \u043b\u0430\u0433\u0430 \u043d\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f.<\/p>\n<p>  \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430:<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/fabiensanglard.net\/quakeSource\/prediction.jpg\"\/><\/p>\n<p>  \u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e, \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0438\u0433\u0440\u044b \u00ab\u0441\u0442\u0430\u0440\u0435\u0435\u00bb \u043d\u0430 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0443 \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u044b \u043b\u0430\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u0438 (latency). \u0415\u0441\u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0443 \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0436\u0434\u0430\u0442\u044c \u043f\u043e\u043b\u043d\u044b\u0439 \u0446\u0438\u043a\u043b (\u043b\u0430\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c), \u0447\u0442\u043e\u0431\u044b \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043d\u0430\u0448\u0438\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439:<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/fabiensanglard.net\/quakeSource\/prediction2.jpg\"\/><\/p>\n<p>  \u0427\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043f\u0440\u043e\u0433\u043d\u043e\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f Quake, \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u044c, \u043a\u0430\u043a NetChannel \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e <code>frames<\/code> (\u043c\u0430\u0441\u0441\u0438\u0432 <code>frame_t<\/code>).<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/fabiensanglard.net\/quakeSource\/frameQuestion.jpg\"\/><\/p>\n<p>  \u041a\u0430\u0436\u0434\u0430\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u0430\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u0443, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0432 <code>frames<\/code> \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 <code>senttime<\/code> \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 <code>netchannel.outgoingsequence<\/code>.<\/p>\n<p>  \u041a\u043e\u0433\u0434\u0430 \u0441\u0435\u0440\u0432\u0435\u0440 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>sequenceACK<\/code>, \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u043d\u044f\u0442\u044c \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043b\u0430\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c:<\/p>\n<pre><code class=\"cpp\">latency = senttime-receivedtime;<\/code><\/pre>\n<p>  \u041d\u0430 \u044d\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u043c\u044b \u0437\u043d\u0430\u0435\u043c \u043c\u0438\u0440 \u0442\u0430\u043a\u0438\u043c, \u043a\u0430\u043a\u0438\u043c \u043e\u043d \u0431\u044b\u043b <u>latency\/2<\/u> \u043d\u0430\u0437\u0430\u0434. \u0412 NAT \u043b\u0430\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u0432\u043f\u043e\u043b\u043d\u0435 \u043d\u0438\u0437\u043a\u0430\u044f (&lt;50 \u043c\u0441), \u043d\u043e \u0432 \u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435 \u043e\u043d\u0430 \u043e\u0433\u0440\u043e\u043c\u043d\u0430 (&gt;200ms), \u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043f\u0440\u043e\u0433\u043d\u043e\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u043b\u044f \u0441\u0438\u043c\u0443\u043b\u044f\u0446\u0438\u0438 <u>\u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e<\/u> \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043c\u0438\u0440\u0430. \u042d\u0442\u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u043e-\u0440\u0430\u0437\u043d\u043e\u043c\u0443 \u0434\u043b\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u0433\u0440\u043e\u043a\u0430 \u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u0438\u0433\u0440\u043e\u043a\u043e\u0432.<\/p>\n<h3>\u041b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u0433\u0440\u043e\u043a<\/h3>\n<p>  \u0414\u043b\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u0433\u0440\u043e\u043a\u0430 \u043b\u0430\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u0441\u043d\u0438\u0436\u0435\u043d\u0430 \u043f\u043e\u0447\u0442\u0438 \u0434\u043e 0 \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u043a\u0441\u0442\u0440\u0430\u043f\u043e\u043b\u044f\u0446\u0438\u0438 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0430. \u042d\u0442\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u043e\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0438 \u00ab\u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u043d\u0438\u044f\u00bb \u0432\u0441\u0435\u0445 \u043a\u043e\u043c\u0430\u043d\u0434, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0441 \u0442\u043e\u0433\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430.<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/fabiensanglard.net\/quakeSource\/prediction3.jpg\"\/><\/p>\n<p>  \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a\u043b\u0438\u0435\u043d\u0442 \u043f\u0440\u043e\u0433\u043d\u043e\u0437\u0438\u0440\u0443\u0435\u0442, \u043a\u0430\u043a\u0438\u043c \u0431\u0443\u0434\u0435\u0442 \u0435\u0433\u043e \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 t+latency\/2. <\/p>\n<p>  \u0421 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u043a\u043e\u0434\u0430 \u044d\u0442\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <code>CL_PredictMove<\/code>. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0434\u0432\u0438\u0436\u043e\u043a Quake \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u043f\u0440\u0435\u0434\u0435\u043b sentime \u0434\u043b\u044f \u00ab\u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u0435\u043c\u044b\u0445\u00bb \u043a\u043e\u043c\u0430\u043d\u0434:<\/p>\n<pre><code class=\"cpp\">cl.time = realtime - cls.latency - cl_pushlatency.value*0.001;<\/code><\/pre>\n<p>  <b>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435:<\/b> <code>cl_pushlatency<\/code> \u2014 \u044d\u0442\u043e \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u0430\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f (cvar), \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u0430. \u041e\u043d\u043e \u0440\u0430\u0432\u043d\u043e \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043b\u0430\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0432 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445. \u0418\u0437 \u044d\u0442\u043e\u0433\u043e \u043b\u0435\u0433\u043a\u043e \u0437\u0430\u043a\u043b\u044e\u0447\u0438\u0442\u044c, \u0447\u0442\u043e: <code> cl.time = realtime<\/code>.<\/p>\n<p>  \u0417\u0430\u0442\u0435\u043c \u0432\u0441\u0435 \u0434\u0440\u0443\u0433\u0438\u0435 \u0438\u0433\u0440\u043e\u043a\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u0432 <code>CL_SetSolidPlayers (cl.playernum);<\/code> \u043a\u0430\u043a \u0442\u0432\u0451\u0440\u0434\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b (\u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0438) \u0438 \u00ab\u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u044e\u0442\u0441\u044f\u00bb \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0434\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430: <code>cl.time &lt;= to-&gt;senttime<\/code> (\u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>CL_PredictUsercmd<\/code>).<\/p>\n<h3>\u0414\u0440\u0443\u0433\u0438\u0435 \u0438\u0433\u0440\u043e\u043a\u0438<\/h3>\n<p>  \u0414\u043b\u044f \u0434\u0440\u0443\u0433\u0438\u0445 \u0438\u0433\u0440\u043e\u043a\u043e\u0432 \u0443 \u0434\u0432\u0438\u0436\u043a\u0430 Quake \u043d\u0435\u0442 \u00ab\u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0445, \u043d\u043e \u0435\u0449\u0451 \u043d\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0451\u043d\u043d\u044b\u0445 \u043a\u043e\u043c\u0430\u043d\u0434\u00bb, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u043c\u0435\u0441\u0442\u043e \u043d\u0438\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0438\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u044f\u0446\u0438\u044f. \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f <code>cmd<\/code> \u0438\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u043f\u0440\u043e\u0433\u043d\u043e\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c\u043e\u0433\u043e \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u041f\u0440\u043e\u0433\u043d\u043e\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0431\u0435\u0437 \u0443\u0433\u043b\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430.<\/p>\n<p>  Quake World \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0442\u0430\u043a\u0436\u0435 \u043b\u0430\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u0445 \u0438\u0433\u0440\u043e\u043a\u043e\u0432. \u041b\u0430\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0433\u0440\u043e\u043a\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u043c\u0438\u0440\u0430.<\/p>\n<h3>\u041a\u043e\u0434<\/h3>\n<p>  \u041a\u043e\u0434 \u043f\u0440\u043e\u0433\u043d\u043e\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0440\u0430\u0441\u0447\u0451\u0442\u0430 \u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0439 \u043c\u043e\u0436\u043d\u043e \u0432\u043a\u0440\u0430\u0442\u0446\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"cpp\">\t\tCL_SetUpPlayerPrediction(false) \t\tCL_PredictMove  \t\t|\t\/* \u041b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u0433\u0440\u043e\u043a \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u043b\u0441\u044f *\/ \t\t|\tCL_SetSolidPlayers \t\t|\t|\tCL_PredictUsercmd \t\t|\t|\t\tPlayerMove \t\t|\t\u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0438\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u044f\u0446\u0438\u044f \t\tCL_SetUpPlayerPrediction(true) \t\tCL_EmitEntities  \t\t\tCL_LinkPlayers \t\t\t|\t\/* \u0414\u0440\u0443\u0433\u0438\u0435 \u0438\u0433\u0440\u043e\u043a\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u043b\u0438\u0441\u044c *\/ \t\t\t|\t\u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0433\u0440\u043e\u043a\u0430 \t\t\t|\t|\tCL_SetSolidPlayers \t\t\t|\t|\tCL_PredictUsercmd \t\t\t|\t|\t\tPlayerMove \t\t\tCL_LinkPacketEntities \t\t\tCL_LinkProjectiles \t\t\tCL_UpdateTEnts<\/code><\/pre>\n<p>  \u042d\u0442\u0430 \u0447\u0430\u0441\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u0430, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e Quake World \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043f\u0440\u043e\u0433\u043d\u043e\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u043b\u044f \u0438\u0433\u0440\u043e\u043a\u043e\u0432, \u043d\u043e \u0438 \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0451\u0442 \u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0438 \u0438\u0441\u0445\u043e\u0434\u044f \u0438\u0437 \u043f\u0440\u043e\u0433\u043d\u043e\u0437\u043e\u0432.<\/p>\n<p>  <u><code>CL_SetUpPlayerPrediction(false)<\/code><\/u><\/p>\n<p>  \u041f\u0435\u0440\u0432\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043f\u0440\u043e\u0433\u043d\u043e\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u043e\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0441\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u0433\u0440\u043e\u043a\u043e\u0432 \u0432 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u043e\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 (\u0442\u043e \u0435\u0441\u0442\u044c \u0441 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u043e\u0439 \u0432 t-latency\/2).<\/p>\n<p>  <u><code>CL_PredictMove()<\/code><\/u><\/p>\n<p>  \u0417\u0434\u0435\u0441\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u0433\u0440\u043e\u043a\u0430:<\/p>\n<ul>\n<li>\u041e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043d\u0435 \u0438\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438.<\/li>\n<li>\u041f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c: \u0432\u0441\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0434\u043e \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430 (<code>cl.time &lt;= to-&gt;senttime<\/code>) \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u043a \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044e\/\u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u043c \u043e\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430.<\/li>\n<\/ul>\n<p>  \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043f\u0440\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438:<\/p>\n<ul>\n<li>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0434\u0440\u0443\u0433\u0438\u0435 \u0438\u0433\u0440\u043e\u043a\u0438 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u044e\u0442\u0441\u044f \u0432 \u0442\u0432\u0451\u0440\u0434\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b (\u0432 \u0438\u0445 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u043c \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0438, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u043c \u0432 <code>CL_SetUpPlayerPrediction(false)<\/code> ) \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>CL_SetSolidPlayers<\/code>.<\/li>\n<li>\u0414\u0432\u0438\u0436\u043e\u043a \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u043f\u043e \u0432\u0441\u0435\u043c \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044f \u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0438 \u0438 \u043f\u0440\u043e\u0433\u043d\u043e\u0437\u0438\u0440\u0443\u044f \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>CL_PredictUsercmd<\/code>. \u0422\u0430\u043a\u0436\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0438 \u0434\u043b\u044f \u0434\u0440\u0443\u0433\u0438\u0445 \u0438\u0433\u0440\u043e\u043a\u043e\u0432.<\/li>\n<li>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442\u0441\u044f \u0432 <code>cl.sim*<\/code>. \u041e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u044b \u043f\u043e\u0437\u0436\u0435 \u0434\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0442\u043e\u0447\u043a\u0438 \u043e\u0431\u0437\u043e\u0440\u0430.<\/li>\n<\/ul>\n<p>  <u><code>CL_SetUpPlayerPrediction(true)<\/code><\/u><\/p>\n<p>  \u0412\u043e \u0432\u0442\u043e\u0440\u043e\u043c \u0432\u044b\u0437\u043e\u0432\u0435 \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043f\u0440\u043e\u0433\u043d\u043e\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u0440\u0443\u0433\u0438\u0445 \u0438\u0433\u0440\u043e\u043a\u043e\u0432 \u0432 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 (\u043d\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u043f\u043e\u043a\u0430 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f). \u041f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u044d\u043a\u0441\u0442\u0440\u0430\u043f\u043e\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0438\u0441\u0445\u043e\u0434\u044f \u0438\u0437 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u043a\u043e\u043c\u0430\u043d\u0434 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p>  <b>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435:<\/b> \u0417\u0434\u0435\u0441\u044c \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430: Valve \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442 (\u0434\u043b\u044f <code>cl_pushlatency<\/code>) \u043f\u0440\u043e\u0433\u043d\u043e\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u0433\u0440\u043e\u043a\u0430 \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 t+latency\/2. \u041e\u0434\u043d\u0430\u043a\u043e \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u0440\u0443\u0433\u0438\u0445 \u0438\u0433\u0440\u043e\u043a\u043e\u0432 \u043f\u0440\u043e\u0433\u043d\u043e\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 t. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043b\u0443\u0447\u0448\u0438\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u0434\u043b\u044f <code>cl_pushlatency<\/code> \u0432 QW \u0431\u044b\u043b\u043e -latency\/2?<\/p>\n<p>  <u><code>CL_EmitEntities<\/code><\/u><\/p>\n<p>  \u0417\u0434\u0435\u0441\u044c \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u043e \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438. \u0417\u0430\u0442\u0435\u043c \u043e\u043d\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u0432 \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440.<\/p>\n<ul>\n<li><b>CL_LinkPlayers :<\/b> \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0434\u0440\u0443\u0433\u0438\u0445 \u0438\u0433\u0440\u043e\u043a\u043e\u0432, \u0434\u0440\u0443\u0433\u0438\u0435 \u0438\u0433\u0440\u043e\u043a\u0438 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u044e\u0442\u0441\u044f \u0432 \u0442\u0432\u0451\u0440\u0434\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0439 \u0434\u043b\u044f \u0438\u0445 \u0441\u043f\u0440\u043e\u0433\u043d\u043e\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/li>\n<li><b>CL_LinkPacketEntitiesPacket:<\/b> \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0438\u0437 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u043e\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u043f\u0440\u043e\u0433\u043d\u043e\u0437\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0438 \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u044f\u043c\u0438 \u043e \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438. \u0418\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u043b\u0430\u0433 \u0434\u043b\u044f \u0432\u044b\u043f\u0443\u0449\u0435\u043d\u043d\u043e\u0439 \u0440\u0430\u043a\u0435\u0442\u044b.<\/li>\n<li><b>CL_LinkProjectiles:<\/b> \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0433\u0432\u043e\u0437\u0434\u0435\u0439 \u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u0441\u043d\u0430\u0440\u044f\u0434\u043e\u0432.<\/li>\n<li><b>CL_UpdateTEnts:<\/b> \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043b\u0443\u0447\u0435\u0439 \u0441\u0432\u0435\u0442\u0430 \u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432.<\/li>\n<\/ul>\n<p>  <\/p>\n<h2>\u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f<\/h2>\n<p>  \u041f\u0440\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u0438\u0433\u0440\u044b \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u0443\u0441\u0438\u043b\u0438\u0439 \u0431\u044b\u043b\u043e \u043f\u043e\u0442\u0440\u0430\u0447\u0435\u043d\u043e \u043d\u0430 \u043c\u043e\u0434\u0443\u043b\u044c \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440\u0430 Quake. \u042d\u0442\u043e \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u0432 \u043a\u043d\u0438\u0433\u0435 \u041c\u0430\u0439\u043a\u043b\u0430 \u0410\u0431\u0440\u0430\u0448\u0430 (Michael Abrash) \u0438 \u0432 \u0444\u0430\u0439\u043b\u0430\u0445 .plan \u0414\u0436\u043e\u043d\u0430 \u041a\u0430\u0440\u043c\u0430\u043a\u0430.<\/p>\n<h3>\u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f<\/h3>\n<p>  \u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0438\u0446\u0438\u0438 \u0441\u0446\u0435\u043d\u044b \u043d\u0435\u043e\u0442\u044a\u0435\u043c\u043b\u0435\u043c\u043e \u0441\u0432\u044f\u0437\u0430\u043d \u0441 BSP \u043a\u0430\u0440\u0442\u044b. \u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e Binary Space Partitioning (<a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%94%D0%B2%D0%BE%D0%B8%D1%87%D0%BD%D0%BE%D0%B5_%D1%80%D0%B0%D0%B7%D0%B1%D0%B8%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D1%80%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D1%81%D1%82%D0%B2%D0%B0\">\u0434\u0432\u043e\u0438\u0447\u043d\u043e\u043c \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0438 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430<\/a>) \u0432 Wikipedia. \u0415\u0441\u043b\u0438 \u0432\u043a\u0440\u0430\u0442\u0446\u0435, \u0442\u043e \u043a\u0430\u0440\u0442\u044b Quake \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043b\u0438 \u0441\u0435\u0440\u044c\u0451\u0437\u043d\u0443\u044e \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443. \u0418\u0445 \u043e\u0431\u044a\u0451\u043c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u0440\u0430\u0437\u0440\u0435\u0437\u0430\u043b\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/fabiensanglard.net\/quakeSource\/bsp.jpg\"\/><\/p>\n<p>  \u042d\u0442\u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b BSP \u0441 \u043b\u0438\u0441\u0442\u044c\u044f\u043c\u0438 (\u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0442\u0430\u043a\u043e\u0432\u044b: \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043f\u043e\u043b\u0438\u0433\u043e\u043d \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0441\u0435\u043a\u0443\u0449\u0435\u0439 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 \u0438 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c, \u0440\u0430\u0437\u0440\u0435\u0437\u0430\u044e\u0449\u0438\u0439 \u043c\u0435\u043d\u044c\u0448\u0435\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u043e\u0432). \u041f\u043e\u0441\u043b\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f BSP \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043b\u0438\u0441\u0442\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u043b\u0441\u044f PVS (Potentially Visible Set, \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0432\u0438\u0434\u0438\u043c\u044b\u0439 \u043d\u0430\u0431\u043e\u0440). \u041f\u0440\u0438\u043c\u0435\u0440: \u043b\u0438\u0441\u0442 4 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0432\u0438\u0434\u0435\u0442\u044c \u043b\u0438\u0441\u0442\u044c\u044f 7 \u0438 9:<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/fabiensanglard.net\/quakeSource\/pvs.jpg\"\/><\/p>\n<p>  \u041e\u043a\u043e\u043d\u0447\u0430\u043b\u044c\u043d\u044b\u0439 PVS \u0434\u043b\u044f \u044d\u0442\u043e\u0433 \u043b\u0438\u0441\u0442\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u043b\u0441\u044f \u043a\u0430\u043a \u0431\u0438\u0442\u043e\u0432\u044b\u0439 \u0432\u0435\u043a\u0442\u043e\u0440:<\/p>\n<table>\n<tr>\n<th>\u0418\u0434. \u043b\u0438\u0441\u0442\u0430<\/th>\n<th>1<\/th>\n<th>2<\/th>\n<th>3<\/th>\n<th>4<\/th>\n<th>5<\/th>\n<th>6<\/th>\n<th>7<\/th>\n<th>8<\/th>\n<th>9<\/th>\n<th>10<\/th>\n<th>11<\/th>\n<th>12<\/th>\n<th>13<\/th>\n<th>14<\/th>\n<th>15<\/th>\n<th>16<\/th>\n<\/tr>\n<tr>\n<th>PVS \u0434\u043b\u044f \u043b\u0438\u0441\u0442\u0430 4<\/th>\n<td>0<\/td>\n<td>0<\/td>\n<td>0<\/td>\n<td>1<\/td>\n<td>0<\/td>\n<td>0<\/td>\n<td>1<\/td>\n<td>0<\/td>\n<td>1<\/td>\n<td>0<\/td>\n<td>0<\/td>\n<td>0<\/td>\n<td>0<\/td>\n<td>0<\/td>\n<td>0<\/td>\n<td>0<\/td>\n<\/tr>\n<\/table>\n<p>\u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u043b\u0441\u044f \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0439 PVS \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e 5\u041c\u0411. \u042d\u0442\u043e \u0431\u044b\u043b\u043e \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e \u0434\u043b\u044f \u041f\u041a \u0432 1996 \u0433\u043e\u0434\u0443. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 PVS \u0441\u0436\u0438\u043c\u0430\u043b\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u043c\u043f\u0440\u0435\u0441\u0441\u0438\u0438 \u0440\u0430\u0437\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u0438\u043d.<\/p>\n<table>\n<tr>\n<th>\u0421\u0436\u0430\u0442\u044b\u0439 PVS \u0434\u043b\u044f \u043b\u0438\u0441\u0442\u0430 4<\/th>\n<td>3<\/td>\n<td>2<\/td>\n<td>1<\/td>\n<td>7<\/td>\n<\/tr>\n<\/table>\n<p>  \u0417\u0430\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 PVS \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043b \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043d\u0443\u043b\u0435\u0439 \u043c\u0435\u0436\u0434\u0443 \u0435\u0434\u0438\u043d\u0438\u0446\u0430\u043c\u0438. \u0425\u043e\u0442\u044f \u044d\u0442\u043e \u0438 \u043d\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043e\u0447\u0435\u043d\u044c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u0442\u0435\u0445\u043d\u0438\u043a\u043e\u0439 \u0441\u0436\u0430\u0442\u0438\u044f, \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043b\u0438\u0441\u0442\u044c\u0435\u0432 (32767) \u0432 \u0441\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u0438 \u0441 \u043e\u0447\u0435\u043d\u044c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u044b\u043c \u043d\u0430\u0431\u043e\u0440\u043e\u043c \u0432\u0438\u0434\u0438\u043c\u044b\u0445 \u043b\u0438\u0441\u0442\u044c\u0435\u0432 \u0441\u043d\u0438\u0436\u0430\u043b\u0438 \u0440\u0430\u0437\u043c\u0435\u0440 \u0432\u0441\u0435\u0433\u043e PVS \u0434\u043e 20\u041a\u0411.<\/p>\n<h3>\u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0432 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0438<\/h3>\n<p>  \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u043d\u0430\u043b\u0438\u0447\u0438\u044e \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043d\u043d\u044b\u0445 BPS \u0438 PVS \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u0430\u0440\u0442\u044b \u0434\u0432\u0438\u0436\u043a\u043e\u043c \u0431\u044b\u043b\u0430 \u043f\u0440\u043e\u0441\u0442\u043e\u0439:<\/p>\n<ul>\n<li>\u041e\u0431\u0445\u043e\u0434 BSP \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0442\u043e\u0433\u043e, \u043d\u0430 \u043a\u0430\u043a\u043e\u0439 \u043b\u0438\u0441\u0442 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0430 \u043a\u0430\u043c\u0435\u0440\u0430.<\/li>\n<li>\u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438 \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u043a\u0430 PVS \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043b\u0438\u0441\u0442\u0430, \u0438\u0442\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043f\u0440\u043e\u0445\u043e\u0434 \u043f\u043e PVS \u0438 \u043f\u043e\u043c\u0435\u0442\u043a\u0430 \u043b\u0438\u0441\u0442\u044c\u0435\u0432 \u0432 BSP.<\/li>\n<li>\u041e\u0431\u0445\u043e\u0434 BSP, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u043e\u0442 \u0431\u043b\u0438\u0436\u043d\u0438\u0445 \u043a \u0434\u0430\u043b\u044c\u043d\u0438\u043c.<\/li>\n<li>\u0415\u0441\u043b\u0438 \u0443\u0437\u0435\u043b (Node) \u043d\u0435 \u043f\u043e\u043c\u0435\u0447\u0435\u043d, \u0442\u043e \u043e\u043d \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f.<\/li>\n<li>\u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0431\u0449\u0435\u0439 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0443\u0437\u043b\u043e\u0432 \u043d\u0430 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0432 \u043f\u0438\u0440\u0430\u043c\u0438\u0434\u0435 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043a\u0430\u043c\u0435\u0440\u044b.<\/li>\n<li>\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043b\u0438\u0441\u0442\u0430 \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438.<\/li>\n<\/ul>\n<p>  <b>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435:<\/b> BSP \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f \u043e\u0431\u0445\u043e\u0434\u0430 \u043a\u0430\u0440\u0442\u044b \u043e\u0442 \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0438\u0445 \u0442\u043e\u0447\u0435\u043a \u0432\u0434\u0430\u043b\u044c \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u0438 \u043f\u043e\u043c\u0435\u0442\u043a\u0438 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u043e\u0432 \u043d\u0430 \u043a\u0430\u0440\u0442\u0435.<\/p>\n<p>  <b>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435 2:<\/b> \u041f\u0440\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u043c \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0435 \u043e\u0431\u0445\u043e\u0434 BSP-\u0434\u0435\u0440\u0435\u0432\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b\u0441\u044f \u0441 \u0434\u0430\u043b\u044c\u043d\u0438\u0445 \u0442\u043e\u0447\u0435\u043a \u0434\u043e \u0431\u043b\u0438\u0436\u043d\u0438\u0445.<\/p>\n<h3>\u0410\u043d\u0430\u043b\u0438\u0437 \u043a\u043e\u0434\u0430<\/h3>\n<p>  \u0412\u043a\u0440\u0430\u0442\u0446\u0435 \u043a\u043e\u0434 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0442\u0430\u043a:  <\/p>\n<pre><code class=\"cpp\">SCR_UpdateScreen \t\t\t\t\t\t\t\t\t\t\t { \t\tGL_BeginRendering \t\tSCR_SetUpToDrawConsole \t\tV_RenderView \t\t|\t\tR_Clear \t\t|\t\tR_RenderScene \t\t|\t\t|\t\tR_SetupFrame \t\t|\t\t|\t\t\t\tMod_PointInLeaf \t\t|\t\t|\t\tR_SetFrustum \t\t|\t\t|\t\tR_SetupGL \t\t|\t\t|\t\tR_MarkLeaves \t\t|\t\t|\t\t|\t\tMod_LeafPVS \t\t|\t\t|\t\t|\t\t\t\tMod_DecompressVis \t\t|\t\t|\t\tR_DrawWorld \t\t|\t\t|\t\t|\t\tR_RecursiveWorldNode \t\t|\t\t|\t\t|\t\tDrawTextureChains \t\t|\t\t|\t\t|\t\t|\t\tR_RenderBrushPoly \t\t|\t\t|\t\t|\t\t|\t\t\tDrawGLPoly \t\t|\t\t|\t\t|\t\tR_BlendLightmaps \t\t|\t\t|\t\tS_ExtraUpdate \t\t|\t\t|\t\tR_DrawEntitiesOnList \t\t|\t\t|\t\tGL_DisableMultitexture \t\t|\t\t|\t\tR_RenderDlights \t\t|\t\t|\t\tR_DrawParticles \t\t|\t\tR_DrawViewModel \t\t|\t\t\tR_DrawAliasModel \t\t|\t\tR_DrawWaterSurfaces \t\t|\t\tR_PolyBlend \t\tGL_Set2D \t\tSCR_TileClear \t\tV_UpdatePalette \t\tGL_EndRendering }<\/code><\/pre>\n<p>  <u>SCR_UpdateScreen<\/u><\/p>\n<p>  \u0412\u044b\u0437\u043e\u0432\u044b:<\/p>\n<ol>\n<li><code>GL_BeginRendering<\/code> (\u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 (<code>glx,gly,glwidth,glheight<\/code>), \u043f\u043e\u0437\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u0432 <code>R_SetupGL<\/code> \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0438 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u043f\u0440\u043e\u0435\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f)<\/li>\n<li><code>SCR_SetUpToDrawConsole<\/code> (\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0432\u044b\u0441\u043e\u0442\u0443 \u043a\u043e\u043d\u0441\u043e\u043b\u0438: \u043f\u043e\u0447\u0435\u043c\u0443 \u044d\u0442\u043e \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0437\u0434\u0435\u0441\u044c, \u0430 \u043d\u0435 \u0432 \u0447\u0430\u0441\u0442\u0438, \u043e\u0442\u043d\u043e\u0441\u044f\u0449\u0435\u0439\u0441\u044f \u043a 2D?!)<\/li>\n<li><code>V_RenderView<\/code> (\u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433 3D-\u0441\u0446\u0435\u043d\u044b)<\/li>\n<li><code>GL_Set2D<\/code> (\u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u043e\u0440\u0442\u043e\u0433\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438 (2D))<\/li>\n<li><code>SCR_TileClear<\/code> (\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0430 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 2D-\u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u043a\u043e\u043d\u0441\u043e\u043b\u0438, \u043c\u0435\u0442\u0440\u0438\u043a FPS \u0438 \u0442.\u0434.)<\/li>\n<li><code>V_UpdatePalette<\/code> (\u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u043c\u0443 \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440\u0443, \u0432 openGL \u043c\u0435\u0442\u043e\u0434 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0440\u0435\u0436\u0438\u043c \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u043d\u0438\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u043c\u0443 \u0443\u0440\u043e\u043d\u0443 \u0438\u043b\u0438 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u043c\u0443 \u0431\u043e\u043d\u0443\u0441\u0443, \u0434\u0435\u043b\u0430\u044f \u044d\u043a\u0440\u0430\u043d \u043a\u0440\u0430\u0441\u043d\u044b\u043c, \u044f\u0440\u043a\u0438\u043c \u0438 \u0442.\u0434.). \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432 <code>v_blend<\/code><\/li>\n<li><code>GL_EndRendering<\/code> (\u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0431\u0443\u0444\u0435\u0440\u0430 (\u0434\u0432\u043e\u0439\u043d\u0430\u044f \u0431\u0443\u0444\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u044f)!)<\/li>\n<\/ol>\n<p>  <u>V_RenderView<\/u><br \/>  \u0412\u044b\u0437\u043e\u0432\u044b:<\/p>\n<ol>\n<li><code>V_CalcRefdef<\/code> (\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u0435, \u0432 \u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043d\u0435 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0441\u044f)<\/li>\n<li><code>R_PushDlights<\/code> \u041f\u043e\u043c\u0435\u0442\u043a\u0430 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u043e\u0432 \u043a\u0430\u0436\u0434\u044b\u043c \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u043c \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043d\u0430\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0430 (\u0441\u043c. \u043f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435)<\/li>\n<li><code>R_RenderView<\/code><\/li>\n<\/ol>\n<p>  <b>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435:<\/b> R_PushDlights \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 (<code>R_MarkLights<\/code>). \u041e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 BSP \u0434\u043b\u044f \u043f\u043e\u043c\u0435\u0442\u043a\u0438 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u043e\u0432 (\u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0446\u0435\u043b\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0431\u0438\u0442\u043e\u0432\u043e\u0433\u043e \u0432\u0435\u043a\u0442\u043e\u0440\u0430), \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u043e\u0437\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0442 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0438 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f. BSP \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0441 \u0431\u043b\u0438\u0436\u043d\u0438\u0445 \u0442\u043e\u0447\u0435\u043a \u0434\u043e \u0434\u0430\u043b\u044c\u043d\u0438\u0445 (\u0441 \u0442\u043e\u0447\u043a\u0438 \u043e\u0431\u0437\u043e\u0440\u0430 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f). \u041c\u0435\u0442\u043e\u0434 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u0430\u043a\u0442\u0438\u0432\u0435\u043d \u043b\u0438 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043b\u0438 \u043e\u043d \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u0438. \u041c\u0435\u0442\u043e\u0434 <code>R_MarkLights<\/code> \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u0435\u043d, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u043c\u044b \u0432\u0438\u0434\u0438\u043c \u043f\u0440\u044f\u043c\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0441\u0442\u0430\u0442\u044c\u0438 \u041c\u0430\u0439\u043a\u043b\u0430 \u0410\u0431\u0440\u0430\u0448\u0430 \u043e \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u043c\u0435\u0436\u0434\u0443 \u0442\u043e\u0447\u043a\u043e\u0439 \u0438 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c\u044e \u00abFrames of Reference\u00bb (<code>dist = DotProduct (light-&gt;origin, splitplane-&gt;normal) - splitplane-&gt;dist;<\/code>)).<\/p>\n<p>  <u>R_RenderView<\/u><\/p>\n<p>  \u0412\u044b\u0437\u043e\u0432\u044b:<\/p>\n<ol>\n<li><code>R_Clear<\/code> (\u043e\u0447\u0438\u0441\u0442\u043a\u0430 \u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 GL_COLOR_BUFFER_BIT \u0438\/\u0438\u043b\u0438 GL_DEPTH_BUFFER_BIT)<\/li>\n<li><code>R_RenderScene<\/code><\/li>\n<li><code>R_DrawViewModel<\/code> (\u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433 \u043c\u043e\u0434\u0435\u043b\u0438 \u0438\u0433\u0440\u043e\u043a\u0430 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u0435\u043b\u044f)<\/li>\n<li><code>R_DrawWaterSurfaces<\/code> (\u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0432 \u0440\u0435\u0436\u0438\u043c GL_BEND\/GL_MODULATE \u0434\u043b\u044f \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u0432\u043e\u0434\u044b. \u0414\u0435\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u043e\u0438\u0441\u043a\u0430 sin \u0438 cos \u0438\u0437 <code>gl_warp.c<\/code>)<\/li>\n<li><code>R_PolyBlend<\/code> (\u0441\u043c\u0435\u0448\u0438\u0432\u0430\u043d\u0438\u0435 \u0432\u0441\u0435\u0433\u043e \u044d\u043a\u0440\u0430\u043d\u0430 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0432 <code>V_UpdatePalette<\/code> \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 <code>v_blend<\/code>. \u042d\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0443\u0440\u043e\u043d\u0430 (\u043a\u0440\u0430\u0441\u043d\u044b\u0439 \u0446\u0432\u0435\u0442), \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u043f\u043e\u0434 \u0432\u043e\u0434\u043e\u0439 \u0438\u043b\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0431\u043e\u043d\u0443\u0441\u0430)<\/li>\n<\/ol>\n<p>  <u>R_RenderScene<\/u><\/p>\n<p>  \u0412\u044b\u0437\u043e\u0432\u044b:  <\/p>\n<ol>\n<li><code>R_SetupFrame<\/code>(\u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u043b\u0438\u0441\u0442\u0430 BSP, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043a\u0430\u043c\u0435\u0440\u0430 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0435\u0433\u043e \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u00abr_viewleaf\u00bb )<\/li>\n<li><code>R_SetFrustum<\/code> (\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 <code>\u043f\u0438\u0440\u0430\u043c\u0438\u0434\u044b mplane_t[4]<\/code>. \u0411\u0435\u0437 \u0431\u043b\u0438\u0436\u043d\u0435\u0439 \u0438 \u0434\u0430\u043b\u044c\u043d\u0435\u0439 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438.<\/li>\n<li><code>R_SetupGL<\/code> (\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 GL_PROJECTION, GL_MODELVIEW, \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0438 \u0441\u0442\u043e\u0440\u043e\u043d\u044b glCullFace, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0432\u043e\u0440\u043e\u0442 \u043e\u0441\u0435\u0439 Y \u0438 Z, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u0441\u0438 X \u0438 Z \u0432 Quake \u0438\u043c\u0435\u044e\u0442 \u0434\u0440\u0443\u0433\u043e\u0435 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 openGL.)<\/li>\n<li><code>R_MarkLeaves<\/code><\/li>\n<li><code>R_DrawWorld<\/code><\/li>\n<li><code>S_ExtraUpdate<\/code> (\u0441\u0431\u0440\u043e\u0441 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043c\u044b\u0448\u0438, \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0441\u043e \u0437\u0432\u0443\u043a\u043e\u043c)<\/li>\n<li><code>R_DrawEntitiesOnList<\/code> (\u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435)<\/li>\n<li><code>GL_DisableMultitexture<\/code> (\u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043c\u0443\u043b\u044c\u0442\u0438\u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f)<\/li>\n<li><code>R_RenderDlights<\/code> (\u0441\u0432\u0435\u0442\u043e\u0432\u044b\u0435 \u0434\u043e\u043c\u0435\u043d\u044b \u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u044b \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f)<\/li>\n<li><code>R_DrawParticles<\/code> (\u0432\u0437\u0440\u044b\u0432\u044b, \u043e\u0433\u043e\u043d\u044c, \u044d\u043b\u0435\u043a\u0442\u0440\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438 \u0442.\u0434.)<\/li>\n<\/ol>\n<p>  <u>R_SetupFrame<\/u><\/p>\n<p>  \u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0430:<\/p>\n<pre><code class=\"cpp\">r_viewleaf = Mod_PointInLeaf (r_origin, cl.worldmodel);<\/code><\/pre>\n<p>  \u0412 \u043d\u0435\u0439 \u0434\u0432\u0438\u0436\u043e\u043a Quake \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442 \u043b\u0438\u0441\u0442\/\u0443\u0437\u0435\u043b \u0432 BSP, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0430 \u043a\u0430\u043c\u0435\u0440\u0430 \u0432 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043c\u043e\u043c\u0435\u043d\u0442.<\/p>\n<p>  Mod_PointInLeaf \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d \u0432 model.c, \u043e\u043d \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 BSP (\u043a\u043e\u0440\u0435\u043d\u044c BSP-\u0434\u0435\u0440\u0435\u0432\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 model-&gt;nodes ).<\/p>\n<p>  \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0443\u0437\u043b\u0430:<\/p>\n<ul>\n<li>\u0415\u0441\u043b\u0438 \u0443\u0437\u0435\u043b \u043d\u0435 \u0440\u0430\u0441\u0441\u0435\u043a\u0430\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0434\u0430\u043b\u0435\u0435, \u0442\u043e \u043e\u043d \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438\u0441\u0442\u043e\u043c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u043d \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0443\u0437\u043b\u0430.<\/li>\n<li>\u0412 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0441\u0435\u043a\u0443\u0449\u0430\u044f \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c BSP \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f (\u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e \u0441\u043a\u0430\u043b\u044f\u0440\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f, \u044d\u0442\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043e\u0431\u0445\u043e\u0434\u0430 BSP-\u0434\u0435\u0440\u0435\u0432\u0430) \u0438 \u043e\u0431\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b.<\/li>\n<\/ul>\n<p>  <u>R_MarkLeaves<\/u><\/p>\n<p>  \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e <code>r_viewleaf<\/code> \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043a\u0430\u043c\u0435\u0440\u044b \u0432 BSP (\u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u043c\u043e\u0435 \u0432 <code>R_SetupFrame<\/code>), \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043f\u043e\u0438\u0441\u043a (<code>Mod_LeafPVS<\/code>) \u0438 \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u0435\u0442 (<code>Mod_DecompressVis<\/code>) \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0432\u0438\u0434\u0438\u043c\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 (PVS). \u0417\u0430\u0442\u0435\u043c \u0438\u0442\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e \u043e\u0431\u0445\u043e\u0434\u0438\u0442 \u0431\u0438\u0442\u043e\u0432\u044b\u0439 \u0432\u0435\u043a\u0442\u043e\u0440 \u0438 \u043f\u043e\u043c\u0435\u0447\u0430\u0435\u0442 \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0432\u0438\u0434\u0438\u043c\u044b\u0435 \u0443\u0437\u043b\u044b BSP: node-&gt;visframe = r_visframecount.<\/p>\n<p>  <u>R_DrawWorld<\/u><\/p>\n<p>  \u0412\u044b\u0437\u043e\u0432\u044b:<\/p>\n<ol>\n<li><code>R_RecursiveWorldNode<\/code> (\u043e\u0431\u0445\u043e\u0434 \u043c\u0438\u0440\u0430 BSP \u0441\u043f\u0435\u0440\u0435\u0434\u0438 \u043d\u0430\u0437\u0430\u0434, \u043f\u0440\u043e\u043f\u0443\u0441\u043a \u0443\u0437\u043b\u043e\u0432, \u043d\u0435 \u043f\u043e\u043c\u0435\u0447\u0435\u043d\u043d\u044b\u0445 \u0440\u0430\u043d\u0435\u0435 (\u0432 <code>R_MarkLeaves<\/code>), \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 <code>cl.worldmodel-&gt;textures[]-&gt;texturechain<\/code> \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c\u0438 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430\u043c\u0438.)<\/li>\n<li><code>DrawTextureChains<\/code> (\u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0430 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u043e\u0432, \u0445\u0440\u0430\u043d\u044f\u0449\u0438\u0445\u0441\u044f \u0432 texturechain: \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e cl.worldmodel-&gt;textures[]. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u043e \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043d\u0430 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b. \u041d\u0435\u043f\u043b\u043e\u0445\u043e.)<\/li>\n<li><code>R_BlendLightmaps<\/code> (\u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u0440\u043e\u0445\u043e\u0434, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u0434\u043b\u044f \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u043d\u0438\u044f \u043a\u0430\u0440\u0442 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u0432 \u0431\u0443\u0444\u0435\u0440\u0435 \u043a\u0430\u0434\u0440\u043e\u0432).<\/li>\n<\/ol>\n<p>  <u>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435:<\/u><\/p>\n<p>  \u0412 \u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u0435\u0447\u0430\u043b\u044c\u043d\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c openGL \u00abimmediate mode\u00bb, \u0432 \u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043e\u043d \u0441\u0447\u0438\u0442\u0430\u043b\u0441\u044f \u00ab\u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c \u0441\u043b\u043e\u0432\u043e\u043c \u0442\u0435\u0445\u043d\u0438\u043a\u0438\u00bb.<\/p>\n<p>  \u0412 <code>R_RecursiveWorldNode<\/code> \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0431\u00f3\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0435\u0439. \u0423\u0437\u0435\u043b \u043e\u0442\u0441\u0435\u043a\u0430\u0435\u0442\u0441\u044f, \u0435\u0441\u043b\u0438:<\/p>\n<ul>\n<li>\u0415\u0433\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u0432\u0451\u0440\u0434\u044b\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c.<\/li>\n<li>\u041b\u0438\u0441\u0442 \u043d\u0435 \u0431\u044b\u043b \u043f\u043e\u043c\u0435\u0447\u0435\u043d \u0432 PVS (<code>node-&gt;visframe != r_visframecount<\/code>)<\/li>\n<li>\u041b\u0438\u0441\u0442 \u043d\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u043e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u043f\u0438\u0440\u0430\u043c\u0438\u0434\u0435 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438.<\/li>\n<\/ul>\n<p>  <img decoding=\"async\" src=\"http:\/\/media.indiedb.com\/images\/members\/1\/240\/239733\/generations000073.jpg\" alt=\"image\"\/><\/p>\n<h3>\u0424\u043e\u0440\u043c\u0430\u0442 MDL<\/h3>\n<p>  \u0424\u043e\u0440\u043c\u0430\u0442 MDL \u2014 \u044d\u0442\u043e \u043d\u0430\u0431\u043e\u0440 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043a\u0430\u0434\u0440\u043e\u0432. \u0414\u0432\u0438\u0436\u043e\u043a Quake \u043d\u0435 \u0438\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u0438\u0440\u0443\u0435\u0442 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d \u0434\u043b\u044f \u0441\u0433\u043b\u0430\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 (\u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u044b\u0441\u043e\u043a\u0430\u044f \u0447\u0430\u0441\u0442\u043e\u0442\u0430 \u043a\u0430\u0434\u0440\u043e\u0432 \u043d\u0435 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044e \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438).<\/p>\n<h3>\u042d\u043b\u0435\u0433\u0430\u043d\u0442\u043d\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f<\/h3>\n<p>  <u>\u042d\u043b\u0435\u0433\u0430\u043d\u0442\u043d\u0430\u044f \u043f\u043e\u043c\u0435\u0442\u043a\u0430 \u043b\u0438\u0441\u0442\u044c\u0435\u0432<\/u><\/p>\n<p>  \u041d\u0430\u0438\u0432\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043f\u043e\u043c\u0435\u0442\u043a\u0438 \u043b\u0438\u0441\u0442\u044c\u0435\u0432 BSP \u0434\u043b\u044f \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0431\u0443\u043b\u0435\u0432\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 <code>isMarkedVisible<\/code>. \u041f\u0435\u0440\u0435\u0434 \u043a\u0430\u0436\u0434\u044b\u043c \u043a\u0430\u0434\u0440\u043e\u043c \u043d\u0443\u0436\u043d\u043e:<\/p>\n<ol>\n<li>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u0431\u0443\u043b\u0435\u0432\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0440\u0430\u0432\u043d\u044b\u043c\u0438 false.<\/li>\n<li>\u0418\u0442\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e \u043e\u0431\u043e\u0439\u0442\u0438 PVS \u0438 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0432\u0438\u0434\u0438\u043c\u043e\u0433\u043e \u043b\u0438\u0441\u0442\u0430 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 true.<\/li>\n<li>\u041f\u043e\u0442\u043e\u043c \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043b\u0438\u0441\u0442 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>if (leave.isMarkedVisible)<\/code><\/li>\n<\/ol>\n<p>  \u0412\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u0434\u0432\u0438\u0436\u043e\u043a Quake \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0446\u0435\u043b\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0434\u043b\u044f \u043f\u043e\u0434\u0441\u0447\u0451\u0442\u0430 \u043d\u043e\u043c\u0435\u0440\u0430 \u043e\u0442\u0440\u0435\u043d\u0434\u0435\u0440\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u0430\u0434\u0440\u0430 (<code>r_visframecount<\/code> variable). \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u043e\u0442 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0448\u0430\u0433\u0430:<\/p>\n<ol>\n<li>\u0418\u0442\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 PVS \u0438 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0432\u0438\u0434\u0438\u043c\u043e\u0433\u043e \u043b\u0438\u0441\u0442\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c <code>leaf.visframe = r_visframecount<\/code><\/li>\n<li>\u041f\u043e\u0442\u043e\u043c \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043b\u0438\u0441\u0442 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>if (leaf.visframe == r_visframecount)<\/code><\/li>\n<\/ol>\n<p>  <u>\u0418\u0437\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0442 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438<\/u><\/p>\n<p>  \u0412 <code>R_SetupFrame<\/code> \u0432\u043c\u0435\u0441\u0442\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u00ab\u0431\u044b\u0441\u0442\u0440\u043e\u0439 \u0438 \u0433\u0440\u044f\u0437\u043d\u043e\u0439\u00bb \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u0434\u043b\u044f \u043e\u0431\u0445\u043e\u0434\u0430 BSP \u0438 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0446\u0438\u043a\u043b while.<\/p>\n<pre><code class=\"cpp\">\tnode = model-&gt;nodes;  \twhile (1)  \t{  \t\tif (node-&gt;contents &lt; 0)  \t\t\treturn (mleaf_t *)node;  \t\tplane = node-&gt;plane;  \t\td = DotProduct (p,plane-&gt;normal) - plane-&gt;dist;  \t\tif (d &gt; 0)  \t\t\tnode = node-&gt;children[0];  \t\telse  \t\t\tnode = node-&gt;children[1];  \t}<\/code><\/pre>\n<p>  <u>\u041c\u0438\u043d\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 \u0442\u0435\u043a\u0441\u0442\u0443\u0440<\/u><\/p>\n<p>  \u0412 openGL \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0442\u0435\u043a\u0441\u0442\u0443\u0440 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e (<code>glBindTexture(GL_TEXTURE_2D,id)<\/code>) \u043e\u0447\u0435\u043d\u044c \u0437\u0430\u0442\u0440\u0430\u0442\u043d\u043e. \u0414\u043b\u044f \u043c\u0438\u043d\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 \u0442\u0435\u043a\u0441\u0442\u0443\u0440 \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u043e\u043b\u0438\u0433\u043e\u043d, \u043f\u043e\u043c\u0435\u0447\u0435\u043d\u043d\u044b\u0439 \u0434\u043b\u044f \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430, \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432 \u0446\u0435\u043f\u043e\u0447\u043a\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432, \u0438\u043d\u0434\u0435\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043f\u043e \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0443 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430.<\/p>\n<pre><code class=\"cpp\">cl.worldmodel-&gt;textures[textureId]-&gt;texturechain[]<\/code><\/pre>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u043e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u0442\u0435\u043a\u0441\u0442\u0443\u0440 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043f\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0443. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432\u0441\u0435\u0433\u043e N \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 \u0442\u0435\u043a\u0441\u0442\u0443\u0440, \u0433\u0434\u0435 N \u2014 \u043e\u0431\u0449\u0435\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u0438\u0434\u0438\u043c\u044b\u0445 \u0442\u0435\u043a\u0441\u0442\u0443\u0440.<\/p>\n<pre><code class=\"cpp\">\tint i; \tfor ( i = 0; i &lt; cl.worldmodel-&gt;textures_num ; i ++) \t\tDrawTextureChains(i);<\/code><\/pre>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habrahabr.ru\/post\/324804\/\"> https:\/\/habrahabr.ru\/post\/324804\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/d32\/0d6\/ffa\/d320d6ffa37f59fd21361a0ae1a0aaab.jpg\" alt=\"image\"\/><\/p>\n<p>  \u042f \u0441 \u0443\u0434\u043e\u0432\u043e\u043b\u044c\u0441\u0442\u0432\u0438\u0435\u043c \u043f\u043e\u0433\u0440\u0443\u0437\u0438\u043b\u0441\u044f \u0432 \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u0435 <a href=\"https:\/\/github.com\/id-Software\">\u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 Quake World<\/a> \u0438 \u0438\u0437\u043b\u043e\u0436\u0438\u043b \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u0432\u0441\u0451, \u0447\u0442\u043e \u044f \u043f\u043e\u043d\u044f\u043b. \u041d\u0430\u0434\u0435\u044e\u0441\u044c, \u044d\u0442\u043e \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0436\u0435\u043b\u0430\u044e\u0449\u0438\u043c \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f. \u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0430 \u043d\u0430 \u0447\u0435\u0442\u044b\u0440\u0435 \u0447\u0430\u0441\u0442\u0438:<\/p>\n<ul>\n<li>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430<\/li>\n<li>\u0421\u0435\u0442\u044c<\/li>\n<li>\u041f\u0440\u043e\u0433\u043d\u043e\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/li>\n<li>\u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f<\/li>\n<\/ul>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-284163","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/284163","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=284163"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/284163\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=284163"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=284163"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=284163"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}