{"id":498792,"date":"2026-10-15T15:47:57","date_gmt":"2026-10-15T12:47:57","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=498792"},"modified":"2026-10-15T15:47:57","modified_gmt":"2026-10-15T12:47:57","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=498792","title":{"rendered":"MicroBuild: DOOM\u2011Style \u0434\u0432\u0438\u0436\u043e\u043a \u043d\u0430\u00a0AVR"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<details class=\"spoiler\">\n<summary>\u041e\u0433\u043b\u0430\u0432\u043b\u0435\u043d\u0438\u0435<\/summary>\n<div class=\"spoiler__content\">\n<ul>\n<li>\n<p><a href=\"#%D0%92%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5\" rel=\"noopener nofollow\">\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/a><\/p>\n<ul>\n<li>\n<p><a href=\"#%D0%9D%D0%B5%D1%81%D0%BF%D1%80%D0%B0%D0%B2%D0%B5%D0%B4%D0%BB%D0%B8%D0%B2%D0%BE%D1%81%D1%82%D1%8C\" rel=\"noopener nofollow\">\u041d\u0435\u0441\u043f\u0440\u0430\u0432\u0435\u0434\u043b\u0438\u0432\u043e\u0441\u0442\u044c, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043b\u0430 \u043d\u0430\u00a0AVR<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%9F%D0%BE%D1%87%D0%B5%D0%BC%D1%83\" rel=\"noopener nofollow\">\u041f\u043e\u0447\u0435\u043c\u0443 Build Engine, \u0430\u00a0\u043d\u0435\u00a0DOOM Engine<\/a><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><a href=\"#%D0%9A%D1%80%D0%B0%D1%82%D0%BA%D0%BE\" rel=\"noopener nofollow\">\u041a\u0440\u0430\u0442\u043a\u043e \u043e\u00a0\u0441\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u0445 \u0434\u0432\u0438\u0436\u043a\u0430\u0445<\/a><\/p>\n<ul>\n<li>\n<p><a href=\"#%D0%A1%D0%B5%D0%BA%D1%82%D0%BE%D1%80\" rel=\"noopener nofollow\">\u0421\u0435\u043a\u0442\u043e\u0440, \u0441\u0442\u0435\u043d\u0430 \u0438 \u043c\u0430\u0433\u0438\u044f \u043f\u043e\u0440\u0442\u0430\u043b\u043e\u0432<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%9A%D0%B0%D0%BA\" rel=\"noopener nofollow\">\u041a\u0430\u043a 2D\u2011\u043a\u0430\u0440\u0442\u0430 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 3D\u2011\u043c\u0438\u0440<\/a><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><a href=\"#%D0%9F%D0%B8%D1%88%D0%B5%D0%BC\" rel=\"noopener nofollow\">\u041f\u0438\u0448\u0435\u043c MicroBuild \u043d\u0430\u00a0\u0441\u043f\u0438\u0447\u0435\u0447\u043d\u043e\u043c \u043a\u043e\u0440\u043e\u0431\u043a\u0435<\/a><\/p>\n<ul>\n<li>\n<p><a href=\"#%D0%9F%D1%80%D0%BE%D1%82%D0%BE%D1%82%D0%B8%D0%BF\" rel=\"noopener nofollow\">\u041f\u0440\u043e\u0442\u043e\u0442\u0438\u043f \u043d\u0430\u00a0SDL2\u00a0\u0438 \u0432\u043e\u0439\u043d\u0430 \u0441\u00a0\u0442\u0438\u043f\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#Fixed\" rel=\"noopener nofollow\">Fixed\u2011Point \u0430\u0440\u0438\u0444\u043c\u0435\u0442\u0438\u043a\u0430<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%91%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D0%BE%D0%B5\" rel=\"noopener nofollow\">\u0411\u0438\u043d\u0430\u0440\u043d\u043e\u0435 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u0435 \u0443\u0433\u043b\u043e\u0432 (BAM)<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%A1%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D0%B0%D1%8F\" rel=\"noopener nofollow\">\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0430 \u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0441\u0438\u043d\u0443\u0441\u043e\u0432 (LUT)<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%A3%D0%B6%D0%B0%D1%81%D0%BD%D0%B0%D1%8F\" rel=\"noopener nofollow\">\u0423\u0436\u0430\u0441\u043d\u0430\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f \u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0432\u00a0\u0434\u0443\u0445\u0435 ECS<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#THE\" rel=\"noopener nofollow\">THE CAKE IS A LIE!<\/a><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><a href=\"#%D0%A1%D0%BA%D1%80%D0%B8%D0%BD%D1%88%D0%BE%D1%82%D1%8B\" rel=\"noopener nofollow\">\u0421\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u044b \u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043a\u0430\u0440\u0442<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%91%D0%B5%D0%BD%D1%87%D0%BC%D0%B0%D1%80%D0%BA%D0%B8\" rel=\"noopener nofollow\">\u0411\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%A1%D1%81%D1%8B%D0%BB%D0%BA%D0%B8\" rel=\"noopener nofollow\">\u0421\u0441\u044b\u043b\u043a\u0438<\/a><\/p>\n<\/li>\n<\/ul>\n<\/div>\n<\/details>\n<p><a class=\"anchor\" name=\"%D0%92%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5\" id=\"\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435\"><\/a><\/p>\n<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440!<\/p>\n<p>\u042d\u0442\u043e \u043c\u043e\u044f \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f, \u0438 \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u044f \u0445\u043e\u0447\u0443 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u043e\u043f\u044b\u0442\u043e\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u0441\u0435\u0432\u0434\u043e-3D \u0434\u0432\u0438\u0436\u043a\u0430 \u0434\u043b\u044f\u00a0\u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u0432 AVR. \u041f\u0440\u043e\u0435\u043a\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043b\u043e\u0436\u043d\u044b\u043c, \u043d\u043e\u00a0\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u043c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0440\u0435\u0448\u0438\u043b \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0435\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438 \u0442\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438, \u043a\u00a0\u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043f\u0440\u0438\u0431\u0435\u0433\u043d\u0443\u0442\u044c.<\/p>\n<p>\u041d\u0438\u0436\u0435 \u043f\u043e\u0434\u00a0\u0441\u043f\u043e\u0439\u043b\u0435\u0440\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430\u00a0\u0444\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0434\u0432\u0438\u0436\u043a\u0430.<\/p>\n<details class=\"spoiler\">\n<summary>\u0421\u043f\u043e\u0439\u043b\u0435\u0440!<\/summary>\n<div class=\"spoiler__content\">\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/extt\/53\/9c\/ce\/539cce29b4e9e29676e3f6f43f1bbfc4.png\" width=\"534\" height=\"501\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/extt\/53\/9c\/ce\/539cce29b4e9e29676e3f6f43f1bbfc4.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/extt\/53\/9c\/ce\/539cce29b4e9e29676e3f6f43f1bbfc4.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/extt\/d6\/40\/00\/d640005abd635c765587be532b131a56.png\" width=\"602\" height=\"636\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/extt\/d6\/40\/00\/d640005abd635c765587be532b131a56.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/extt\/d6\/40\/00\/d640005abd635c765587be532b131a56.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/extt\/fc\/19\/64\/fc1964a199764f756b0166558a15fd8b.png\" width=\"605\" height=\"579\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/extt\/fc\/19\/64\/fc1964a199764f756b0166558a15fd8b.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/extt\/fc\/19\/64\/fc1964a199764f756b0166558a15fd8b.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<\/div>\n<\/details>\n<p><a class=\"anchor\" name=\"%D0%9D%D0%B5%D1%81%D0%BF%D1%80%D0%B0%D0%B2%D0%B5%D0%B4%D0%BB%D0%B8%D0%B2%D0%BE%D1%81%D1%82%D1%8C\" id=\"\u041d\u0435\u0441\u043f\u0440\u0430\u0432\u0435\u0434\u043b\u0438\u0432\u043e\u0441\u0442\u044c\"><\/a><\/p>\n<h3>\u041d\u0435\u0441\u043f\u0440\u0430\u0432\u0435\u0434\u043b\u0438\u0432\u043e\u0441\u0442\u044c, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043b\u0430 \u043d\u0430\u00a0AVR<\/h3>\n<div class=\"floating-image\">\n<p>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 AVR \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0432\u00a0\u043c\u043e\u0435\u043c \u0441\u0435\u0440\u0434\u0446\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0435 \u043c\u0435\u0441\u0442\u043e\u00a0\u2014 \u0438\u043c\u0435\u043d\u043d\u043e \u043d\u0430\u00a0\u044d\u0442\u0438\u0445 \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430\u0445 \u044f \u043a\u043e\u0433\u0434\u0430\u2011\u0442\u043e \u0443\u0447\u0438\u043b\u0441\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u0418 \u0432\u043e\u0442, \u0437\u0430\u043d\u0438\u043c\u0430\u044f\u0441\u044c \u0433\u0435\u0439\u043c\u0434\u0435\u0432\u043e\u043c, \u044f \u0432\u00a0\u043a\u0430\u043a\u043e\u0439\u2011\u0442\u043e \u043c\u043e\u043c\u0435\u043d\u0442 \u0437\u0430\u0434\u0430\u043b\u0441\u044f \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u043c: \u0430\u00a0\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b\u00a0\u043b\u0438 \u043a\u0442\u043e\u2011\u043d\u0438\u0431\u0443\u0434\u044c \u043d\u0430\u00a0AVR \u0447\u0435\u0441\u0442\u043d\u043e\u0435, <strong>\u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e\u0435 \u043f\u0441\u0435\u0432\u0434\u043e-3D<\/strong>? \u0412\u0435\u0434\u044c \u044f \u0445\u043e\u0440\u043e\u0448\u043e \u0437\u043d\u0430\u044e \u044d\u0442\u0438 \u0447\u0438\u043f\u044b \u0438 \u0438\u0441\u043a\u0440\u0435\u043d\u043d\u0435 \u0432\u0435\u0440\u0438\u043b, \u0447\u0442\u043e\u00a0\u043e\u043d\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u044b \u043d\u0430\u00a0\u0431\u043e\u043b\u044c\u0448\u0435\u0435.<\/p>\n<\/div>\n<p>\u041c\u043e\u0439 \u043f\u043e\u0438\u0441\u043a\u043e\u0432\u044b\u0439 \u0437\u0430\u0431\u0435\u0433 \u043f\u043e\u00a0\u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c \u0432\u0440\u043e\u0434\u0435 \u00ab3D Graphics on Arduino\u00bb \u0438 \u00abDOOM on Arduino\u00bb \u043f\u0440\u0438\u043d\u0435\u0441 \u043b\u0438\u0448\u044c \u0440\u0430\u0437\u043e\u0447\u0430\u0440\u043e\u0432\u0430\u043d\u0438\u0435. \u0412\u00a0\u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0432\u0441\u0451 \u0441\u0432\u043e\u0434\u0438\u043b\u043e\u0441\u044c \u043a\u00a0\u043a\u0430\u0440\u043a\u0430\u0441\u043d\u044b\u043c \u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0438\u043c\u0441\u044f \u043a\u0443\u0431\u0430\u043c. \u041c\u0430\u043a\u0441\u0438\u043c\u0443\u043c, \u0447\u0442\u043e\u00a0\u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043d\u0430\u0439\u0442\u0438\u00a0\u2014 \u043f\u0440\u043e\u0435\u043a\u0442 <a href=\"https:\/\/github.com\/daveruiz\/doom-nano\" rel=\"noopener nofollow\">Doom\u2011Nano<\/a>. \u041d\u043e\u00a0\u043f\u0440\u0438\u00a0\u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0435\u043c \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u0438 \u043e\u043d \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0440\u0435\u0439\u043a\u0430\u0441\u0442\u0435\u0440\u043e\u043c \u0432\u00a0\u0434\u0443\u0445\u0435 <strong>Wolfenstein 3D<\/strong> <em>(\u0431\u0440\u043e\u0441\u0430\u0435\u043c \u043b\u0443\u0447\u0438 \u0438\u0437\u00a0\u043a\u0430\u043c\u0435\u0440\u044b \u043f\u043e\u00a0\u0434\u0432\u0443\u0445\u043c\u0435\u0440\u043d\u043e\u0439 \u0441\u0435\u0442\u043a\u0435, \u0430\u00a0\u043f\u0440\u0438\u00a0\u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0438 \u0440\u0438\u0441\u0443\u0435\u043c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u043b\u0438\u043d\u0438\u044e)<\/em>. \u041f\u0440\u043e\u0435\u043a\u0442 \u043a\u043b\u0430\u0441\u0441\u043d\u044b\u0439, \u043d\u043e&#8230; \u044d\u0442\u043e \u043d\u0435\u00a0DOOM.<\/p>\n<p>\u0418 \u0442\u0443\u0442 \u0432\u043e\u00a0\u043c\u043d\u0435 \u0432\u0437\u044b\u0433\u0440\u0430\u043b\u0430 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043d\u0430\u044f \u0433\u043e\u0440\u0434\u043e\u0441\u0442\u044c. \u0418\u0434\u0435\u044f \u0440\u043e\u0434\u0438\u043b\u0430\u0441\u044c \u0441\u0430\u043c\u0430 \u0441\u043e\u0431\u043e\u0439: \u0432\u0437\u044f\u0442\u044c DOOM, \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0432\u00a0\u0435\u0433\u043e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435 \u0438 \u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u00a0AVR. \u0414\u0435\u043b\u043e\u0432\u2011\u0442\u043e!<\/p>\n<p><a class=\"anchor\" name=\"%D0%9F%D0%BE%D1%87%D0%B5%D0%BC%D1%83\" id=\"\u041f\u043e\u0447\u0435\u043c\u0443\"><\/a><\/p>\n<h3>\u041f\u043e\u0447\u0435\u043c\u0443 Build Engine, \u0430\u00a0\u043d\u0435\u00a0DOOM Engine<\/h3>\n<p>\u041d\u043e\u00a0\u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0431\u044b\u0441\u0442\u0440\u043e \u0441\u043f\u0443\u0441\u0442\u0438\u043b\u0430 \u043c\u0435\u043d\u044f \u0441\u00a0\u043d\u0435\u0431\u0435\u0441 \u043d\u0430\u00a0\u0437\u0435\u043c\u043b\u044e. \u042f \u0447\u0435\u0441\u0442\u043d\u043e \u043f\u044b\u0442\u0430\u043b\u0441\u044f \u0441\u00a0\u043d\u0430\u0441\u043a\u043e\u043a\u0430 \u0440\u0430\u0441\u043a\u0443\u0441\u0438\u0442\u044c BSP\u2011\u0434\u0435\u0440\u0435\u0432\u044c\u044f <strong>(Binary Space Partitioning)<\/strong>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b <strong>\u0414\u0436\u043e\u043d \u041a\u0430\u0440\u043c\u0430\u043a<\/strong>. \u0427\u0438\u0442\u0430\u043b \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e, \u0441\u043c\u043e\u0442\u0440\u0435\u043b \u0441\u0445\u0435\u043c\u044b, \u043d\u043e\u00a0\u0432\u00a0\u043a\u0430\u043a\u043e\u0439\u2011\u0442\u043e \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u043e\u043d\u044f\u043b: \u041a\u0430\u0440\u043c\u0430\u043a \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0433\u0435\u043d\u0438\u0430\u043b\u0435\u043d, \u0430\u00a0BSP\u2011\u0434\u0435\u0440\u0435\u0432\u044c\u044f \u0434\u043b\u044f\u00a0\u043c\u0435\u043d\u044f\u00a0\u2014 \u044d\u0442\u043e \u043f\u043e\u043a\u0430 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0442\u0435\u043c\u043d\u0430\u044f \u043c\u0430\u0433\u0438\u044f.<\/p>\n<div class=\"floating-image\">\n<figure class=\"float full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/extt\/26\/fb\/65\/26fb65713bf511509de4a543d7a8fbfa.png\" alt=\"Duke Nukem 3D (1996)\" title=\"Duke Nukem 3D (1996)\" width=\"640\" height=\"766\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/extt\/26\/fb\/65\/26fb65713bf511509de4a543d7a8fbfa.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/extt\/26\/fb\/65\/26fb65713bf511509de4a543d7a8fbfa.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>Duke Nukem 3D (1996)<\/figcaption><\/div>\n<\/figure>\n<p>\u041a\u043e\u0433\u0434\u0430 \u044f \u0443\u0436\u0435 \u0433\u043e\u0442\u043e\u0432 \u0431\u044b\u043b \u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0440\u0443\u043a\u0438, \u0432\u044b\u044f\u0441\u043d\u0438\u043b\u043e\u0441\u044c, \u0447\u0442\u043e\u00a0\u044f \u043d\u0435\u00a0\u043e\u0434\u0438\u043d \u0442\u0430\u043a\u043e\u0439. \u041f\u0440\u044f\u043c\u043e \u043f\u043e\u00a0\u0441\u043e\u0441\u0435\u0434\u0441\u0442\u0432\u0443 \u0432\u00a0\u044d\u0442\u043e\u0439 \u043b\u043e\u0434\u043a\u0435 \u043d\u0435\u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0441\u0438\u0434\u0435\u043b \u043b\u0435\u0433\u0435\u043d\u0434\u0430\u0440\u043d\u044b\u0439 <strong>\u041a\u0435\u043d \u0421\u0438\u043b\u044c\u0432\u0435\u0440\u043c\u0430\u043d<\/strong>. \u0412 1993\u00a0\u0433\u043e\u0434\u0443, \u043a\u043e\u0433\u0434\u0430 \u0432\u044b\u0448\u0435\u043b DOOM, \u041a\u0435\u043d \u0442\u043e\u0436\u0435 \u043f\u044b\u0442\u0430\u043b\u0441\u044f \u043f\u043e\u043d\u044f\u0442\u044c, \u043a\u0430\u043a\u00a0\u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 BSP\u2011\u0434\u0435\u0440\u0435\u0432\u044c\u044f. \u041d\u0438\u0447\u0435\u0433\u043e \u043d\u0435\u00a0\u043f\u043e\u043d\u044f\u043b, \u043f\u043b\u044e\u043d\u0443\u043b \u0438 \u0438\u0437\u043e\u0431\u0440\u0435\u043b \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u00a0\u2014 <strong>Portal\u2011based Rendering<\/strong> <em>(\u0441\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u0435 \u0434\u0432\u0438\u0436\u043a\u0438)<\/em>, \u043d\u0430\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043f\u043e\u0437\u0436\u0435 \u0432\u0437\u043b\u0435\u0442\u0435\u043b \u043b\u0435\u0433\u0435\u043d\u0434\u0430\u0440\u043d\u044b\u0439 <strong>Duke Nukem 3D<\/strong>.<\/p>\n<\/div>\n<div class=\"floating-image\">\n<p>\u0412\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043f\u0435\u043a\u0430\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u0443\u044e \u043a\u0430\u0440\u0442\u0443 \u0432\u00a0\u0434\u0435\u0440\u0435\u0432\u043e \u043d\u0430\u00a0\u041f\u041a, \u0441\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u0439 \u0434\u0432\u0438\u0436\u043e\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u0440\u044f\u043c\u043e \u0432\u00a0\u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435. \u041e\u043d \u043f\u0440\u043e\u0435\u0446\u0438\u0440\u0443\u0435\u0442 \u0441\u0442\u0435\u043d\u044b \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0441\u0435\u043a\u0442\u043e\u0440\u0430, \u0430\u00a0\u0435\u0441\u043b\u0438 \u0432\u00a0\u0441\u0442\u0435\u043d\u0435 \u0435\u0441\u0442\u044c \u00ab\u0434\u044b\u0440\u0430\u00bb <em>(\u043f\u043e\u0440\u0442\u0430\u043b)<\/em> \u0432\u00a0\u0441\u043e\u0441\u0435\u0434\u043d\u0438\u0439 \u0441\u0435\u043a\u0442\u043e\u0440\u00a0\u2014 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u0435\u0442 \u0438 \u0435\u0433\u043e. \u0412\u0441\u0451 \u043f\u0440\u043e\u0441\u0442\u043e\u0435\u00a0\u2014 \u0433\u0435\u043d\u0438\u0430\u043b\u044c\u043d\u043e!<\/p>\n<\/div>\n<p>\u0422\u0430\u043a \u0440\u043e\u0434\u0438\u043b\u0441\u044f \u043f\u0440\u043e\u0435\u043a\u0442 <strong>MicroBuild <\/strong>\u2014 \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u0437\u0430\u0441\u0443\u043d\u0443\u0442\u044c \u0441\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u0439 3D\u2011\u0434\u0432\u0438\u0436\u043e\u043a \u0432\u00a0\u0441\u043f\u0438\u0447\u0435\u0447\u043d\u0443\u044e \u043a\u043e\u0440\u043e\u0431\u043a\u0443 \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 AVR. \u041e\u00a0\u0442\u043e\u043c, \u043a\u0430\u043a\u00a0\u044f \u0431\u043e\u0440\u043e\u043b\u0441\u044f \u0437\u0430\u00a0\u043a\u0430\u0436\u0434\u044b\u0439 \u0431\u0430\u0439\u0442 \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u0441\u00a0\u043a\u0430\u043a\u0438\u043c\u0438 \u0433\u0440\u0430\u0431\u043b\u044f\u043c\u0438 \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0441\u044f, \u044f \u0438 \u0445\u043e\u0447\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c.<\/p>\n<p><a class=\"anchor\" name=\"%D0%9A%D1%80%D0%B0%D1%82%D0%BA%D0%BE\" id=\"\u041a\u0440\u0430\u0442\u043a\u043e\"><\/a><\/p>\n<h2>\u041a\u0440\u0430\u0442\u043a\u043e \u043e\u00a0\u0441\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u0445 \u0434\u0432\u0438\u0436\u043a\u0430\u0445<\/h2>\n<p><a class=\"anchor\" name=\"%D0%A1%D0%B5%D0%BA%D1%82%D0%BE%D1%80\" id=\"\u0421\u0435\u043a\u0442\u043e\u0440\"><\/a><\/p>\n<h3>\u0421\u0435\u043a\u0442\u043e\u0440, \u0441\u0442\u0435\u043d\u0430 \u0438 \u043c\u0430\u0433\u0438\u044f \u043f\u043e\u0440\u0442\u0430\u043b\u043e\u0432<\/h3>\n<p>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u043b\u044e\u0431\u043e\u0433\u043e \u0441\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u0434\u0432\u0438\u0436\u043a\u0430 \u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u043d\u0430\u00a0\u0442\u0440\u0435\u0445 \u043a\u0438\u0442\u0430\u0445: \u0441\u0435\u043a\u0442\u043e\u0440\u0430\u0445, \u0441\u0442\u0435\u043d\u0430\u0445 \u0438 \u043f\u043e\u0440\u0442\u0430\u043b\u0430\u0445. \u0412\u00a0\u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442\u00a0\u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0434\u0432\u0438\u0436\u043a\u043e\u0432, \u0437\u0434\u0435\u0441\u044c \u043c\u0438\u0440 \u043d\u0435\u00a0\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0435\u0434\u0438\u043d\u043e\u0439 3D\u2011\u0441\u0435\u0442\u043a\u043e\u0439. \u041a\u0430\u0440\u0442\u0430 \u0436\u0435\u0441\u0442\u043a\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0430 \u043d\u0430\u00a0\u0434\u0432\u0430 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0434\u0430\u043d\u043d\u044b\u0445: \u0441\u0442\u0435\u043d\u044b \u0438 \u0441\u0435\u043a\u0442\u043e\u0440\u0430.<\/p>\n<p>\u0412\u00a0\u043a\u043e\u0434\u0435 <strong>MicroBuild <\/strong>\u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043b\u0430\u043a\u043e\u043d\u0438\u0447\u043d\u043e:<\/p>\n<pre><code class=\"cpp\">static FWall GWalls[] = { ... };static FSector GSectors[] = { ... };<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper\"><\/span><\/a><\/div><\/pre>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u0430\u043d\u0430\u0442\u043e\u043c\u0438\u044e \u044d\u0442\u0438\u0445 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439.<\/p>\n<p><strong>\u0421\u0442\u0435\u043d\u044b (FWall)<\/strong><\/p>\n<p>\u0412\u00a0\u0441\u0430\u043c\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u043c \u0432\u0438\u0434\u0435 \u0441\u0442\u0435\u043d\u0430\u00a0\u2014 \u044d\u0442\u043e \u043e\u0442\u0440\u0435\u0437\u043e\u043a \u043d\u0430\u00a0\u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438, \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0439 \u0434\u0432\u0443\u043c\u044f \u0442\u043e\u0447\u043a\u0430\u043c\u0438, \u0438 \u0435\u0451 \u0446\u0432\u0435\u0442 (\u0438\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b). \u041e\u0434\u043d\u0430\u043a\u043e \u0432\u00a0\u043f\u043e\u0440\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0434\u0432\u0438\u0436\u043a\u0430\u0445 \u0441\u0442\u0435\u043d\u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u00ab\u043e\u043a\u043d\u043e\u043c\u00bb \u0432\u00a0\u0441\u043e\u0441\u0435\u0434\u043d\u044e\u044e \u043a\u043e\u043c\u043d\u0430\u0442\u0443. \u0414\u043b\u044f\u00a0\u044d\u0442\u043e\u0433\u043e \u0432\u00a0\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0432\u0432\u043e\u0434\u044f\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043f\u043e\u0440\u0442\u0430\u043b\u0430:<\/p>\n<pre><code class=\"cpp\">struct FWall{    FIntVector2D Point1, Point2; \/\/ \u041a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043d\u0430\u0447\u0430\u043b\u0430 \u0438 \u043a\u043e\u043d\u0446\u0430 \u0441\u0442\u0435\u043d\u044b (2D)    uint8 WallPaletteIndex;      \/\/ \u0418\u043d\u0434\u0435\u043a\u0441 \u0446\u0432\u0435\u0442\u0430 \u0441\u0442\u0435\u043d\u044b \u0432 \u043f\u0430\u043b\u0438\u0442\u0440\u0435    int8 PortalNextSector;       \/\/ \u041d\u043e\u043c\u0435\u0440 \u0441\u0435\u043a\u0442\u043e\u0440\u0430 \u0437\u0430 \u044d\u0442\u043e\u0439 \u0441\u0442\u0435\u043d\u043e\u0439 (-1, \u0435\u0441\u043b\u0438 \u0441\u0442\u0435\u043d\u0430 \u0433\u043b\u0443\u0445\u0430\u044f)    int8 PortalNextWall;         \/\/ \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0435\u043d\u044b \u0432 \u0441\u043e\u0441\u0435\u0434\u043d\u0435\u043c \u0441\u0435\u043a\u0442\u043e\u0440\u0435    FAngle PortalAngleDelta;     \/\/ \u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0443\u0433\u043b\u0430 \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0435 (\u0434\u043b\u044f \u043d\u0435\u0435\u0432\u043a\u043b\u0438\u0434\u043e\u0432\u043e\u0439 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438)};<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p><strong>\u0421\u0435\u043a\u0442\u043e\u0440\u0430 (FSector)<\/strong><\/p>\n<p>\u0421\u0435\u043a\u0442\u043e\u0440\u00a0\u2014 \u044d\u0442\u043e \u0432\u044b\u043f\u0443\u043a\u043b\u044b\u0439 \u043c\u043d\u043e\u0433\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u0443\u044e \u043a\u043e\u043c\u043d\u0430\u0442\u0443. \u041e\u043d \u043d\u0435\u00a0\u0445\u0440\u0430\u043d\u0438\u0442 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0441\u0430\u043c \u043f\u043e\u00a0\u0441\u0435\u0431\u0435. \u0412\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u043e\u043d \u0437\u043d\u0430\u0435\u0442 \u0432\u044b\u0441\u043e\u0442\u0443 \u0441\u0432\u043e\u0435\u0433\u043e \u043f\u043e\u043b\u0430, \u043f\u043e\u0442\u043e\u043b\u043a\u0430 \u0438 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u00ab\u0441\u0440\u0435\u0437\u00bb \u0432\u00a0\u043e\u0431\u0449\u0435\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0435 \u0441\u0442\u0435\u043d, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0435\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0430\u044e\u0442:<\/p>\n<pre><code class=\"cpp\">struct FSector{    int8 FloorZ;             \/\/ \u0412\u044b\u0441\u043e\u0442\u0430 \u043f\u043e\u043b\u0430    int8 CeilZ;              \/\/ \u0412\u044b\u0441\u043e\u0442\u0430 \u043f\u043e\u0442\u043e\u043b\u043a\u0430    uint8 WallStartIndex;    \/\/ \u0418\u043d\u0434\u0435\u043a\u0441 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0435\u043d\u044b \u0441\u0435\u043a\u0442\u043e\u0440\u0430 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 GWalls    uint8 WallCount;         \/\/ \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0435\u043d \u0443 \u044d\u0442\u043e\u0433\u043e \u0441\u0435\u043a\u0442\u043e\u0440\u0430    uint8 CeilPaletteIndex;  \/\/ \u0426\u0432\u0435\u0442 \u043f\u043e\u0442\u043e\u043b\u043a\u0430 \u043f\u043e \u043f\u0430\u043b\u0438\u0442\u0440\u0435    uint8 FloorPaletteIndex; \/\/ \u0426\u0432\u0435\u0442 \u043f\u043e\u043b\u0430 \u043f\u043e \u043f\u0430\u043b\u0438\u0442\u0440\u0435};<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0442\u0430\u043a\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435, \u043e\u0431\u0445\u043e\u0434 \u043a\u0430\u0440\u0442\u044b \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u0431\u044b\u0441\u0442\u0440\u044b\u043c: \u043c\u044b \u0437\u043d\u0430\u0435\u043c, \u0432\u00a0\u043a\u0430\u043a\u043e\u043c \u0441\u0435\u043a\u0442\u043e\u0440\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0438\u0433\u0440\u043e\u043a, \u0431\u0435\u0440\u0435\u043c \u0435\u0433\u043e \u0441\u0442\u0435\u043d\u044b, \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u0435\u043c \u0438\u0445, \u0430\u00a0\u0435\u0441\u043b\u0438 \u043d\u0430\u0442\u044b\u043a\u0430\u0435\u043c\u0441\u044f \u043d\u0430\u00a0\u0441\u0442\u0435\u043d\u0443, \u0433\u0434\u0435\u00a0<code>PortalNextSector != -1<\/code>, \u0442\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a\u00a0\u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0441\u0435\u043a\u0442\u043e\u0440\u0430.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/extt\/1a\/48\/84\/1a48845634216d5b354983697acec271.png\" alt=\"\u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u0430\u0440\u0442\u044b ThreeMaps.h: 13 \u0441\u0442\u0435\u043d \u0438 3 \u0441\u0435\u043a\u0442\u043e\u0440\u0430\" title=\"\u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u0430\u0440\u0442\u044b ThreeMaps.h: 13 \u0441\u0442\u0435\u043d \u0438 3 \u0441\u0435\u043a\u0442\u043e\u0440\u0430\" width=\"1026\" height=\"800\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/extt\/1a\/48\/84\/1a48845634216d5b354983697acec271.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/extt\/1a\/48\/84\/1a48845634216d5b354983697acec271.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u0430\u0440\u0442\u044b ThreeMaps.h: 13\u00a0\u0441\u0442\u0435\u043d \u0438 3\u00a0\u0441\u0435\u043a\u0442\u043e\u0440\u0430<\/figcaption><\/div>\n<\/figure>\n<p><a class=\"anchor\" name=\"%D0%9A%D0%B0%D0%BA\" id=\"\u041a\u0430\u043a\"><\/a><\/p>\n<h3>\u041a\u0430\u043a 2D\u2011\u043a\u0430\u0440\u0442\u0430 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 3D\u2011\u043c\u0438\u0440<\/h3>\n<div class=\"floating-image\">\n<p>\u0412\u0441\u044f \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044f \u043f\u0441\u0435\u0432\u0434\u043e-3D \u0434\u0432\u0438\u0436\u043a\u043e\u0432 \u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u043d\u0430\u00a0\u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0435 \u0443\u0440\u043e\u0432\u043d\u044f \u0448\u043a\u043e\u043b\u044c\u043d\u043e\u0439 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438. \u041d\u0438\u043a\u0430\u043a\u0438\u0445 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0447\u0435\u0442\u044b\u0440\u0435\u0445\u043c\u0435\u0440\u043d\u044b\u0445 \u043a\u0432\u0430\u0442\u0435\u0440\u043d\u0438\u043e\u043d\u043e\u0432\u00a0\u2014 \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430 \u0438 \u0437\u0430\u043a\u043e\u043d \u043f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u044b.<\/p>\n<\/div>\n<p>\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u0434\u0432\u0443\u0445 \u0442\u043e\u0447\u0435\u043a \u0441\u0442\u0435\u043d\u044b \u0438\u0437\u00a0\u043f\u043b\u043e\u0441\u043a\u043e\u0439 \u043a\u0430\u0440\u0442\u044b \u0432\u00a0\u0442\u0440\u0435\u0445\u043c\u0435\u0440\u043d\u0443\u044e \u043a\u043e\u043b\u043e\u043d\u043d\u0443 \u043d\u0430\u00a0\u044d\u043a\u0440\u0430\u043d\u0435 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437\u00a0\u0447\u0435\u0442\u044b\u0440\u0435\u0445 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0448\u0430\u0433\u043e\u0432.<\/p>\n<p><strong>\u0428\u0430\u0433 1. \u041f\u0435\u0440\u0435\u043d\u043e\u0441 \u0432\u00a0\u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0438 \u043f\u043e\u0432\u043e\u0440\u043e\u0442<\/strong><\/p>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u044b \u0431\u0435\u0440\u0435\u043c \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0441\u0442\u0435\u043d\u044b \u0438 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u043c \u0438\u0445 \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0438\u0433\u0440\u043e\u043a \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u0432\u00a0\u0446\u0435\u043d\u0442\u0440\u0435 \u0432\u0441\u0435\u043b\u0435\u043d\u043d\u043e\u0439 (\u0432 \u0442\u043e\u0447\u043a\u0435 0, 0).<\/p>\n<pre><code class=\"cpp\">\/\/ \u041f\u0435\u0440\u0435\u043d\u043e\u0441 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043a\u0430\u043c\u0435\u0440\u044bconst FVector2D D1 = Wall.Point1 - InCameraLocation;const FVector2D D2 = Wall.Point2 - InCameraLocation;\/\/ \u041e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043f\u043e\u0432\u043e\u0440\u043e\u0442, \u0447\u0442\u043e\u0431\u044b \u0441\u0442\u0435\u043d\u0430 \u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c \u043b\u0438\u0446\u043e\u043c \u043a \u0438\u0433\u0440\u043e\u043a\u0443FVector2D T1 = FVector2D(D1.X * CosA + D1.Y * SinA, D1.Y * CosA - D1.X * SinA);FVector2D T2 = FVector2D(D2.X * CosA + D2.Y * SinA, D2.Y * CosA - D2.X * SinA);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0432\u00a0\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u0445 T1\u00a0\u0438 T2\u00a0\u043e\u0441\u044c X \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430\u00a0\u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0432\u043b\u0435\u0432\u043e\u2011\u0432\u043f\u0440\u0430\u0432\u043e \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u0437\u0433\u043b\u044f\u0434\u0430 \u0438\u0433\u0440\u043e\u043a\u0430, \u0430\u00a0Y\u00a0\u2014 \u0437\u0430\u00a0\u0433\u043b\u0443\u0431\u0438\u043d\u0443 (\u0432\u043f\u0435\u0440\u0435\u0434\u2011\u043d\u0430\u0437\u0430\u0434). \u0417\u0434\u0435\u0441\u044c\u00a0\u0436\u0435 \u0440\u043e\u0436\u0434\u0430\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0432\u0430\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f: \u0435\u0441\u043b\u0438 Y \u043e\u0431\u0435\u0438\u0445 \u0442\u043e\u0447\u0435\u043a \u043c\u0435\u043d\u044c\u0448\u0435 \u043d\u0443\u043b\u044f, \u0442\u043e \u0441\u0442\u0435\u043d\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0437\u0430\u00a0\u0441\u043f\u0438\u043d\u043e\u0439. \u041c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0435\u0451 \u0447\u0435\u0440\u0435\u0437\u00a0<code>continue<\/code>.<\/p>\n<p><strong>\u0428\u0430\u0433 2. \u0411\u043b\u0438\u0436\u043d\u0438\u0439 \u043a\u043b\u0438\u043f\u043f\u0438\u043d\u0433 (Near Clipping)<\/strong><\/p>\n<p>\u0415\u0441\u043b\u0438 \u0438\u0433\u0440\u043e\u043a \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u043a\u00a0\u0441\u0442\u0435\u043d\u0435 \u0432\u043f\u043b\u043e\u0442\u043d\u0443\u044e \u0438\u043b\u0438\u00a0\u0432\u0441\u0442\u0430\u0435\u0442 \u0432\u0434\u043e\u043b\u044c \u043d\u0435\u0435, \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430 Y \u043e\u0434\u043d\u043e\u0439 \u0438\u0437\u00a0\u0442\u043e\u0447\u0435\u043a \u0441\u0442\u0440\u0435\u043c\u0438\u0442\u0441\u044f \u043a\u00a0\u043d\u0443\u043b\u044e. \u041f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043d\u0430\u00a0\u043d\u043e\u043b\u044c \u0441\u043b\u043e\u043c\u0430\u0435\u0442 <strong>fixed\u2011point<\/strong> \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0443 \u0438 \u0443\u0432\u0435\u0434\u0435\u0442 \u0440\u0430\u0441\u0447\u0435\u0442\u044b \u0432\u00a0\u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0441\u0442\u044c.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u044d\u0442\u043e\u0433\u043e \u043d\u0435\u00a0\u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u043b\u043e, \u043c\u044b \u043e\u0442\u0441\u0435\u043a\u0430\u0435\u043c \u0441\u0442\u0435\u043d\u0443 \u043f\u043e\u00a0\u0431\u043b\u0438\u0436\u043d\u0435\u0439 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 <em>(NearZ)<\/em>. \u0415\u0441\u043b\u0438 \u0442\u043e\u0447\u043a\u0430 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u0435\u0442 \u044d\u0442\u0443 \u043d\u0435\u0432\u0438\u0434\u0438\u043c\u0443\u044e \u043b\u0438\u043d\u0438\u044e, \u043c\u044b \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e \u043f\u0435\u0440\u0435\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u0435\u0451 X \u0438 Y \u043d\u0430\u00a0\u0433\u0440\u0430\u043d\u0438\u0446\u0435 \u043e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"cpp\">constexpr FFixedFloat NearZ = FFixedFloat::ZeroPointFive;if(T1.Y &lt;= NearZ) {     if(T2.Y == T1.Y) continue;     T1.X = T1.X + (T2.X - T1.X) * (NearZ - T1.Y) \/ (T2.Y - T1.Y);     T1.Y = NearZ; }if(T2.Y &lt;= NearZ) {     if(T2.Y == T1.Y) continue;     T2.X = T2.X + (T1.X - T2.X) * (NearZ - T2.Y) \/ (T1.Y - T2.Y);     T2.Y = NearZ; }<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p><strong>\u0428\u0430\u0433 3. \u041f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u043d\u0430\u044f \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u044f<\/strong><\/p>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0437\u0430\u043a\u043e\u043d \u043f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u044b: \u0447\u0435\u043c \u0434\u0430\u043b\u044c\u0448\u0435 \u043e\u0431\u044a\u0435\u043a\u0442 (\u0431\u043e\u043b\u044c\u0448\u0435 Y), \u0442\u0435\u043c \u043c\u0435\u043d\u044c\u0448\u0435 \u043e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043d\u0430\u00a0\u044d\u043a\u0440\u0430\u043d\u0435. \u041c\u044b \u0434\u0435\u043b\u0438\u043c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043d\u0430\u00a0\u0433\u043b\u0443\u0431\u0438\u043d\u0443 Y \u0438 \u043f\u0440\u043e\u0435\u0446\u0438\u0440\u0443\u0435\u043c \u0438\u0445 \u043d\u0430\u00a0\u044d\u043a\u0440\u0430\u043d:<\/p>\n<pre><code class=\"cpp\">\/\/ \u041f\u0440\u043e\u0435\u043a\u0446\u0438\u044f \u043f\u043e \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u0438 (X-\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u044d\u043a\u0440\u0430\u043d\u0430)const int16 X1 = WINDOW_HALF_WIDTH + (T1.X * FovDistance \/ T1.Y).ToInt();const int16 X2 = WINDOW_HALF_WIDTH + (T2.X * FovDistance \/ T2.Y).ToInt();if (X1 &gt;= X2) continue; \/\/ \u041e\u0442\u0441\u0435\u043a\u0430\u0435\u043c \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044b\u0435 \u0441\u043f\u0438\u043d\u043e\u0439 \u0441\u0442\u0435\u043d\u044b\/\/ \u041f\u0440\u043e\u0435\u043a\u0446\u0438\u044f \u043f\u043e \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u0438 (\u0432\u044b\u0441\u043e\u0442\u0430 \u043f\u043e\u043b\u0430 \u0438 \u043f\u043e\u0442\u043e\u043b\u043a\u0430)const int16 Ceil1  = WINDOW_HALF_HEIGHT - (FFixedFloat(Sector.CeilZ  - FPlayer::LocationZ) * FovDistance \/ T1.Y).ToInt();const int16 Floor1 = WINDOW_HALF_HEIGHT - (FFixedFloat(Sector.FloorZ - FPlayer::LocationZ) * FovDistance \/ T1.Y).ToInt();const int16 Ceil2  = WINDOW_HALF_HEIGHT - (FFixedFloat(Sector.CeilZ  - FPlayer::LocationZ) * FovDistance \/ T2.Y).ToInt();const int16 Floor2 = WINDOW_HALF_HEIGHT - (FFixedFloat(Sector.FloorZ - FPlayer::LocationZ) * FovDistance \/ T2.Y).ToInt();<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0442\u043e\u043b\u043e\u043a \u0438 \u043f\u043e\u043b \u0441\u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e, \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u00a0Z: \u0434\u043b\u044f\u00a0\u043f\u043e\u0442\u043e\u043b\u043a\u0430 \u0431\u0435\u0440\u0435\u043c\u00a0<code>CeilZ<\/code>, \u0434\u043b\u044f\u00a0\u043f\u043e\u043b\u0430\u00a0\u2014\u00a0<code>FloorZ<\/code>.<\/p>\n<p><strong>\u0428\u0430\u0433 4. \u0420\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u043f\u043e\u043b\u043e\u0441\u0430\u043c\u0438<\/strong><\/p>\n<p>\u0412\u0441\u0451, \u0447\u0442\u043e\u00a0\u043d\u0430\u043c \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c\u00a0\u2014 \u043f\u0440\u043e\u0439\u0442\u0438 \u0446\u0438\u043a\u043b\u043e\u043c \u043e\u0442\u00a0\u043b\u0435\u0432\u043e\u0439 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0441\u0442\u0435\u043d\u044b X1\u00a0\u0434\u043e\u00a0\u043f\u0440\u0430\u0432\u043e\u0439 X2. \u041c\u044b \u043b\u0438\u043d\u0435\u0439\u043d\u043e \u0438\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u0438\u0440\u0443\u0435\u043c (Lerp) \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432\u044b\u0441\u043e\u0442\u044b \u043f\u043e\u043b\u0430 \u0438 \u043f\u043e\u0442\u043e\u043b\u043a\u0430 \u043c\u0435\u0436\u0434\u0443 \u043f\u0435\u0440\u0432\u043e\u0439 \u0438 \u0432\u0442\u043e\u0440\u043e\u0439 \u0442\u043e\u0447\u043a\u043e\u0439 \u0438 \u0440\u0438\u0441\u0443\u0435\u043c \u0441\u0442\u0435\u043d\u0443 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u043b\u0438\u043d\u0438\u044f\u043c\u0438 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439, \u043a\u0430\u043a\u00a0\u0432\u00a0\u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u043c <strong>Wolfenstein 3D<\/strong> \u0434\u0432\u0438\u0436\u043a\u0435.<\/p>\n<pre><code class=\"cpp\">if (Wall.PortalNextSector == -1) \/\/ \u0415\u0441\u043b\u0438 \u0441\u0442\u0435\u043d\u0430 \u0433\u043b\u0443\u0445\u0430\u044f{    for (int16 X = StartX; X &lt;= EndX; ++X)    {        const FFixedFloat Delta = FFixedFloat(X - X1) \/ FFixedFloat(X2 - X1);        const int16 Ceil  = FMath::Lerp(Ceil1 , Ceil2 , Delta);        const int16 Floor = FMath::Lerp(Floor1, Floor2, Delta);        \/\/ \u0420\u0438\u0441\u0443\u0435\u043c \u043a\u043e\u043d\u0442\u0443\u0440 \u0434\u043b\u044f \u043a\u0440\u0430\u0441\u043e\u0442\u044b, \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0446\u0432\u0435\u0442\u043e\u043c \u0438\u0437 \u043f\u0430\u043b\u0438\u0442\u0440\u044b        const FColor WallColor = (X == X1 || X == X2) ? FColor(0, 0, 0) : GPalette[Wall.WallPaletteIndex];        DrawWall(X, Ceil, Floor, WallColor);        \/\/ \u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u043a\u043b\u0438\u043f\u043f\u0438\u043d\u0433\u0430 \u0434\u043b\u044f \u043f\u043e\u0440\u0442\u0430\u043b\u043e\u0432        ClipTop[X]    = FMath::Clamp&lt;int16&gt;(Ceil , ClipTop[X], ClipBottom[X]);        ClipBottom[X] = FMath::Clamp&lt;int16&gt;(Floor, ClipTop[X], ClipBottom[X]);    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p><a class=\"anchor\" name=\"%D0%9F%D0%B8%D1%88%D0%B5%D0%BC\" id=\"\u041f\u0438\u0448\u0435\u043c\"><\/a><\/p>\n<h2>\u041f\u0438\u0448\u0435\u043c MicroBuild \u043d\u0430\u00a0\u0441\u043f\u0438\u0447\u0435\u0447\u043d\u043e\u043c \u043a\u043e\u0440\u043e\u0431\u043a\u0435<\/h2>\n<p>\u041f\u0435\u0440\u0435\u043d\u043e\u0441 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0438 \u043d\u0430\u00a0\u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0435 \u0436\u0435\u043b\u0435\u0437\u043e\u00a0\u2014 \u0441\u0430\u043c\u0430\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430\u044f \u0438 \u0441\u043b\u043e\u0436\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u0432 AVR \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u043e\u0441\u043c\u044b\u0441\u043b\u0438\u0442\u044c \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u043a\u0430\u0436\u0434\u0443\u044e \u0441\u0442\u0440\u043e\u0447\u043a\u0443 \u043a\u043e\u0434\u0430. \u041d\u043e\u00a0\u043e\u0431\u043e\u00a0\u0432\u0441\u0435\u043c \u043f\u043e\u00a0\u043f\u043e\u0440\u044f\u0434\u043a\u0443.<\/p>\n<p><a class=\"anchor\" name=\"%D0%9F%D1%80%D0%BE%D1%82%D0%BE%D1%82%D0%B8%D0%BF\" id=\"\u041f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\"><\/a><\/p>\n<h3>\u041f\u0440\u043e\u0442\u043e\u0442\u0438\u043f \u043d\u0430\u00a0SDL2\u00a0\u0438 \u0432\u043e\u0439\u043d\u0430 \u0441\u00a0\u0442\u0438\u043f\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445<\/h3>\n<p>\u0420\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0438 \u043e\u0442\u043b\u0430\u0436\u0438\u0432\u0430\u0442\u044c 3D\u2011\u0434\u0432\u0438\u0436\u043e\u043a \u0441\u0440\u0430\u0437\u0443 \u043d\u0430\u00a0\u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0435\u00a0\u2014 \u0437\u0430\u0442\u0435\u044f \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0448\u043d\u0430\u044f. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0435\u0440\u0432\u044b\u0439 \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f \u044f \u0441\u043e\u0431\u0440\u0430\u043b \u043d\u0430\u00a0\u041f\u041a \u0441\u00a0\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 SDL2. \u0411\u0430\u0437\u043e\u0432\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u0440\u0435\u043d\u0434\u0435\u0440\u0430 \u0437\u0430\u043d\u044f\u043b\u0430 \u043e\u0442\u00a0\u0441\u0438\u043b\u044b 100\u00a0\u0441\u0442\u0440\u043e\u043a \u043a\u043e\u0434\u0430.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/extt\/ec\/5d\/c8\/ec5dc80e154a28c1df752efd235d0d6b.png\" alt=\"\u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043a\u0441\u0442\u0430\u0442\u0438 \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430\u0437\u044b\u0432\u0430\u043b\u0441\u044f &quot;Cool 3D&quot; :D\" title=\"\u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043a\u0441\u0442\u0430\u0442\u0438 \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430\u0437\u044b\u0432\u0430\u043b\u0441\u044f &quot;Cool 3D&quot; :D\" width=\"1442\" height=\"1184\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/extt\/ec\/5d\/c8\/ec5dc80e154a28c1df752efd235d0d6b.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/extt\/ec\/5d\/c8\/ec5dc80e154a28c1df752efd235d0d6b.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043a\u0441\u0442\u0430\u0442\u0438 \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430\u0437\u044b\u0432\u0430\u043b\u0441\u044f \u00abCool 3D\u00bb:D<\/figcaption><\/div>\n<\/figure>\n<p>\u0417\u0430\u0442\u0435\u043c \u044f \u0438\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0437\u0430\u0433\u043d\u0430\u043b \u041f\u041a\u2011\u0432\u0435\u0440\u0441\u0438\u044e \u0432\u00a0\u0440\u0430\u043c\u043a\u0438 \u0431\u0443\u0434\u0443\u0449\u0435\u0433\u043e \u0436\u0435\u043b\u0435\u0437\u0430: \u0432\u044b\u0441\u0442\u0430\u0432\u0438\u043b \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u044d\u043a\u0440\u0430\u043d\u0430 160\u00d7128\u00a0\u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 <em>(\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442 \u0434\u043b\u044f\u00a0\u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0446\u0432\u0435\u0442\u043d\u044b\u0445 \u0434\u0438\u0441\u043f\u043b\u0435\u0435\u0432 \u043f\u043e\u0434\u00a0Arduino \u043f\u043e\u00a0\u0442\u0438\u043f\u0443 ST7735)<\/em> \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u00a0<code>WINDOW_SCALE<\/code>, \u0447\u0442\u043e\u0431\u044b \u043d\u0435\u00a0\u043b\u043e\u043c\u0430\u0442\u044c \u0433\u043b\u0430\u0437\u0430 \u043d\u0430\u00a0\u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u043c \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0435.<\/p>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0448\u0430\u0433\u043e\u043c \u0441\u0442\u0430\u043b\u0430 \u0437\u0430\u043c\u0435\u043d\u0430 \u00ab\u0442\u044f\u0436\u0435\u043b\u044b\u0445\u00bb \u0434\u043b\u044f 8-\u0431\u0438\u0442\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 (<code>int32_t<\/code>,\u00a0<code>int64_t<\/code>) \u043d\u0430\u00a0\u043b\u0435\u0433\u043a\u043e\u0432\u0435\u0441\u043d\u044b\u0435\u00a0<code>int8_t<\/code>\u00a0\u0438\u00a0<code>int16_t<\/code>. \u0418 \u0437\u0434\u0435\u0441\u044c \u043c\u0435\u043d\u044f \u0436\u0434\u0430\u043b \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u044b\u0439 \u0431\u0430\u0433, \u043d\u0430\u00a0\u043f\u043e\u0438\u0441\u043a \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0443\u0448\u043b\u043e \u043f\u043e\u043b\u0442\u043e\u0440\u0430 \u0434\u043d\u044f.<\/p>\n<p>\u0412\u044b\u044f\u0441\u043d\u0438\u043b\u043e\u0441\u044c, \u0447\u0442\u043e\u00a0\u043f\u0440\u0438\u00a0\u0440\u0430\u0441\u0447\u0435\u0442\u0435 \u043f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0444\u043e\u0440\u043c\u0443\u043b \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0433\u0440\u043e\u043c\u043d\u044b\u043c\u0438. \u0414\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430 \u043f\u0438\u043a\u0441\u0435\u043b\u044f \u043d\u0430\u00a0\u044d\u043a\u0440\u0430\u043d\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e \u0443\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u00a0\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043e\u0442 0\u00a0\u0434\u043e 128, \u0432\u00a0\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0438 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f \u0447\u0438\u0441\u0435\u043b \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0436\u0435\u0441\u0442\u043a\u043e\u0435 \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430. \u0412\u00a0\u0438\u0442\u043e\u0433\u0435 \u043f\u043e\u0441\u043b\u0435 \u0434\u043e\u043b\u0433\u0438\u0445 \u043f\u043e\u0438\u0441\u043a\u043e\u0432 \u043f\u0440\u0438\u0447\u0438\u043d \u00ab\u0441\u043b\u043e\u043c\u0430\u043d\u043d\u044b\u0445\u00bb \u0438 \u0443\u043b\u0435\u0442\u0430\u044e\u0449\u0438\u0445 \u0432\u00a0\u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0441\u0442\u044c \u0441\u0442\u0435\u043d \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u044b\u043b\u043e \u043d\u0430\u0439\u0434\u0435\u043d\u043e: \u0432\u0441\u0435 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0435 \u044d\u043a\u0440\u0430\u043d\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b (\u043f\u043e\u043b \u0438 \u043f\u043e\u0442\u043e\u043b\u043e\u043a) \u043e\u0431\u044f\u0437\u0430\u043d\u044b \u0441\u0447\u0438\u0442\u0430\u0442\u044c\u0441\u044f \u0441\u0442\u0440\u043e\u0433\u043e \u0432\u00a0<code>int32<\/code>, \u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0435\u0440\u0435\u0434 \u0441\u0430\u043c\u044b\u043c \u0432\u044b\u0432\u043e\u0434\u043e\u043c \u043d\u0430\u00a0\u044d\u043a\u0440\u0430\u043d \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e \u0443\u0440\u0435\u0437\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437\u00a0<code>Clamp<\/code>\u00a0\u0434\u043e\u00a0\u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432 \u0434\u0438\u0441\u043f\u043b\u0435\u044f.<\/p>\n<p><a class=\"anchor\" name=\"Fixed\" id=\"Fixed\"><\/a><\/p>\n<h3>Fixed\u2011Point \u0430\u0440\u0438\u0444\u043c\u0435\u0442\u0438\u043a\u0430<\/h3>\n<p>\u041d\u0430\u00a0\u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435 AVR \u043d\u0435\u0442 \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0441\u043e\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 (FPU). \u041b\u044e\u0431\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0441\u00a0\u0442\u0438\u043f\u043e\u043c\u00a0<code>float<\/code>\u00a0\u044d\u043c\u0443\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e. \u041d\u0430 8-\u0431\u0438\u0442\u043d\u043e\u043c \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0435 \u0431\u0430\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438\u043b\u0438\u00a0\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0434\u0432\u0443\u0445 \u0447\u0438\u0441\u0435\u043b \u0441\u00a0\u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u0442\u043e\u0447\u043a\u043e\u0439 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432\u00a0\u0442\u044f\u0436\u0435\u043b\u043e\u0432\u0435\u0441\u043d\u044b\u0439 \u0442\u0430\u043d\u0435\u0446 \u043d\u0430\u00a0\u0441\u043e\u0442\u043d\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043d\u044b\u0445 \u0442\u0430\u043a\u0442\u043e\u0432. \u0412\u00a0\u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430 3D\u2011\u0441\u0446\u0435\u043d\u044b \u0432\u00a0\u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u044d\u0442\u043e \u043d\u0435\u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0440\u043e\u0441\u043a\u043e\u0448\u044c.<\/p>\n<p>\u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u044f \u043f\u043e\u0434\u0433\u043b\u044f\u0434\u0435\u043b \u0443 <strong>\u0414\u0436\u043e\u043d\u0430 \u041a\u0430\u0440\u043c\u0430\u043a\u0430<\/strong> \u0432\u00a0\u043a\u043e\u0434\u0435 DOOM\u00a0\u2014 \u044d\u0442\u043e <strong>Fixed\u2011Point \u0430\u0440\u0438\u0444\u043c\u0435\u0442\u0438\u043a\u0430<\/strong><em> (\u0447\u0438\u0441\u043b\u0430 \u0441\u00a0\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0437\u0430\u043f\u044f\u0442\u043e\u0439)<\/em>. \u042f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441\u00a0<code>FFixedFloat<\/code>\u00a0\u043d\u0430\u00a0C++, \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0437\u0438\u0432 \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f\u00a0\u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430.<\/p>\n<p>\u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430\u00a0\u043d\u043e\u0432\u0443\u044e \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0443 \u0434\u0435\u043b\u0430\u043b\u0441\u044f \u043f\u043b\u0430\u0432\u043d\u043e: \u044f \u0448\u0430\u0433 \u0437\u0430\u00a0\u0448\u0430\u0433\u043e\u043c \u0437\u0430\u043c\u0435\u043d\u044f\u043b\u00a0<code>float<\/code>\u00a0\u043d\u0430\u00a0<code>FFixedFloat<\/code>, \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044f \u043d\u0430\u00a0\u043a\u043e\u043d\u0446\u0430\u0445 \u0444\u043e\u0440\u043c\u0443\u043b \u043c\u0435\u0442\u043e\u0434\u00a0<code>.ToFloat()<\/code>, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0440\u0435\u043d\u0434\u0435\u0440\u0430.<\/p>\n<p>\u0421\u0430\u043c\u0430 \u0441\u0443\u0442\u044c Fixed\u2011Point \u0430\u0440\u0438\u0444\u043c\u0435\u0442\u0438\u043a\u0438 \u043f\u0440\u043e\u0441\u0442\u0430. \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435, \u0447\u0442\u043e\u00a0\u0432\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0431\u044e\u0434\u0436\u0435\u0442. \u0412\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0440\u043e\u0431\u043d\u044b\u043c\u0438 \u0440\u0443\u0431\u043b\u044f\u043c\u0438 (1.12\u00a0\u20bd), \u0432\u044b \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442\u0435 \u0432\u0441\u0451 \u0432\u00a0\u0446\u0435\u043b\u044b\u0435 \u043a\u043e\u043f\u0435\u0439\u043a\u0438 (112\u00a0\u043a\u043e\u043f.). \u0412\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442\u0435 \u0441\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c\u0438 \u0431\u044b\u0441\u0442\u0440\u044b\u043c\u0438 \u0446\u0435\u043b\u044b\u043c\u0438 \u0447\u0438\u0441\u043b\u0430\u043c\u0438, \u043d\u043e\u00a0\u043c\u044b\u0441\u043b\u0435\u043d\u043d\u043e \u043f\u043e\u043c\u043d\u0438\u0442\u0435, \u0447\u0442\u043e\u00a0\u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u0434\u0432\u0430 \u0437\u043d\u0430\u043a\u0430\u00a0\u2014 \u044d\u0442\u043e \u0434\u0440\u043e\u0431\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c.<\/p>\n<p>\u0412 <strong>MicroBuild <\/strong>\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0444\u043e\u0440\u043c\u0430\u0442 <strong>Q16.16<\/strong> \u043d\u0430\u00a0\u0431\u0430\u0437\u0435 \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e\u00a0<code>int32_t<\/code>:<\/p>\n<ul>\n<li>\n<p>16\u00a0\u0431\u0438\u0442 \u043e\u0442\u0432\u0435\u0434\u0435\u043d\u043e \u043f\u043e\u0434\u00a0\u0446\u0435\u043b\u0443\u044e \u0447\u0430\u0441\u0442\u044c.<\/p>\n<\/li>\n<li>\n<p>16\u00a0\u0431\u0438\u0442\u00a0\u2014 \u043f\u043e\u0434\u00a0\u0434\u0440\u043e\u0431\u043d\u0443\u044e \u0447\u0430\u0441\u0442\u044c.<\/p>\n<\/li>\n<\/ul>\n<p>\u0412\u00a0\u0442\u0430\u043a\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0435\u0434\u0438\u043d\u0438\u0446\u0430 <em>(\u043d\u0430\u0448 \u00ab\u0440\u0443\u0431\u043b\u044c\u00bb)<\/em>\u00a0\u2014 \u044d\u0442\u043e\u00a0<code>2^16 = 65536<\/code>. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0447\u0438\u0441\u043b\u043e 0.5\u00a0\u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u043a\u0430\u043a 32768. \u0413\u043b\u0430\u0432\u043d\u0430\u044f \u043f\u0440\u0435\u043b\u0435\u0441\u0442\u044c \u0446\u0435\u043b\u044b\u0445 \u0447\u0438\u0441\u0435\u043b \u0437\u0434\u0435\u0441\u044c \u0432\u00a0\u0442\u043e\u043c, \u0447\u0442\u043e\u00a0\u0431\u0430\u0437\u043e\u0432\u043e\u0435 \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438 \u0432\u044b\u0447\u0438\u0442\u0430\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u00ab\u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438\u00bb \u043d\u0430\u00a0\u0443\u0440\u043e\u0432\u043d\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430: \u043f\u0440\u0438\u00a0\u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u0434\u0440\u043e\u0431\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0435\u0434\u0438\u043d\u0438\u0446\u0430 \u0441\u0430\u043c\u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u0432\u00a0\u0441\u0442\u0430\u0440\u0448\u0438\u0435 \u0431\u0438\u0442\u044b \u0446\u0435\u043b\u043e\u0439 \u0447\u0430\u0441\u0442\u0438.<\/p>\n<p>\u0414\u043b\u044f\u00a0\u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u0434\u0435\u043b\u0435\u043d\u0438\u044f, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0434\u0435\u043b\u0430\u0442\u044c \u0431\u0438\u0442\u043e\u0432\u044b\u0435 \u0441\u0434\u0432\u0438\u0433\u0438 (<code>&lt;&lt; 16<\/code>\u00a0\u0438\u00a0<code>&gt;&gt; 16<\/code>), \u043d\u043e\u00a0\u0434\u043b\u044f 8-\u0431\u0438\u0442\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u044d\u0442\u043e \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0432\u00a0\u0440\u0430\u0437\u044b \u043b\u0435\u0433\u0447\u0435 \u0438 \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u0447\u0435\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u0430\u044f \u044d\u043c\u0443\u043b\u044f\u0446\u0438\u044f \u0447\u0435\u0441\u0442\u043d\u043e\u0433\u043e\u00a0<code>float<\/code>.<\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0440\u0435\u043d\u0434\u0435\u0440 \u0432\u0441\u0442\u0430\u043b \u043d\u0430\u00a0\u0440\u0435\u043b\u044c\u0441\u044b \u0446\u0435\u043b\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0439 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0438, \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u0432\u044b\u0440\u043e\u0441\u043b\u0430. \u041d\u043e\u00a0\u043e\u0441\u0442\u0430\u0432\u0430\u043b\u0430\u0441\u044c \u0432\u0442\u043e\u0440\u0430\u044f \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u00a0\u2014 \u0443\u0433\u043b\u044b \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430 \u0438 \u0442\u0440\u0438\u0433\u043e\u043d\u043e\u043c\u0435\u0442\u0440\u0438\u044f.<\/p>\n<p><a class=\"anchor\" name=\"%D0%91%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D0%BE%D0%B5\" id=\"\u0411\u0438\u043d\u0430\u0440\u043d\u043e\u0435\"><\/a><\/p>\n<h3>\u0411\u0438\u043d\u0430\u0440\u043d\u043e\u0435 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u0435 \u0443\u0433\u043b\u043e\u0432 (BAM)<\/h3>\n<p>\u0411\u0438\u043d\u0430\u0440\u043d\u043e\u0435 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u0435 \u0443\u0433\u043b\u043e\u0432\u00a0\u2014 \u0448\u0442\u0443\u043a\u0430 \u044d\u043a\u0437\u043e\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f. \u0415\u0435 \u043f\u043e\u0447\u0442\u0438 \u0447\u0442\u043e\u00a0\u043d\u0438\u043a\u0442\u043e \u043d\u0435\u00a0\u0432\u0441\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u0442, \u043d\u043e\u00a0\u043a\u043e\u0433\u0434\u0430 \u043d\u0430\u0434\u043e\u00a0\u2014 \u043e\u043d\u0430 \u0441\u0430\u043c\u0430 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442.<\/p>\n<p>\u0421\u0443\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0430: \u0432\u0441\u044e \u043e\u043a\u0440\u0443\u0436\u043d\u043e\u0441\u0442\u044c \u043c\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0432\u00a0\u0432\u0438\u0434\u0435\u00a0<code>uint8_t<\/code>\u00a0\u0447\u0438\u0441\u043b\u0430, \u0442\u043e \u0435\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u043c 360\u00b0 \u0432\u00a0\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043e\u0442 0\u00a0\u0434\u043e 255\u00a0<em>(\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c 8-\u0431\u0438\u0442\u043d\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430)<\/em>.<\/p>\n<p>\u0427\u0442\u043e\u00a0\u043c\u044b \u0442\u0435\u0440\u044f\u0435\u043c? \u041d\u0443, \u0432\u043e\u2011\u043f\u0435\u0440\u0432\u044b\u0445, \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c. \u0422\u0435\u043f\u0435\u0440\u044c \u0441\u043a\u0430\u0437\u0430\u0442\u044c 1.5\u00b0 \u044f\u0432\u043d\u043e \u043d\u0435\u00a0\u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f. \u0412\u043e\u2011\u0432\u0442\u043e\u0440\u044b\u0445, \u0438 1\u00b0 \u0442\u043e\u0436\u0435 \u043d\u0435\u00a0\u0441\u043a\u0430\u0436\u0435\u0448\u044c, \u0438\u0431\u043e \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u0443\u043f\u0430\u0434\u0435\u0442 \u0434\u043e 360\/256\u00a0= 1.4\u00b0. \u0422\u043e \u0435\u0441\u0442\u044c \u043e\u0434\u043d\u0430 \u0435\u0434\u0438\u043d\u0438\u0446\u0430 \u0432\u00a0<code>uint8_t<\/code>\u00a0\u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0432\u043d\u044f\u0442\u044c\u0441\u044f 1.4\u00a0\u0433\u0440\u0430\u0434\u0443\u0441\u0430\u043c \u043d\u0430\u00a0\u043e\u043a\u0440\u0443\u0436\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>\u041c\u043d\u043e\u0433\u043e\u0432\u0430\u0442\u043e\u00a0\u043b\u0438? \u041c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c. \u041d\u043e\u00a0\u0434\u043b\u044f\u00a0\u043d\u0430\u0448\u0435\u0433\u043e \u0434\u0432\u0438\u0436\u043a\u0430 \u044d\u0442\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442.<\/p>\n<p><em>\u0422\u0435\u043c \u0431\u043e\u043b\u0435\u0435, \u0434\u0430\u0436\u0435 \u0432\u043d\u0443\u0442\u0440\u0438 <\/em><strong><em>Unreal Engine<\/em><\/strong><em> \u043f\u0440\u0438\u00a0\u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u0438\u0433\u0440\u0435 \u0434\u043b\u044f\u00a0\u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0435\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u00a0\u043f\u043e\u043b\u043d\u044b\u0439 \u0443\u0433\u043e\u043b \u0438\u0433\u0440\u043e\u043a\u0430 (\u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u0447\u0438\u0441\u043b\u043e\u0432\u044b\u043c\u0438 \u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u044f\u043c\u0438), \u0430\u00a0\u0443\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043b\u0438\u0448\u044c \u0432 8-\u0431\u0438\u0442\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u00a0\u0441\u0435\u0442\u0438.<\/em><\/p>\n<pre><code class=\"cpp\">using FAngle = uint8;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041d\u043e\u00a0\u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0432\u043e\u043f\u0440\u043e\u0441\u00a0\u2014 \u0441\u0438\u043d\u0443\u0441\u044b \u0438 \u043a\u043e\u0441\u0438\u043d\u0443\u0441\u044b. \u041a\u0430\u043a\u00a0\u0438\u0445 \u0441\u0447\u0438\u0442\u0430\u0442\u044c? \u0410\u00a0\u0438\u0445 \u043d\u0435\u00a0\u043d\u0430\u0434\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c!<\/p>\n<p><a class=\"anchor\" name=\"%D0%A1%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D0%B0%D1%8F\" id=\"\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f\"><\/a><\/p>\n<h3>\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0430 \u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0441\u0438\u043d\u0443\u0441\u043e\u0432 (LUT)<\/h3>\n<p><strong>LUT\u00a0\u2014 Look\u2011Up Table<\/strong> <em>(\u043f\u043e\u0434\u0441\u0442\u0430\u043d\u043e\u0432\u043e\u0447\u043d\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430, \u0438\u043b\u0438\u00a0\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u043e\u0438\u0441\u043a\u0430)<\/em>\u00a0\u2014 \u043f\u043e\u00a0\u0441\u0443\u0442\u0438 \u043e\u0431\u043c\u0435\u043d \u00ab\u0442\u0430\u043a\u0442\u043e\u0432\u00bb \u043d\u0430 \u00ab\u043f\u0430\u043c\u044f\u0442\u044c\u00bb.<\/p>\n<p>\u042d\u0442\u043e \u0441\u043f\u043e\u0441\u043e\u0431, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u043d\u0435\u00a0\u0441\u0447\u0438\u0442\u0430\u0435\u043c \u043a\u0430\u0436\u0434\u043e\u0435 \u043d\u043e\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432\u043d\u043e\u0432\u044c, \u0442\u0440\u0430\u0442\u044f \u0434\u0440\u0430\u0433\u043e\u0446\u0435\u043d\u043d\u044b\u0435 \u0442\u0430\u043a\u0442\u044b, \u0430\u00a0\u043b\u0438\u0448\u044c \u0438\u0449\u0435\u043c \u0432\u00a0\u0433\u043e\u0442\u043e\u0432\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0432\u00a0\u043f\u0430\u043c\u044f\u0442\u0438 \u043d\u0443\u0436\u043d\u043e\u0435 \u043d\u0430\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0435\u0433\u043e.<\/p>\n<p>\u0418 \u0434\u043b\u044f\u00a0\u043a\u043e\u0441\u0438\u043d\u0443\u0441\u043e\u0432\u2011\u0441\u0438\u043d\u0443\u0441\u043e\u0432 \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e!<\/p>\n<p>\u041d\u0435\u00a0\u0431\u0443\u0434\u0435\u043c \u0445\u043e\u0434\u0438\u0442\u044c \u0432\u043e\u043a\u0440\u0443\u0433 \u0434\u0430\u00a0\u043e\u043a\u043e\u043b\u043e: BAM \u0434\u0430\u0435\u0442 \u043d\u0430\u043c \u0432\u043c\u0435\u0441\u0442\u043e \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u0430 \u0433\u0440\u0430\u0434\u0430\u0446\u0438\u0439 \u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0435\u0439 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 256\u00a0\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439. \u041f\u043e\u0447\u0435\u043c\u0443\u00a0\u0431\u044b \u043d\u0435\u00a0\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u043a\u0430\u043a\u00a0\u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u00a0\u0442\u0430\u0431\u043b\u0438\u0446\u0435, \u0430\u00a0\u0441\u0430\u043c\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0437\u0430\u0440\u0430\u043d\u0435\u0435?<\/p>\n<p>\u0414\u0430, \u043c\u043e\u0436\u043d\u043e. \u0422\u0430\u043a \u0438 \u0434\u0435\u043b\u0430\u0435\u043c. \u0422\u0430\u0431\u043b\u0438\u0446\u044b \u0434\u043b\u044f\u00a0\u0441\u0438\u043d\u0443\u0441\u043e\u0432 \u0438 \u043a\u043e\u0441\u0438\u043d\u0443\u0441\u043e\u0432, \u0438 \u0433\u043e\u0442\u043e\u0432\u043e.<\/p>\n<p>\u041d\u043e! \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0432 8\u00a0\u0440\u0430\u0437. \u041a\u0430\u043a? \u0412\u0441\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u043c \u0448\u043a\u043e\u043b\u044c\u043d\u0443\u044e \u0442\u0440\u0438\u0433\u043e\u043d\u043e\u043c\u0435\u0442\u0440\u0438\u044e \u0438 \u0433\u0440\u0430\u0444\u0438\u043a \u0441\u0438\u043d\u0443\u0441\u0430\/\u043a\u043e\u0441\u0438\u043d\u0443\u0441\u0430\u00a0\u2014 \u043e\u043d\u0438 \u0441\u043c\u0435\u0449\u0435\u043d\u044b \u043d\u0430 \u03c0\/2, \u0442\u043e \u0435\u0441\u0442\u044c \u043d\u0430 90\u00a0\u0433\u0440\u0430\u0434\u0443\u0441\u043e\u0432:<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/extt\/a7\/2b\/fb\/a72bfb3321d350c57ee3a254733a116f.png\" alt=\"cos(x) = sin(x + \u03c0\/2)\" title=\"cos(x) = sin(x + \u03c0\/2)\" width=\"755\" height=\"181\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/extt\/a7\/2b\/fb\/a72bfb3321d350c57ee3a254733a116f.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/extt\/a7\/2b\/fb\/a72bfb3321d350c57ee3a254733a116f.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>cos(x) = sin(x + \u03c0\/2)<\/figcaption><\/div>\n<\/figure>\n<p>\u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e\u00a0\u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u043e\u0441\u0438\u043d\u0443\u0441, \u043c\u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043e\u0442\u00a0\u0443\u0433\u043b\u0430 \u043f\u0440\u0438\u0431\u0430\u0432\u0438\u0442\u044c 90\u00a0\u0433\u0440\u0430\u0434\u0443\u0441\u043e\u0432 \u0438 \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0435\u0433\u043e \u043a\u0430\u043a\u00a0\u0441\u0438\u043d\u0443\u0441. \u0411\u0438\u043d\u0433\u043e! \u0423\u0436\u0435 \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0432 2\u00a0\u0440\u0430\u0437\u0430 <em>(\u0442\u0435\u043f\u0435\u0440\u044c \u0443\u00a0\u043d\u0430\u0441 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043b\u043d\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043d\u0430\u00a0\u0441\u0438\u043d\u0443\u0441)<\/em>.<\/p>\n<div class=\"floating-image\">\n<figure class=\"float \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/extt\/7e\/e4\/3c\/7ee43ca82c764dacba5fe24e44f40cf8.png\" alt=\"4 \u0447\u0435\u0442\u0432\u0435\u0440\u0442\u0438 \u0441\u0438\u043d\u0443\u0441\u0430\" title=\"4 \u0447\u0435\u0442\u0432\u0435\u0440\u0442\u0438 \u0441\u0438\u043d\u0443\u0441\u0430\" width=\"304\" height=\"300\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/extt\/7e\/e4\/3c\/7ee43ca82c764dacba5fe24e44f40cf8.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/extt\/7e\/e4\/3c\/7ee43ca82c764dacba5fe24e44f40cf8.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>4\u00a0\u0447\u0435\u0442\u0432\u0435\u0440\u0442\u0438 \u0441\u0438\u043d\u0443\u0441\u0430<\/figcaption><\/div>\n<\/figure>\n<p>\u041d\u043e\u00a0\u0437\u0430\u0447\u0435\u043c \u043f\u043e\u043b\u043d\u044b\u0439 \u0441\u0438\u043d\u0443\u0441 \u043d\u0430\u043c? \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u044f \u0441\u043d\u043e\u0432\u0430 \u0442\u0440\u0438\u0433\u043e\u043d\u043e\u043c\u0435\u0442\u0440\u0438\u044e, \u0432\u0438\u0434\u0438\u043c\u00a0\u2014 \u0432\u043e\u0442 \u044d\u0442\u0438 4\u00a0\u0447\u0435\u0442\u0432\u0435\u0440\u0442\u0438 \u043e\u043a\u0440\u0443\u0436\u043d\u043e\u0441\u0442\u0438. \u0421\u0438\u043d\u0443\u0441 \u0432\u00a0\u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0435\u0442\u0432\u0435\u0440\u0442\u0438 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439, \u0432\u043e\u00a0\u0432\u0442\u043e\u0440\u043e\u0439\u00a0\u2014 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439, \u0432\u00a0\u0442\u0440\u0435\u0442\u044c\u0435\u0439\u00a0\u2014 \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439, \u0432\u00a0\u0447\u0435\u0442\u0432\u0435\u0440\u0442\u043e\u0439\u00a0\u2014 \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439. \u0418 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0437\u0435\u0440\u043a\u0430\u043b\u044c\u043d\u044b.<\/p>\n<\/div>\n<div class=\"floating-image\">\n<p>\u0417\u043d\u0430\u0447\u0438\u0442, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0435\u0440\u0432\u0430\u044f \u0447\u0435\u0442\u0432\u0435\u0440\u0442\u044c\u00a0\u2014 64\u00a0\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0437 256. \u041e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c \u0438 \u0441\u043c\u0435\u043d\u043e\u0439 \u0437\u043d\u0430\u043a\u0430.<\/p>\n<\/div>\n<p>\u0412\u043e\u0442 \u043a\u0430\u043a\u00a0\u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0432\u00a0\u043a\u043e\u0434\u0435:<\/p>\n<pre><code class=\"cpp\">static FFixedFloat Sin(const FAngle InAngle){    const uint8 Quadrant = InAngle &gt;&gt; 6;    const uint8 Index = InAngle &amp; 0x3F;        const FFixedFloat RawValue = SinLUT[(Quadrant == 0 || Quadrant == 2) ? Index : (63 - Index)];    return Quadrant &gt;= 2 ? -RawValue : RawValue;}static FFixedFloat Cos(const FAngle InAngle) { return Sin(InAngle + 64); }<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0418\u0442\u043e\u0433\u043e: \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043d\u0430 64\u00a0\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432\u043c\u0435\u0441\u0442\u043e 256, \u043a\u043e\u0441\u0438\u043d\u0443\u0441 \u0447\u0435\u0440\u0435\u0437 \u0441\u0438\u043d\u0443\u0441 \u0441\u043e \u0441\u0434\u0432\u0438\u0433\u043e\u043c, \u0438 \u0432\u0441\u0451 \u044d\u0442\u043e \u0432 <strong>Fixed\u2011Point<\/strong>. \u0414\u0451\u0448\u0435\u0432\u043e \u0438 \u0441\u0435\u0440\u0434\u0438\u0442\u043e.<\/p>\n<p><a class=\"anchor\" name=\"%D0%A3%D0%B6%D0%B0%D1%81%D0%BD%D0%B0%D1%8F\" id=\"\u0423\u0436\u0430\u0441\u043d\u0430\u044f\"><\/a><\/p>\n<h3>\u0423\u0436\u0430\u0441\u043d\u0430\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f \u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0432\u00a0\u0434\u0443\u0445\u0435 ECS<\/h3>\n<p>\u0410\u00a0\u0432\u043e\u0442 \u0442\u0443\u0442 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441\u0430\u043c\u043e\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435.<\/p>\n<p>\u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u00a0<code>RenderSector<\/code>\u00a0\u0432\u044b\u0437\u044b\u0432\u0430\u043b \u0441\u0430\u043c \u0441\u0435\u0431\u044f. \u041a\u043e\u0433\u0434\u0430 \u0440\u0435\u043d\u0434\u0435\u0440 \u043d\u0430\u0442\u044b\u043a\u0430\u043b\u0441\u044f \u043d\u0430\u00a0\u043f\u043e\u0440\u0442\u0430\u043b, \u043e\u043d \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u043b\u00a0<code>RenderSector<\/code>\u00a0\u0434\u043b\u044f\u00a0\u0441\u043e\u0441\u0435\u0434\u043d\u0435\u0433\u043e \u0441\u0435\u043a\u0442\u043e\u0440\u0430. \u041d\u0430\u00a0\u041f\u041a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u00a0\u2014 \u0441\u0442\u0435\u043a \u0431\u043e\u043b\u044c\u0448\u043e\u0439, \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f \u0443\u0445\u043e\u0434\u0438\u043b\u0430 \u0432\u00a0\u0433\u043b\u0443\u0431\u0438\u043d\u0443, \u0432\u0441\u0451 \u0431\u044b\u043b\u043e \u0445\u043e\u0440\u043e\u0448\u043e.<\/p>\n<p>\u041d\u0430\u00a0AVR \u044d\u0442\u043e \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u043e\u0441\u044c \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\u043e: \u0432\u0442\u043e\u0440\u043e\u0439 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0440\u0442\u0430\u043b\u00a0\u2014 \u0438 \u0432\u0441\u0451, \u0441\u0442\u0435\u043a \u043a\u043e\u043d\u0447\u0438\u043b\u0441\u044f, \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u0443\u043c\u0435\u0440.<\/p>\n<p>\u041d\u0430\u0434\u043e \u0431\u044b\u043b\u043e \u0447\u0442\u043e\u2011\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c. \u0418 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u0448\u043b\u043e \u0432\u00a0\u0433\u043e\u043b\u043e\u0432\u0443: \u0430\u00a0\u0447\u0442\u043e, \u0435\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u043e \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u00a0<strong>\u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0437\u0430\u0434\u0430\u0447<\/strong>?<\/p>\n<p>\u0418\u0434\u0435\u044f \u043f\u0440\u043e\u0441\u0442\u0430\u044f. \u0412\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b\u00a0<code>RenderSector<\/code>\u00a0\u0432\u044b\u0437\u044b\u0432\u0430\u043b \u0441\u0430\u043c \u0441\u0435\u0431\u044f, \u043e\u043d\u00a0<strong>\u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0437\u0430\u0434\u0430\u0447\u0443<\/strong>\u00a0\u0432\u00a0\u043e\u0447\u0435\u0440\u0435\u0434\u044c: \u00ab\u043e\u0442\u0440\u0438\u0441\u0443\u0439 \u0441\u0435\u043a\u0442\u043e\u0440 N \u0432\u00a0\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 \u043e\u0442\u00a0MinX \u0434\u043e\u00a0MaxX \u0441\u00a0\u0442\u0430\u043a\u043e\u0439\u2011\u0442\u043e \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u0430\u043c\u0435\u0440\u043e\u0439\u00bb. \u0413\u043b\u0430\u0432\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u0440\u0435\u043d\u0434\u0435\u0440\u0430 \u043a\u0440\u0443\u0442\u0438\u0442\u0441\u044f, \u043f\u043e\u043a\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0435\u00a0\u043e\u043f\u0443\u0441\u0442\u0435\u0435\u0442, \u0438 \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u043d\u0435\u0442.<\/p>\n<pre><code class=\"cpp\">struct FRenderTask{    int8 SectorIndex;    int16 MinX;    int16 MaxX;    FFloatVector2D CameraLocation;    FAngle CameraAngle;};struct FRenderTaskQueue{    static inline FRenderTask Queue[RENDERING_TASK_QUEUE_ELEMENTS] = {};        static void Empty() { Head = 0; Tail = 0; }        static bool AddTask(const FRenderTask&amp;&amp; InRenderTask)    {        if(Head &gt;= RENDERING_TASK_QUEUE_ELEMENTS) return false;        Queue[Head++] = InRenderTask;        return true;    }        static int8 PopTaskIndex()    {        return Tail &gt;= Head || Tail &gt;= RENDERING_TASK_QUEUE_ELEMENTS ? -1 : Tail++;    }private:    static inline int8 Head = 0;    static inline int8 Tail = 0;};<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0410\u00a0\u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cpp\">FRenderTaskQueue::Empty();FRenderTaskQueue::AddTask(FRenderTask { FPlayer::CurrentSector, 0, WINDOW_WIDTH - 1, FPlayer::LocationXY, FPlayer::Angle });int8 TaskIndex;while((TaskIndex = FRenderTaskQueue::PopTaskIndex()) != -1){    RenderSector(        FRenderTaskQueue::Queue[TaskIndex].SectorIndex,        FRenderTaskQueue::Queue[TaskIndex].MinX,        FRenderTaskQueue::Queue[TaskIndex].MaxX,        FRenderTaskQueue::Queue[TaskIndex].CameraLocation,        FRenderTaskQueue::Queue[TaskIndex].CameraAngle    );}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443 \u00ab\u0432 \u0434\u0443\u0445\u0435 ECS\u00bb? \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e\u00a0\u0437\u0434\u0435\u0441\u044c \u0442\u0430\u00a0\u0436\u0435 \u0438\u0434\u0435\u044f: \u0415\u0441\u0442\u044c\u00a0<strong>\u0434\u0430\u043d\u043d\u044b\u0435<\/strong>\u00a0<em>(\u043c\u0430\u0441\u0441\u0438\u0432\u00a0<\/em><code><em>FRenderTaskQueue<\/em><\/code><em>)<\/em> \u0438 \u0435\u0441\u0442\u044c\u00a0<strong>\u0441\u0438\u0441\u0442\u0435\u043c\u0430<\/strong>\u00a0<em>(<\/em><code><em>RenderSector<\/em><\/code><em>)<\/em>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u043e\u0435\u0437\u0436\u0430\u0435\u0442 \u043f\u043e\u00a0\u044d\u0442\u0438\u043c \u0434\u0430\u043d\u043d\u044b\u043c \u043a\u0430\u043a\u00a0\u0433\u0430\u0437\u043e\u043d\u043e\u043a\u043e\u0441\u0438\u043b\u043a\u0430 \u0438 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0438\u0445. \u0414\u0430\u043d\u043d\u044b\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e, \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e. \u042d\u0442\u043e \u043d\u0435\u00a0ECS \u0432\u00a0\u043a\u0430\u043d\u043e\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u0441\u043c\u044b\u0441\u043b\u0435 (\u043d\u0435\u0442 Entity, \u043d\u0435\u0442 Component), \u043d\u043e\u00a0\u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044f \u0442\u0430\u00a0\u0436\u0435\u00a0\u2014 data\u2011oriented \u043f\u043e\u0434\u0445\u043e\u0434.<\/p>\n<p>\u0411\u043e\u043d\u0443\u0441\u043e\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0442\u043e, \u0447\u0442\u043e\u00a0\u043e\u0431\u0445\u043e\u0434 \u0441\u0442\u0430\u043b\u00a0<strong>breadth\u2011first<\/strong>: \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0440\u0438\u0441\u0443\u044e\u0442\u0441\u044f \u0432\u0441\u0435 \u0441\u0435\u043a\u0442\u043e\u0440\u0430 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f, \u043f\u043e\u0442\u043e\u043c \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435. \u0411\u043b\u0438\u0436\u043d\u0438\u0435 \u0441\u0435\u043a\u0442\u043e\u0440\u0430 \u0440\u0438\u0441\u0443\u044e\u0442\u0441\u044f \u0440\u0430\u043d\u044c\u0448\u0435, \u0438 \u043a\u043b\u0438\u043f\u043f\u0438\u043d\u0433 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0435\u0435.<\/p>\n<p><a class=\"anchor\" name=\"THE\" id=\"THE\"><\/a><\/p>\n<h3>THE CAKE IS A LIE!<\/h3>\n<p>\u0410\u00a0\u0442\u0435\u043f\u0435\u0440\u044c \u0441\u0430\u043c\u043e\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435&#8230;.<\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u044f \u0432\u043f\u0435\u0440\u0432\u044b\u0435 \u0437\u0430\u043c\u0435\u0442\u0438\u043b, \u0447\u0442\u043e\u00a0\u0434\u0432\u0438\u0436\u043e\u043a \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u0442 \u043f\u043e\u0440\u0442\u0430\u043b\u00a0<strong>\u0438\u0437\u00a0\u0441\u0432\u043e\u0435\u0439 \u043a\u0430\u043c\u0435\u0440\u044b<\/strong>. \u041a\u043b\u044e\u0447\u0435\u0432\u043e\u0435\u00a0\u2014 \u0438\u0437\u00a0\u0441\u0432\u043e\u0435\u0439\u00a0\u2014 \u044f \u043f\u043e\u0434\u0443\u043c\u0430\u043b: \u00ab\u0430 \u0447\u0442\u043e\u00a0\u0435\u0441\u043b\u0438&#8230;\u00bb. \u0410\u00a0\u0447\u0442\u043e\u00a0\u0435\u0441\u043b\u0438 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u0442\u044c \u043d\u0435\u00a0\u0438\u0437\u00a0\u0441\u0432\u043e\u0435\u0439 \u043a\u0430\u043c\u0435\u0440\u044b, \u0430\u00a0\u0433\u0434\u0435\u2011\u043d\u0438\u0431\u0443\u0434\u044c&#8230; \u0441\u00a0\u0434\u0440\u0443\u0433\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u0430?<\/p>\n<div class=\"floating-image\">\n<figure class=\"float full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/extt\/47\/e9\/a8\/47e9a8b43fda8a0f30aff40a54fc4529.png\" alt=\"\u0421\u043f\u0440\u0430\u0432\u0430 - \u043a\u0430\u043c\u0435\u0440\u0430 \u0438\u0433\u0440\u043e\u043a\u0430, \u0441\u043c\u043e\u0442\u0440\u044f\u0449\u0430\u044f \u043d\u0430 \u043f\u043e\u0440\u0442\u0430\u043b. \u0421\u043b\u0435\u0432\u0430 - \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u0430\u044f \u043a\u0430\u043c\u0435\u0440\u0430 (\u0412\u0437\u044f\u0442\u043e \u0438\u0437 \u0440\u043e\u043b\u0438\u043a\u0430 Coding Adventure: Portals - Sebastian Lague)\" title=\"\u0421\u043f\u0440\u0430\u0432\u0430 - \u043a\u0430\u043c\u0435\u0440\u0430 \u0438\u0433\u0440\u043e\u043a\u0430, \u0441\u043c\u043e\u0442\u0440\u044f\u0449\u0430\u044f \u043d\u0430 \u043f\u043e\u0440\u0442\u0430\u043b. \u0421\u043b\u0435\u0432\u0430 - \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u0430\u044f \u043a\u0430\u043c\u0435\u0440\u0430 (\u0412\u0437\u044f\u0442\u043e \u0438\u0437 \u0440\u043e\u043b\u0438\u043a\u0430 Coding Adventure: Portals - Sebastian Lague)\" width=\"2034\" height=\"1136\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/extt\/47\/e9\/a8\/47e9a8b43fda8a0f30aff40a54fc4529.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/extt\/47\/e9\/a8\/47e9a8b43fda8a0f30aff40a54fc4529.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0421\u043f\u0440\u0430\u0432\u0430\u00a0\u2014 \u043a\u0430\u043c\u0435\u0440\u0430 \u0438\u0433\u0440\u043e\u043a\u0430, \u0441\u043c\u043e\u0442\u0440\u044f\u0449\u0430\u044f \u043d\u0430\u00a0\u043f\u043e\u0440\u0442\u0430\u043b. \u0421\u043b\u0435\u0432\u0430\u00a0\u2014 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u0430\u044f \u043a\u0430\u043c\u0435\u0440\u0430 <em>(\u0412\u0437\u044f\u0442\u043e \u0438\u0437\u00a0\u0440\u043e\u043b\u0438\u043a\u0430 <\/em><a href=\"https:\/\/youtu.be\/cWpFZbjtSQg?si=108hZjBk_CsncX6k\" rel=\"noopener nofollow\"><strong><em>Coding Adventure: Portals<\/em><\/strong><\/a><em>\u00a0\u2014 <\/em><a href=\"https:\/\/www.youtube.com\/@SebastianLague\" rel=\"noopener nofollow\"><em>Sebastian Lague<\/em><\/a><em>)<\/em><\/figcaption><\/div>\n<\/figure>\n<p>\u0421\u043c\u044b\u0441\u043b \u043f\u0440\u043e\u0441\u0442: \u0437\u0430\u0434\u0430\u0447\u0430 \u0440\u0435\u043d\u0434\u0435\u0440\u0430\u00a0\u2014 \u044d\u0442\u043e \u043d\u0435 \u00ab\u043d\u0430\u0440\u0438\u0441\u0443\u0439 \u0441\u0435\u043a\u0442\u043e\u0440\u00bb, \u0430 \u00ab\u043d\u0430\u0440\u0438\u0441\u0443\u0439 \u0441\u0435\u043a\u0442\u043e\u0440 \u0442\u0430\u043a, \u043a\u0430\u043a\u00a0\u0435\u0441\u043b\u0438\u00a0\u0431\u044b \u043a\u0430\u043c\u0435\u0440\u0430 \u0431\u044b\u043b\u0430 \u0432\u043e\u0442 \u0437\u0434\u0435\u0441\u044c \u0438 \u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0430 \u0432\u043e\u0442 \u0442\u0430\u043a\u00bb\u00a0\u2014 \u0410\u00a0\u0437\u043d\u0430\u0447\u0438\u0442, \u044f \u043c\u043e\u0433\u0443 \u043f\u043e\u0434\u0441\u0443\u043d\u0443\u0442\u044c \u0435\u0439 \u043b\u044e\u0431\u0443\u044e \u043a\u0430\u043c\u0435\u0440\u0443! \u0425\u043e\u0442\u044c \u0437\u0430\u00a0\u0441\u0442\u0435\u043d\u043e\u0439, \u0445\u043e\u0442\u044c \u0432\u00a0\u0434\u0440\u0443\u0433\u043e\u043c \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u0438.<\/p>\n<\/div>\n<div class=\"floating-image\">\n<p>\u0421\u00a0\u043f\u043e\u0437\u0438\u0446\u0438\u0435\u0439, \u043d\u0430\u00a0\u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u0437\u0433\u043b\u044f\u0434, \u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u043d\u0435\u00a0\u0442\u0430\u043a \u0441\u0442\u0440\u0430\u0448\u043d\u043e: \u0431\u0435\u0440\u0451\u043c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0438\u0433\u0440\u043e\u043a\u0430 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043f\u043e\u0440\u0442\u0430\u043b\u0430, \u043f\u043e\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u043a\u043e \u0432\u0442\u043e\u0440\u043e\u043c\u0443 \u043f\u043e\u0440\u0442\u0430\u043b\u0443, \u0438 \u043f\u0440\u0438\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u043c. \u041f\u043e\u0437\u0438\u0446\u0438\u044f \u043f\u0435\u0440\u0435\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f. <\/p>\n<\/div>\n<div class=\"floating-image\">\n<p>\u041d\u043e \u00ab\u043f\u043e\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u043a\u043e \u0432\u0442\u043e\u0440\u043e\u043c\u0443 \u043f\u043e\u0440\u0442\u0430\u043b\u0443\u00bb\u00a0\u2014 \u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c \u043d\u0430\u00a0\u043a\u0430\u043a\u043e\u0439 \u0443\u0433\u043e\u043b \u043f\u043e\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c, \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u044d\u0442\u043e\u0442 \u0443\u0433\u043e\u043b. \u0410\u00a0\u043a\u0430\u043a\u00a0\u043d\u0430\u0439\u0442\u0438 \u0443\u0433\u043e\u043b \u043c\u0435\u0436\u0434\u0443 \u0434\u0432\u0443\u043c\u044f \u043f\u043e\u0440\u0442\u0430\u043b\u0430\u043c\u0438? \u041c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0430 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u043c\u043d\u0435 \u0442\u0440\u0438\u0433\u043e\u043d\u043e\u043c\u0435\u0442\u0440\u0438\u044e, \u0441\u043a\u0430\u043b\u044f\u0440\u043a\u0443, \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f&#8230; \u043d\u0430\u00a0AVR, \u0433\u0434\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u0442\u0430\u043a\u0442 \u043d\u0430\u00a0\u0441\u0447\u0435\u0442\u0443.<\/p>\n<\/div>\n<p>\u0418 \u044f \u0432\u044b\u0431\u0440\u0430\u043b \u043c\u0435\u043d\u044c\u0448\u0435\u0435 \u0438\u0437\u00a0\u0434\u0432\u0443\u0445 \u0437\u043e\u043b: \u0432\u044b\u0434\u0435\u043b\u0438\u043b \u043e\u0434\u0438\u043d \u0431\u0430\u0439\u0442 \u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u0445\u0430\u0440\u0434\u043a\u043e\u0434\u0438\u043b \u0442\u0443\u0434\u0430 \u0443\u0433\u043e\u043b \u043c\u0435\u0436\u0434\u0443 \u0434\u0432\u0443\u043c\u044f \u043f\u043e\u0440\u0442\u0430\u043b\u0430\u043c\u0438.<\/p>\n<p>\u0414\u0430, \u043c\u043e\u0436\u0435\u0442, \u0442\u0443\u043f\u043e. \u041d\u043e\u00a0\u0437\u0430\u0442\u043e \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e!<\/p>\n<p>\u0422\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438 \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a. \u0423\u00a0\u0441\u0442\u0435\u043d\u044b\u2011\u043f\u043e\u0440\u0442\u0430\u043b\u0430 \u0435\u0441\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u00a0<code>PortalAngleDelta<\/code>\u00a0\u2014 \u0443\u0433\u043e\u043b, \u043d\u0430\u00a0\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0440\u0442\u0430\u043b \u043f\u0440\u0438\u00a0\u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0435.<\/p>\n<p>\u0412\u00a0\u043a\u043e\u0434\u0435 \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cpp\">if(Wall.PortalNextWall != -1) \/\/ Non-Euclidean Portal{    const FWall TargetWall = LoadFromFlash(GWalls[Wall.PortalNextWall]);    const FAngle VirtualAngle = InCameraAngle + Wall.PortalAngleDelta;        const FFloatVector2D PortalCenter = FFloatVector2D(FFloatVector2D(      Wall.Point1) + FFloatVector2D(      Wall.Point2)).DivByTwo();    const FFloatVector2D TargetCenter = FFloatVector2D(FFloatVector2D(TargetWall.Point1) + FFloatVector2D(TargetWall.Point2)).DivByTwo();        const FFloatVector2D LocalLocation = InCameraLocation - PortalCenter;        const FFixedFloat CosAngle = FMath::Cos(Wall.PortalAngleDelta);    const FFixedFloat SinAngle = FMath::Sin(Wall.PortalAngleDelta);        const FFloatVector2D RotatedLocation = FFloatVector2D(LocalLocation.X * CosAngle - LocalLocation.Y * SinAngle, LocalLocation.Y * CosAngle + LocalLocation.X * SinAngle);     const FFloatVector2D VirtualLocation = TargetCenter + RotatedLocation;        FRenderTaskQueue::AddTask({ Wall.PortalNextSector, StartX, EndX, VirtualLocation, VirtualAngle });    continue;}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041c\u044b \u0431\u0435\u0440\u0451\u043c \u0446\u0435\u043d\u0442\u0440 \u043f\u043e\u0440\u0442\u0430\u043b\u0430, \u0446\u0435\u043d\u0442\u0440 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u0441\u0442\u0435\u043d\u044b, \u043f\u043e\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043a\u0430\u043c\u0435\u0440\u044b \u043d\u0430\u00a0<code>PortalAngleDelta<\/code>\u00a0\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c\u00a0<strong>\u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0443\u044e \u043a\u0430\u043c\u0435\u0440\u0443<\/strong>. \u0418 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u0434\u0430\u0447\u0443 \u0441\u00a0\u044d\u0442\u043e\u0439 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u0430\u043c\u0435\u0440\u043e\u0439. \u041a\u0430\u043c\u0435\u0440\u0430 \u043d\u0435 \u00ab\u0442\u0435\u043b\u0435\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f\u00bb\u00a0\u2014 \u043e\u043d\u0430 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e \u043f\u0435\u0440\u0435\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0434\u043b\u044f\u00a0\u043a\u0430\u0436\u0434\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u0440\u0435\u043d\u0434\u0435\u0440\u0430.<\/p>\n<p>\u0418 \u0432\u00a0\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u0438\u0442\u043e\u0433\u0435:\u00a0<strong>\u0443\u00a0\u043d\u0430\u0441 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043d\u0435\u0435\u0432\u043a\u043b\u0438\u0434\u043e\u0432\u044b \u043f\u043e\u0440\u0442\u0430\u043b\u044b \u043f\u0440\u044f\u043c\u043e \u043d\u0430\u00a0AVR!<\/strong> \u0414\u043b\u044f\u00a0\u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0435\u0441\u0442\u044c \u043a\u0430\u0440\u0442\u0430 \u0422\u0410\u0420\u0414\u0418\u0421\u00a0\u2014 \u0441\u043d\u0430\u0440\u0443\u0436\u0438 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0430\u044f \u0431\u0443\u0434\u043a\u0430, \u0430\u00a0\u0432\u043d\u0443\u0442\u0440\u0438 \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e. \u0418 \u044d\u0442\u043e \u043d\u0435\u00a0\u0444\u0435\u0439\u043a, \u044d\u0442\u043e \u0447\u0435\u0441\u0442\u043d\u0430\u044f \u043d\u0435\u0435\u0432\u043a\u043b\u0438\u0434\u043e\u0432\u0430 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044f.<\/p>\n<p>\u0415\u0441\u0442\u044c, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435. \u041d\u0435\u0435\u0432\u043a\u043b\u0438\u0434\u043e\u0432\u0430 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0430 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043e\u0439\u00a0<code>RENDERING_NON_EUCLIDEAN_PORTAL_MAX_RECURSION<\/code>\u00a0<em>(\u0443 \u043c\u0435\u043d\u044f \u044d\u0442\u043e 8)<\/em>. \u0415\u0441\u043b\u0438 \u0438\u0433\u0440\u043e\u043a \u0432\u0438\u0434\u0438\u0442 \u043f\u043e\u0440\u0442\u0430\u043b \u0432\u00a0\u043f\u043e\u0440\u0442\u0430\u043b\u0435 \u0432\u00a0\u043f\u043e\u0440\u0442\u0430\u043b\u0435\u00a0\u2014 \u0433\u043b\u0443\u0431\u0438\u043d\u0430 \u043e\u0431\u0440\u0435\u0437\u0430\u0435\u0442\u0441\u044f. \u041d\u0430\u00a0AVR \u0438\u043d\u0430\u0447\u0435 \u043d\u0438\u043a\u0430\u043a: \u043a\u0430\u0436\u0434\u0430\u044f \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430\u00a0\u2014 \u044d\u0442\u043e \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u043f\u0440\u043e\u0445\u043e\u0434 \u0440\u0435\u043d\u0434\u0435\u0440\u0430, \u0430\u00a0\u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u043d\u0435\u00a0\u0440\u0435\u0437\u0438\u043d\u043e\u0432\u044b\u0439.<\/p>\n<p><a class=\"anchor\" name=\"%D0%A1%D0%BA%D1%80%D0%B8%D0%BD%D1%88%D0%BE%D1%82%D1%8B\" id=\"\u0421\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u044b\"><\/a><\/p>\n<h2>\u0421\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u044b \u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043a\u0430\u0440\u0442<\/h2>\n<details class=\"spoiler\">\n<summary>\u041a\u0430\u0440\u0442\u0430 \u00abDuoRooms\u00bb<\/summary>\n<div class=\"spoiler__content\">\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/extt\/ed\/ef\/36\/edef36ef4b97d15ef55144fdf8e4c639.png\" alt=\"\u041f\u0440\u043e\u0441\u0442\u0430\u044f \u043a\u043e\u043c\u043d\u0430\u0442\u0430 \u0441 \u043f\u043e\u0434\u043d\u044f\u0442\u044b\u043c \u043f\u043e\u043b\u043e\u043c \u0438 \u043f\u043e\u0442\u043e\u043b\u043a\u043e\u043c \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u043c \u0441\u0435\u043a\u0442\u043e\u0440\u0435\" title=\"\u041f\u0440\u043e\u0441\u0442\u0430\u044f \u043a\u043e\u043c\u043d\u0430\u0442\u0430 \u0441 \u043f\u043e\u0434\u043d\u044f\u0442\u044b\u043c \u043f\u043e\u043b\u043e\u043c \u0438 \u043f\u043e\u0442\u043e\u043b\u043a\u043e\u043c \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u043c \u0441\u0435\u043a\u0442\u043e\u0440\u0435\" width=\"606\" height=\"572\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/extt\/ed\/ef\/36\/edef36ef4b97d15ef55144fdf8e4c639.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/extt\/ed\/ef\/36\/edef36ef4b97d15ef55144fdf8e4c639.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041f\u0440\u043e\u0441\u0442\u0430\u044f \u043a\u043e\u043c\u043d\u0430\u0442\u0430 \u0441\u00a0\u043f\u043e\u0434\u043d\u044f\u0442\u044b\u043c \u043f\u043e\u043b\u043e\u043c \u0438 \u043f\u043e\u0442\u043e\u043b\u043a\u043e\u043c \u0432\u043e\u00a0\u0432\u0442\u043e\u0440\u043e\u043c \u0441\u0435\u043a\u0442\u043e\u0440\u0435<\/figcaption><\/div>\n<\/figure>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u041a\u0430\u0440\u0442\u0430 \u00abStairs\u00bb<\/summary>\n<div class=\"spoiler__content\">\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/extt\/62\/93\/7d\/62937d0f14242f07c2448d95d12cd18e.png\" alt=\"\u041d\u0430\u0431\u043e\u0440 \u0438\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0441\u0435\u043a\u0442\u043e\u0440\u043e\u0432 \u0440\u0430\u0437\u043d\u043e\u0439 \u0432\u044b\u0441\u043e\u0442\u044b\" title=\"\u041d\u0430\u0431\u043e\u0440 \u0438\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0441\u0435\u043a\u0442\u043e\u0440\u043e\u0432 \u0440\u0430\u0437\u043d\u043e\u0439 \u0432\u044b\u0441\u043e\u0442\u044b\" width=\"778\" height=\"735\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/extt\/62\/93\/7d\/62937d0f14242f07c2448d95d12cd18e.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/extt\/62\/93\/7d\/62937d0f14242f07c2448d95d12cd18e.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041d\u0430\u0431\u043e\u0440 \u0438\u0437\u00a0\u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0441\u0435\u043a\u0442\u043e\u0440\u043e\u0432 \u0440\u0430\u0437\u043d\u043e\u0439 \u0432\u044b\u0441\u043e\u0442\u044b<\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/extt\/52\/aa\/28\/52aa28b391f1e7f4d49c657ca93b899c.png\" alt=\"\u0421\u0442\u043e\u0438\u043c \u043d\u0430 \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435\" title=\"\u0421\u0442\u043e\u0438\u043c \u043d\u0430 \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435\" width=\"615\" height=\"595\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/extt\/52\/aa\/28\/52aa28b391f1e7f4d49c657ca93b899c.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/extt\/52\/aa\/28\/52aa28b391f1e7f4d49c657ca93b899c.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0421\u0442\u043e\u0438\u043c \u043d\u0430\u00a0\u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435<\/figcaption><\/div>\n<\/figure>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u041a\u0430\u0440\u0442\u0430 \u00abSimple Portals!\u00bb<\/summary>\n<div class=\"spoiler__content\">\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/extt\/19\/80\/78\/198078083666eaec06119de51b210f88.png\" alt=\"\u0421\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u043b\u0435\u0432\u044b\u0435 \u0438 \u043f\u0440\u0430\u0432\u044b\u0435 \u043f\u043e\u0440\u0442\u0430\u043b\u044b. \u041c\u043e\u0436\u0435\u0442\u0435 \u0434\u0430\u0436\u0435 \u0432\u043d\u0443\u0442\u0440\u0438 \u043b\u0435\u0432\u043e\u0433\u043e \u043f\u043e\u0440\u0442\u0430\u043b\u0430 \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043a\u0440\u0430\u0441\u043d\u0443\u044e \u0441\u0442\u0435\u043d\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0432\u0438\u0434\u0438\u0442 \u043f\u0440\u0430\u0432\u044b\u0439 \u043f\u043e\u0440\u0442\u0430\u043b :)\" title=\"\u0421\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u043b\u0435\u0432\u044b\u0435 \u0438 \u043f\u0440\u0430\u0432\u044b\u0435 \u043f\u043e\u0440\u0442\u0430\u043b\u044b. \u041c\u043e\u0436\u0435\u0442\u0435 \u0434\u0430\u0436\u0435 \u0432\u043d\u0443\u0442\u0440\u0438 \u043b\u0435\u0432\u043e\u0433\u043e \u043f\u043e\u0440\u0442\u0430\u043b\u0430 \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043a\u0440\u0430\u0441\u043d\u0443\u044e \u0441\u0442\u0435\u043d\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0432\u0438\u0434\u0438\u0442 \u043f\u0440\u0430\u0432\u044b\u0439 \u043f\u043e\u0440\u0442\u0430\u043b :)\" width=\"749\" height=\"629\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/extt\/19\/80\/78\/198078083666eaec06119de51b210f88.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/extt\/19\/80\/78\/198078083666eaec06119de51b210f88.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0421\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u043b\u0435\u0432\u044b\u0435 \u0438 \u043f\u0440\u0430\u0432\u044b\u0435 \u043f\u043e\u0440\u0442\u0430\u043b\u044b. \u041c\u043e\u0436\u0435\u0442\u0435 \u0434\u0430\u0436\u0435 \u0432\u043d\u0443\u0442\u0440\u0438 \u043b\u0435\u0432\u043e\u0433\u043e \u043f\u043e\u0440\u0442\u0430\u043b\u0430 \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043a\u0440\u0430\u0441\u043d\u0443\u044e \u0441\u0442\u0435\u043d\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0432\u0438\u0434\u0438\u0442 \u043f\u0440\u0430\u0432\u044b\u0439 \u043f\u043e\u0440\u0442\u0430\u043b:)<\/figcaption><\/div>\n<\/figure>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u041a\u0430\u0440\u0442\u0430 \u00abTwoCorridors\u00bb<\/summary>\n<div class=\"spoiler__content\">\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/extt\/bd\/ce\/98\/bdce988066fd306a9b29317f0d83a840.png\" alt=\"\u0425\u043c, \u0434\u0432\u0430 \u043a\u043e\u0440\u0438\u0434\u043e\u0440\u0430. \u041e\u0434\u0438\u043d \u0434\u043b\u0438\u043d\u043d\u044b\u0439, \u0434\u0440\u0443\u0433\u043e\u0439 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0439. \u0427\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0439\u0442\u0438 \u043d\u0435 \u0442\u0430\u043a?\" title=\"\u0425\u043c, \u0434\u0432\u0430 \u043a\u043e\u0440\u0438\u0434\u043e\u0440\u0430. \u041e\u0434\u0438\u043d \u0434\u043b\u0438\u043d\u043d\u044b\u0439, \u0434\u0440\u0443\u0433\u043e\u0439 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0439. \u0427\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0439\u0442\u0438 \u043d\u0435 \u0442\u0430\u043a?\" width=\"600\" height=\"566\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/extt\/bd\/ce\/98\/bdce988066fd306a9b29317f0d83a840.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/extt\/bd\/ce\/98\/bdce988066fd306a9b29317f0d83a840.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0425\u043c, \u0434\u0432\u0430 \u043a\u043e\u0440\u0438\u0434\u043e\u0440\u0430. \u041e\u0434\u0438\u043d \u0434\u043b\u0438\u043d\u043d\u044b\u0439, \u0434\u0440\u0443\u0433\u043e\u0439 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0439. \u0427\u0442\u043e\u00a0\u0437\u0434\u0435\u0441\u044c \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0439\u0442\u0438 \u043d\u0435\u00a0\u0442\u0430\u043a?<\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/extt\/7f\/7c\/e9\/7f7ce949e97f3710928bbb8a319653ff.png\" alt=\"\u0412\u0440\u043e\u0434\u0435 \u0431\u044b \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0439 \u043a\u043e\u0440\u0438\u0434\u043e\u0440...\" title=\"\u0412\u0440\u043e\u0434\u0435 \u0431\u044b \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0439 \u043a\u043e\u0440\u0438\u0434\u043e\u0440...\" width=\"595\" height=\"583\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/extt\/7f\/7c\/e9\/7f7ce949e97f3710928bbb8a319653ff.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/extt\/7f\/7c\/e9\/7f7ce949e97f3710928bbb8a319653ff.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0412\u0440\u043e\u0434\u0435\u00a0\u0431\u044b \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0439 \u043a\u043e\u0440\u0438\u0434\u043e\u0440&#8230;<\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/extt\/25\/37\/68\/253768ab999658777f73abb7181a7f0f.png\" alt=\"\u0410 \u043d\u0435\u0442! \u0412\u043d\u0443\u0442\u0440\u0438 \u043e\u043d \u0434\u043b\u0438\u043d\u043d\u044b\u0439!\" title=\"\u0410 \u043d\u0435\u0442! \u0412\u043d\u0443\u0442\u0440\u0438 \u043e\u043d \u0434\u043b\u0438\u043d\u043d\u044b\u0439!\" width=\"592\" height=\"503\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/extt\/25\/37\/68\/253768ab999658777f73abb7181a7f0f.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/extt\/25\/37\/68\/253768ab999658777f73abb7181a7f0f.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0410\u00a0\u043d\u0435\u0442! \u0412\u043d\u0443\u0442\u0440\u0438 \u043e\u043d \u0434\u043b\u0438\u043d\u043d\u044b\u0439!<\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/extt\/70\/3e\/d9\/703ed99151e5f157021d341824b806a2.png\" alt=\"\u041c\u043e\u0436\u0435\u0442 \u0442\u043e\u0433\u0434\u0430 \u0434\u043b\u0438\u043d\u043d\u044b\u0439 \u043a\u043e\u0440\u0438\u0434\u043e\u0440... \u0430 \u043d\u0435\u0442, \u043e\u043d \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0439\" title=\"\u041c\u043e\u0436\u0435\u0442 \u0442\u043e\u0433\u0434\u0430 \u0434\u043b\u0438\u043d\u043d\u044b\u0439 \u043a\u043e\u0440\u0438\u0434\u043e\u0440... \u0430 \u043d\u0435\u0442, \u043e\u043d \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0439\" width=\"605\" height=\"545\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/extt\/70\/3e\/d9\/703ed99151e5f157021d341824b806a2.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/extt\/70\/3e\/d9\/703ed99151e5f157021d341824b806a2.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041c\u043e\u0436\u0435\u0442 \u0442\u043e\u0433\u0434\u0430 \u0434\u043b\u0438\u043d\u043d\u044b\u0439 \u043a\u043e\u0440\u0438\u0434\u043e\u0440&#8230; \u0430\u00a0\u043d\u0435\u0442, \u043e\u043d \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0439<\/figcaption><\/div>\n<\/figure>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u041a\u0430\u0440\u0442\u0430 \u00abTARDIS\u00bb<\/summary>\n<div class=\"spoiler__content\">\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/extt\/1d\/04\/f3\/1d04f3607993d107ba26d3b602f3cc44.png\" alt=\"\u0412\u0440\u043e\u0434\u0435 \u0431\u044b \u043e\u0431\u044b\u0447\u043d\u0430\u044f \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u043d\u0430\u044f \u0431\u0443\u0434\u043a\u0430? (\u043d\u0443 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u0447\u0442\u043e \u044d\u0442\u043e \u0431\u0443\u0434\u043a\u0430, \u043c\u043d\u0435 \u043b\u0435\u043d\u044c \u0431\u044b\u043b\u043e \u044d\u0442\u0438 \u0441\u0435\u043a\u0442\u043e\u0440\u0430 \u0440\u0430\u0441\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c)\" title=\"\u0412\u0440\u043e\u0434\u0435 \u0431\u044b \u043e\u0431\u044b\u0447\u043d\u0430\u044f \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u043d\u0430\u044f \u0431\u0443\u0434\u043a\u0430? (\u043d\u0443 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u0447\u0442\u043e \u044d\u0442\u043e \u0431\u0443\u0434\u043a\u0430, \u043c\u043d\u0435 \u043b\u0435\u043d\u044c \u0431\u044b\u043b\u043e \u044d\u0442\u0438 \u0441\u0435\u043a\u0442\u043e\u0440\u0430 \u0440\u0430\u0441\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c)\" width=\"611\" height=\"646\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/extt\/1d\/04\/f3\/1d04f3607993d107ba26d3b602f3cc44.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/extt\/1d\/04\/f3\/1d04f3607993d107ba26d3b602f3cc44.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0412\u0440\u043e\u0434\u0435\u00a0\u0431\u044b \u043e\u0431\u044b\u0447\u043d\u0430\u044f \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u043d\u0430\u044f \u0431\u0443\u0434\u043a\u0430? (\u043d\u0443 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u0447\u0442\u043e\u00a0\u044d\u0442\u043e \u0431\u0443\u0434\u043a\u0430, \u043c\u043d\u0435 \u043b\u0435\u043d\u044c \u0431\u044b\u043b\u043e \u044d\u0442\u0438 \u0441\u0435\u043a\u0442\u043e\u0440\u0430 \u0440\u0430\u0441\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c)<\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/extt\/61\/6e\/8c\/616e8cb99fc73934356f5d6f01d21435.png\" alt=\"\u041d\u043e \u0432\u043d\u0443\u0442\u0440\u0438 \u0442\u0430\u043a\u043e\u0435 \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e......\" title=\"\u041d\u043e \u0432\u043d\u0443\u0442\u0440\u0438 \u0442\u0430\u043a\u043e\u0435 \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e......\" width=\"602\" height=\"603\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/extt\/61\/6e\/8c\/616e8cb99fc73934356f5d6f01d21435.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/extt\/61\/6e\/8c\/616e8cb99fc73934356f5d6f01d21435.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041d\u043e\u00a0\u0432\u043d\u0443\u0442\u0440\u0438 \u0442\u0430\u043a\u043e\u0435 \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e&#8230;&#8230;<\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/extt\/3c\/62\/e3\/3c62e33ac4e011f6d28b8834f00e5549.png\" alt=\"\u0418 \u0441\u044e\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0439\u0442\u0438!\" title=\"\u0418 \u0441\u044e\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0439\u0442\u0438!\" width=\"607\" height=\"660\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/extt\/3c\/62\/e3\/3c62e33ac4e011f6d28b8834f00e5549.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/extt\/3c\/62\/e3\/3c62e33ac4e011f6d28b8834f00e5549.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0418 \u0441\u044e\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0439\u0442\u0438!<\/figcaption><\/div>\n<\/figure>\n<\/div>\n<\/details>\n<p><a class=\"anchor\" name=\"%D0%91%D0%B5%D0%BD%D1%87%D0%BC%D0%B0%D1%80%D0%BA%D0%B8\" id=\"\u0411\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438\"><\/a><\/p>\n<h2>\u0411\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438<\/h2>\n<p>\u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0446\u0438\u0444\u0440\u044b, \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u043a\u0430\u043a\u00a0\u044f \u0438\u0445 \u0432\u043e\u043e\u0431\u0449\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b.<\/p>\n<p>\u041d\u0430\u00a0AVR \u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043b Timer1\u00a0\u0432\u00a0\u0440\u0435\u0436\u0438\u043c\u0435 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u0447\u0451\u0442\u0430 \u0441\u00a0\u043f\u0440\u0435\u0434\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u0435\u043c 64. \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e\u00a0\u0442\u0430\u0439\u043c\u0435\u0440 \u0442\u0438\u043a\u0430\u0435\u0442 \u0441\u00a0\u0447\u0430\u0441\u0442\u043e\u0442\u043e\u0439\u00a0<code>16 \u041c\u0413\u0446 \/ 64 = 250 \u043a\u0413\u0446<\/code>. \u0422\u043e \u0435\u0441\u0442\u044c \u043e\u0434\u0438\u043d \u0442\u0438\u043a\u00a0\u2014 \u044d\u0442\u043e 4\u00a0\u043c\u0438\u043a\u0440\u043e\u0441\u0435\u043a\u0443\u043d\u0434\u044b.<\/p>\n<p>\u041f\u0435\u0440\u0435\u0434 \u043d\u0430\u0447\u0430\u043b\u043e\u043c \u043a\u0430\u0434\u0440\u0430 \u044f \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u044e \u0441\u0447\u0451\u0442\u0447\u0438\u043a \u0432\u00a0\u043d\u043e\u043b\u044c (<code>TCNT1 = 0<\/code>), \u043f\u043e\u0441\u043b\u0435 \u043a\u0430\u0434\u0440\u0430\u00a0\u2014 \u0447\u0438\u0442\u0430\u044e \u0435\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u0414\u0430\u043b\u044c\u0448\u0435 \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0435\u0440\u0435\u0432\u0435\u0441\u0442\u0438 \u0442\u0438\u043a\u0438 \u0432\u00a0FPS:<\/p>\n<pre><code class=\"cpp\">FPS = 250'000 \/ Ticks<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443 250&#8217;000? \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e 250\u00a0\u043a\u0413\u0446\u00a0\u2014 \u044d\u0442\u043e 250&#8217;000\u00a0\u0442\u0438\u043a\u043e\u0432 \u0432\u00a0\u0441\u0435\u043a\u0443\u043d\u0434\u0443. \u0415\u0441\u043b\u0438 \u043a\u0430\u0434\u0440 \u0437\u0430\u043d\u044f\u043b\u00a0<code>Ticks<\/code>\u00a0\u0442\u0438\u043a\u043e\u0432, \u0442\u043e \u0432\u00a0\u0441\u0435\u043a\u0443\u043d\u0434\u0443 \u0442\u0430\u043a\u0438\u0445 \u043a\u0430\u0434\u0440\u043e\u0432 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u0441\u044f \u0440\u043e\u0432\u043d\u043e\u00a0<code>250'000 \/ Ticks<\/code>.<\/p>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u00a0serial\u2011\u043f\u043e\u0440\u0442 \u043f\u044f\u0442\u044c\u044e \u0446\u0438\u0444\u0440\u0430\u043c\u0438\u00a0\u2014 \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0447\u0438\u0442\u0430\u0442\u044c \u043f\u0440\u044f\u043c\u043e \u0432\u00a0\u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0435 \u043f\u043e\u0440\u0442\u0430, \u043d\u0435\u00a0\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u044f \u043d\u0438\u0447\u0435\u0433\u043e \u043b\u0438\u0448\u043d\u0435\u0433\u043e.<\/p>\n<pre><code class=\"cpp\">struct FTimerFPS{public:    static void Initialize()    {        TCCR1A = 0; TCCR1B = (1 &lt;&lt; CS11) | (1 &lt;&lt; CS10);    }        static void Start()    {        TCNT1 = 0;    }        static void End()    {        uint16 Timer = TCNT1;                FSerial::Send(( Timer \/ 10000)      + '0');         FSerial::Send(((Timer \/ 1000) % 10) + '0');        FSerial::Send(((Timer \/ 100) % 10)  + '0');          FSerial::Send(((Timer \/ 10) % 10)   + '0');        FSerial::Send(( Timer % 10)         + '0');        FSerial::Send('\\n');        FSerial::Send('\\r');    }};<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<h3>\u0426\u0438\u0444\u0440\u044b<\/h3>\n<p>\u0410\u00a0\u0442\u0435\u043f\u0435\u0440\u044c \u0441\u0430\u043c\u043e\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435. \u0421\u00a0\u0434\u0438\u0441\u043f\u043b\u0435\u0435\u043c ST7735\u00a0\u043a\u0430\u0440\u0442\u0438\u043d\u0430 \u0442\u0430\u043a\u0430\u044f:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"center\"><strong>\u0422\u0438\u043a\u0438<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"center\"><strong>FPS<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"center\">52\u202f207<\/p>\n<\/td>\n<td>\n<p align=\"center\">4.78<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"center\">51\u202f797<\/p>\n<\/td>\n<td>\n<p align=\"center\">4.82<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"center\">52\u202f423<\/p>\n<\/td>\n<td>\n<p align=\"center\">4.76<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"center\">52\u202f081<\/p>\n<\/td>\n<td>\n<p align=\"center\">4.80<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"center\">51\u202f769<\/p>\n<\/td>\n<td>\n<p align=\"center\">4.83<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p><strong>4.82\u00a0FPS.<\/strong>\u00a0\u041c\u044f\u0433\u043a\u043e \u0433\u043e\u0432\u043e\u0440\u044f, \u043d\u0435\u00a0\u0433\u0443\u0441\u0442\u043e. \u041d\u043e\u00a0\u043d\u0435\u00a0\u0441\u043f\u0435\u0448\u0438\u0442\u0435 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u044e.<\/p>\n<p>\u0414\u0435\u043b\u043e \u0432\u00a0\u0442\u043e\u043c, \u0447\u0442\u043e\u00a0\u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0442\u043e\u0440\u043c\u043e\u0437\u00a0\u2014 \u044d\u0442\u043e \u043d\u0435\u00a0\u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0430 \u0438 \u043d\u0435\u00a0\u0440\u0435\u043d\u0434\u0435\u0440, \u0430\u00a0\u0441\u0430\u043c \u0434\u0438\u0441\u043f\u043b\u0435\u0439. <strong>ST7735\u00a0<\/strong>\u043e\u0431\u0449\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u00a0\u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0443 <strong>SPI<\/strong>, \u0438 \u043a\u0430\u0436\u0434\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f <code>SetWindow<\/code>\u00a0+\u00a0<code>BeginDraw<\/code>\u00a0+\u00a0<code>Draw<\/code>\u00a0+\u00a0<code>EndDraw<\/code>\u00a0\u2014 \u044d\u0442\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u043d\u0430\u00a0\u0448\u0438\u043d\u0435. \u041d\u0430\u00a0\u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0438 160\u00d7128\u00a0\u043c\u044b \u0437\u0430\u00a0\u043a\u0430\u0434\u0440 \u043f\u0440\u043e\u0433\u043e\u043d\u044f\u0435\u043c \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u0442\u044b\u0441\u044f\u0447 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439, \u0438 \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u043f\u0440\u043e\u0441\u0442\u043e \u0436\u0434\u0451\u0442, \u043f\u043e\u043a\u0430 \u0434\u0438\u0441\u043f\u043b\u0435\u0439 \u0438\u0445 \u043f\u0440\u0438\u043c\u0435\u0442.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0441\u0434\u0435\u043b\u0430\u043b \u0437\u0430\u043c\u0435\u0440 \u0441\u00a0\u043e\u0442\u043a\u043b\u044e\u0447\u0451\u043d\u043d\u044b\u043c \u0434\u0438\u0441\u043f\u043b\u0435\u0435\u043c (<code>DEBUG_NO_ST7355<\/code>). \u0418 \u0432\u043e\u0442 \u0442\u0443\u0442 \u043c\u043e\u044f \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0430 \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0430 \u0441\u0435\u0431\u044f \u0432\u043e\u00a0\u0432\u0441\u0435\u0439 \u043a\u0440\u0430\u0441\u0435: <strong>\u041e\u0442 10\u00a0\u0434\u043e 15\u00a0FPS! <\/strong><em>(\u0441\u0440\u0435\u0434\u043d\u044f\u044f 12)<\/em><\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"center\"><strong>\u0422\u0438\u043a\u0438<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"center\"><strong>FPS<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"center\">19\u202f990<\/p>\n<\/td>\n<td>\n<p align=\"center\">12.51<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"center\">20\u202f007<\/p>\n<\/td>\n<td>\n<p align=\"center\">12.49<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"center\">19\u202f933<\/p>\n<\/td>\n<td>\n<p align=\"center\">12.54<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"center\">19\u202f983<\/p>\n<\/td>\n<td>\n<p align=\"center\">12.51<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"center\">20\u202f174<\/p>\n<\/td>\n<td>\n<p align=\"center\">12.39<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c \u0432\u0441\u044f \u043b\u043e\u0433\u0438\u043a\u0430 \u0434\u0432\u0438\u0436\u043a\u0430\u00a0\u2014 \u043e\u0431\u0445\u043e\u0434 \u0441\u0435\u043a\u0442\u043e\u0440\u043e\u0432, \u043f\u043e\u0440\u0442\u0430\u043b\u043e\u0432, \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u044f, \u043a\u043b\u0438\u043f\u043f\u0438\u043d\u0433, fixed\u2011point\u00a0\u2014 \u0443\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 66\u2013100\u00a0\u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434 \u043d\u0430\u00a0\u043a\u0430\u0434\u0440. \u041e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u044a\u0435\u0434\u0430\u0435\u0442 \u0441\u0430\u043c \u0434\u0438\u0441\u043f\u043b\u0435\u0439.<\/p>\n<div class=\"floating-image\">\n<figure class=\"float full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/extt\/aa\/48\/57\/aa4857407c7458e787b9d315cce7346d.png\" alt=\"\u0412\u044b\u0432\u043e\u0434 Serial-\u043f\u043e\u0440\u0442\u0430 - \u0442\u0435\u0441\u0442 \u0431\u0435\u0437 \u0434\u0438\u0441\u043f\u043b\u0435\u044f\" title=\"\u0412\u044b\u0432\u043e\u0434 Serial-\u043f\u043e\u0440\u0442\u0430 - \u0442\u0435\u0441\u0442 \u0431\u0435\u0437 \u0434\u0438\u0441\u043f\u043b\u0435\u044f\" width=\"684\" height=\"458\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/extt\/aa\/48\/57\/aa4857407c7458e787b9d315cce7346d.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/extt\/aa\/48\/57\/aa4857407c7458e787b9d315cce7346d.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0412\u044b\u0432\u043e\u0434 Serial\u2011\u043f\u043e\u0440\u0442\u0430\u00a0\u2014 \u0442\u0435\u0441\u0442 \u0431\u0435\u0437\u00a0\u0434\u0438\u0441\u043f\u043b\u0435\u044f<\/figcaption><\/div>\n<\/figure>\n<p>\u0418 \u0432\u043e\u0442 \u044d\u0442\u0438\u043c \u044f \u0433\u043e\u0440\u0436\u0443\u0441\u044c. \u041d\u0435 <strong>4.82\u00a0FPS<\/strong>, \u0430\u00a0\u0442\u0435\u043c, \u0447\u0442\u043e\u00a0<strong>\u0441\u0430\u043c \u0434\u0432\u0438\u0436\u043e\u043a<\/strong>\u00a0\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 <strong>10\u201315\u00a0FPS<\/strong> \u043d\u0430 <strong>8-\u0431\u0438\u0442\u043d\u043e\u043c \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0435<\/strong> \u0431\u0435\u0437\u00a0FPU. \u0412\u0441\u044f \u044d\u0442\u0430 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0430\u00a0\u2014 fixed\u2011point, BAM, LUT, \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0437\u0430\u0434\u0430\u0447 \u0432\u043c\u0435\u0441\u0442\u043e \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438\u00a0\u2014 \u043e\u043a\u0443\u043f\u0438\u043b\u0430\u0441\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u0437\u0434\u0435\u0441\u044c.<\/p>\n<\/div>\n<p><a class=\"anchor\" name=\"%D0%A1%D1%81%D1%8B%D0%BB%D0%BA%D0%B8\" id=\"\u0421\u0441\u044b\u043b\u043a\u0438\"><\/a><\/p>\n<h2>\u0421\u0441\u044b\u043b\u043a\u0438<\/h2>\n<p>\u0412\u0435\u0441\u044c \u043a\u043e\u0434 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043b\u0435\u0436\u0438\u0442 \u043d\u0430\u00a0GitHub: <a href=\"https:\/\/github.com\/RootTool0\/MicroBuild\" rel=\"noopener nofollow\"><strong>RootTool0\/MicroBuild<\/strong><\/a><\/p>\n<\/div>\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:\/\/habr.com\/ru\/articles\/1094808\/\">https:\/\/habr.com\/ru\/articles\/1094808\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u041e\u0433\u043b\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435\u041d\u0435\u0441\u043f\u0440\u0430\u0432\u0435\u0434\u043b\u0438\u0432\u043e\u0441\u0442\u044c, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043b\u0430 \u043d\u0430\u00a0AVR\u041f\u043e\u0447\u0435\u043c\u0443 Build Engine, \u0430\u00a0\u043d\u0435\u00a0DOOM Engine\u041a\u0440\u0430\u0442\u043a\u043e \u043e\u00a0\u0441\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u0445 \u0434\u0432\u0438\u0436\u043a\u0430\u0445\u0421\u0435\u043a\u0442\u043e\u0440, \u0441\u0442\u0435\u043d\u0430 \u0438 \u043c\u0430\u0433\u0438\u044f \u043f\u043e\u0440\u0442\u0430\u043b\u043e\u0432\u041a\u0430\u043a 2D\u2011\u043a\u0430\u0440\u0442\u0430 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 3D\u2011\u043c\u0438\u0440\u041f\u0438\u0448\u0435\u043c MicroBuild \u043d\u0430\u00a0\u0441\u043f\u0438\u0447\u0435\u0447\u043d\u043e\u043c \u043a\u043e\u0440\u043e\u0431\u043a\u0435\u041f\u0440\u043e\u0442\u043e\u0442\u0438\u043f \u043d\u0430\u00a0SDL2\u00a0\u0438 \u0432\u043e\u0439\u043d\u0430 \u0441\u00a0\u0442\u0438\u043f\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445Fixed\u2011Point \u0430\u0440\u0438\u0444\u043c\u0435\u0442\u0438\u043a\u0430\u0411\u0438\u043d\u0430\u0440\u043d\u043e\u0435 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u0435 \u0443\u0433\u043b\u043e\u0432 (BAM)\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0430 \u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0441\u0438\u043d\u0443\u0441\u043e\u0432 (LUT)\u0423\u0436\u0430\u0441\u043d\u0430\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f \u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0432\u00a0\u0434\u0443\u0445\u0435 ECSTHE CAKE IS A LIE!\u0421\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u044b \u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043a\u0430\u0440\u0442\u0411\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438\u0421\u0441\u044b\u043b\u043a\u0438\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440!\u042d\u0442\u043e \u043c\u043e\u044f \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f, \u0438 \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u044f \u0445\u043e\u0447\u0443 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u043e\u043f\u044b\u0442\u043e\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u0441\u0435\u0432\u0434\u043e-3D \u0434\u0432\u0438\u0436\u043a\u0430 \u0434\u043b\u044f\u00a0\u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u0432 AVR. \u041f\u0440\u043e\u0435\u043a\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043b\u043e\u0436\u043d\u044b\u043c, \u043d\u043e\u00a0\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u043c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0440\u0435\u0448\u0438\u043b \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0435\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438 \u0442\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438, \u043a\u00a0\u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043f\u0440\u0438\u0431\u0435\u0433\u043d\u0443\u0442\u044c.\u041d\u0438\u0436\u0435 \u043f\u043e\u0434\u00a0\u0441\u043f\u043e\u0439\u043b\u0435\u0440\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430\u00a0\u0444\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0434\u0432\u0438\u0436\u043a\u0430.\u0421\u043f\u043e\u0439\u043b\u0435\u0440!\u041d\u0435\u0441\u043f\u0440\u0430\u0432\u0435\u0434\u043b\u0438\u0432\u043e\u0441\u0442\u044c, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043b\u0430 \u043d\u0430\u00a0AVR\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 AVR \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0432\u00a0\u043c\u043e\u0435\u043c \u0441\u0435\u0440\u0434\u0446\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0435 \u043c\u0435\u0441\u0442\u043e\u00a0\u2014 \u0438\u043c\u0435\u043d\u043d\u043e \u043d\u0430\u00a0\u044d\u0442\u0438\u0445 \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430\u0445 \u044f \u043a\u043e\u0433\u0434\u0430\u2011\u0442\u043e \u0443\u0447\u0438\u043b\u0441\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u0418 \u0432\u043e\u0442, \u0437\u0430\u043d\u0438\u043c\u0430\u044f\u0441\u044c \u0433\u0435\u0439\u043c\u0434\u0435\u0432\u043e\u043c, \u044f \u0432\u00a0\u043a\u0430\u043a\u043e\u0439\u2011\u0442\u043e \u043c\u043e\u043c\u0435\u043d\u0442 \u0437\u0430\u0434\u0430\u043b\u0441\u044f \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u043c: \u0430\u00a0\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b\u00a0\u043b\u0438 \u043a\u0442\u043e\u2011\u043d\u0438\u0431\u0443\u0434\u044c \u043d\u0430\u00a0AVR \u0447\u0435\u0441\u0442\u043d\u043e\u0435, \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e\u0435 \u043f\u0441\u0435\u0432\u0434\u043e-3D? \u0412\u0435\u0434\u044c \u044f \u0445\u043e\u0440\u043e\u0448\u043e \u0437\u043d\u0430\u044e \u044d\u0442\u0438 \u0447\u0438\u043f\u044b \u0438 \u0438\u0441\u043a\u0440\u0435\u043d\u043d\u0435 \u0432\u0435\u0440\u0438\u043b, \u0447\u0442\u043e\u00a0\u043e\u043d\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u044b \u043d\u0430\u00a0\u0431\u043e\u043b\u044c\u0448\u0435\u0435.\u041c\u043e\u0439 \u043f\u043e\u0438\u0441\u043a\u043e\u0432\u044b\u0439 \u0437\u0430\u0431\u0435\u0433 \u043f\u043e\u00a0\u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c \u0432\u0440\u043e\u0434\u0435 \u00ab3D Graphics on Arduino\u00bb \u0438 \u00abDOOM on Arduino\u00bb \u043f\u0440\u0438\u043d\u0435\u0441 \u043b\u0438\u0448\u044c \u0440\u0430\u0437\u043e\u0447\u0430\u0440\u043e\u0432\u0430\u043d\u0438\u0435. \u0412\u00a0\u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0432\u0441\u0451 \u0441\u0432\u043e\u0434\u0438\u043b\u043e\u0441\u044c \u043a\u00a0\u043a\u0430\u0440\u043a\u0430\u0441\u043d\u044b\u043c \u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0438\u043c\u0441\u044f \u043a\u0443\u0431\u0430\u043c. \u041c\u0430\u043a\u0441\u0438\u043c\u0443\u043c, \u0447\u0442\u043e\u00a0\u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043d\u0430\u0439\u0442\u0438\u00a0\u2014 \u043f\u0440\u043e\u0435\u043a\u0442 Doom\u2011Nano. \u041d\u043e\u00a0\u043f\u0440\u0438\u00a0\u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0435\u043c \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u0438 \u043e\u043d \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0440\u0435\u0439\u043a\u0430\u0441\u0442\u0435\u0440\u043e\u043c \u0432\u00a0\u0434\u0443\u0445\u0435 Wolfenstein 3D (\u0431\u0440\u043e\u0441\u0430\u0435\u043c \u043b\u0443\u0447\u0438 \u0438\u0437\u00a0\u043a\u0430\u043c\u0435\u0440\u044b \u043f\u043e\u00a0\u0434\u0432\u0443\u0445\u043c\u0435\u0440\u043d\u043e\u0439 \u0441\u0435\u0442\u043a\u0435, \u0430\u00a0\u043f\u0440\u0438\u00a0\u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0438 \u0440\u0438\u0441\u0443\u0435\u043c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u043b\u0438\u043d\u0438\u044e). \u041f\u0440\u043e\u0435\u043a\u0442 \u043a\u043b\u0430\u0441\u0441\u043d\u044b\u0439, \u043d\u043e&#8230; \u044d\u0442\u043e \u043d\u0435\u00a0DOOM.\u0418 \u0442\u0443\u0442 \u0432\u043e\u00a0\u043c\u043d\u0435 \u0432\u0437\u044b\u0433\u0440\u0430\u043b\u0430 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043d\u0430\u044f \u0433\u043e\u0440\u0434\u043e\u0441\u0442\u044c. \u0418\u0434\u0435\u044f \u0440\u043e\u0434\u0438\u043b\u0430\u0441\u044c \u0441\u0430\u043c\u0430 \u0441\u043e\u0431\u043e\u0439: \u0432\u0437\u044f\u0442\u044c DOOM, \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0432\u00a0\u0435\u0433\u043e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435 \u0438 \u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u00a0AVR. \u0414\u0435\u043b\u043e\u0432\u2011\u0442\u043e!\u041f\u043e\u0447\u0435\u043c\u0443 Build Engine, \u0430\u00a0\u043d\u0435\u00a0DOOM Engine\u041d\u043e\u00a0\u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0431\u044b\u0441\u0442\u0440\u043e \u0441\u043f\u0443\u0441\u0442\u0438\u043b\u0430 \u043c\u0435\u043d\u044f \u0441\u00a0\u043d\u0435\u0431\u0435\u0441 \u043d\u0430\u00a0\u0437\u0435\u043c\u043b\u044e. \u042f \u0447\u0435\u0441\u0442\u043d\u043e \u043f\u044b\u0442\u0430\u043b\u0441\u044f \u0441\u00a0\u043d\u0430\u0441\u043a\u043e\u043a\u0430 \u0440\u0430\u0441\u043a\u0443\u0441\u0438\u0442\u044c BSP\u2011\u0434\u0435\u0440\u0435\u0432\u044c\u044f (Binary Space Partitioning), \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0414\u0436\u043e\u043d \u041a\u0430\u0440\u043c\u0430\u043a. \u0427\u0438\u0442\u0430\u043b \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e, \u0441\u043c\u043e\u0442\u0440\u0435\u043b \u0441\u0445\u0435\u043c\u044b, \u043d\u043e\u00a0\u0432\u00a0\u043a\u0430\u043a\u043e\u0439\u2011\u0442\u043e \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u043e\u043d\u044f\u043b: \u041a\u0430\u0440\u043c\u0430\u043a \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0433\u0435\u043d\u0438\u0430\u043b\u0435\u043d, \u0430\u00a0BSP\u2011\u0434\u0435\u0440\u0435\u0432\u044c\u044f \u0434\u043b\u044f\u00a0\u043c\u0435\u043d\u044f\u00a0\u2014 \u044d\u0442\u043e \u043f\u043e\u043a\u0430 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0442\u0435\u043c\u043d\u0430\u044f \u043c\u0430\u0433\u0438\u044f.Duke Nukem 3D (1996)\u041a\u043e\u0433\u0434\u0430 \u044f \u0443\u0436\u0435 \u0433\u043e\u0442\u043e\u0432 \u0431\u044b\u043b \u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0440\u0443\u043a\u0438, \u0432\u044b\u044f\u0441\u043d\u0438\u043b\u043e\u0441\u044c, \u0447\u0442\u043e\u00a0\u044f \u043d\u0435\u00a0\u043e\u0434\u0438\u043d \u0442\u0430\u043a\u043e\u0439. \u041f\u0440\u044f\u043c\u043e \u043f\u043e\u00a0\u0441\u043e\u0441\u0435\u0434\u0441\u0442\u0432\u0443 \u0432\u00a0\u044d\u0442\u043e\u0439 \u043b\u043e\u0434\u043a\u0435 \u043d\u0435\u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0441\u0438\u0434\u0435\u043b \u043b\u0435\u0433\u0435\u043d\u0434\u0430\u0440\u043d\u044b\u0439 \u041a\u0435\u043d \u0421\u0438\u043b\u044c\u0432\u0435\u0440\u043c\u0430\u043d. \u0412 1993\u00a0\u0433\u043e\u0434\u0443, \u043a\u043e\u0433\u0434\u0430 \u0432\u044b\u0448\u0435\u043b DOOM, \u041a\u0435\u043d \u0442\u043e\u0436\u0435 \u043f\u044b\u0442\u0430\u043b\u0441\u044f \u043f\u043e\u043d\u044f\u0442\u044c, \u043a\u0430\u043a\u00a0\u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 BSP\u2011\u0434\u0435\u0440\u0435\u0432\u044c\u044f. \u041d\u0438\u0447\u0435\u0433\u043e \u043d\u0435\u00a0\u043f\u043e\u043d\u044f\u043b, \u043f\u043b\u044e\u043d\u0443\u043b \u0438 \u0438\u0437\u043e\u0431\u0440\u0435\u043b \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u00a0\u2014 Portal\u2011based Rendering (\u0441\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u0435 \u0434\u0432\u0438\u0436\u043a\u0438), \u043d\u0430\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043f\u043e\u0437\u0436\u0435 \u0432\u0437\u043b\u0435\u0442\u0435\u043b \u043b\u0435\u0433\u0435\u043d\u0434\u0430\u0440\u043d\u044b\u0439 Duke Nukem 3D.\u0412\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043f\u0435\u043a\u0430\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u0443\u044e \u043a\u0430\u0440\u0442\u0443 \u0432\u00a0\u0434\u0435\u0440\u0435\u0432\u043e \u043d\u0430\u00a0\u041f\u041a, \u0441\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u0439 \u0434\u0432\u0438\u0436\u043e\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u0440\u044f\u043c\u043e \u0432\u00a0\u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435. \u041e\u043d \u043f\u0440\u043e\u0435\u0446\u0438\u0440\u0443\u0435\u0442 \u0441\u0442\u0435\u043d\u044b \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0441\u0435\u043a\u0442\u043e\u0440\u0430, \u0430\u00a0\u0435\u0441\u043b\u0438 \u0432\u00a0\u0441\u0442\u0435\u043d\u0435 \u0435\u0441\u0442\u044c \u00ab\u0434\u044b\u0440\u0430\u00bb (\u043f\u043e\u0440\u0442\u0430\u043b) \u0432\u00a0\u0441\u043e\u0441\u0435\u0434\u043d\u0438\u0439 \u0441\u0435\u043a\u0442\u043e\u0440\u00a0\u2014 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u0435\u0442 \u0438 \u0435\u0433\u043e. \u0412\u0441\u0451 \u043f\u0440\u043e\u0441\u0442\u043e\u0435\u00a0\u2014 \u0433\u0435\u043d\u0438\u0430\u043b\u044c\u043d\u043e!\u0422\u0430\u043a \u0440\u043e\u0434\u0438\u043b\u0441\u044f \u043f\u0440\u043e\u0435\u043a\u0442 MicroBuild \u2014 \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u0437\u0430\u0441\u0443\u043d\u0443\u0442\u044c \u0441\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u0439 3D\u2011\u0434\u0432\u0438\u0436\u043e\u043a \u0432\u00a0\u0441\u043f\u0438\u0447\u0435\u0447\u043d\u0443\u044e \u043a\u043e\u0440\u043e\u0431\u043a\u0443 \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 AVR. \u041e\u00a0\u0442\u043e\u043c, \u043a\u0430\u043a\u00a0\u044f \u0431\u043e\u0440\u043e\u043b\u0441\u044f \u0437\u0430\u00a0\u043a\u0430\u0436\u0434\u044b\u0439 \u0431\u0430\u0439\u0442 \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u0441\u00a0\u043a\u0430\u043a\u0438\u043c\u0438 \u0433\u0440\u0430\u0431\u043b\u044f\u043c\u0438 \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0441\u044f, \u044f \u0438 \u0445\u043e\u0447\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c.\u041a\u0440\u0430\u0442\u043a\u043e \u043e\u00a0\u0441\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u0445 \u0434\u0432\u0438\u0436\u043a\u0430\u0445\u0421\u0435\u043a\u0442\u043e\u0440, \u0441\u0442\u0435\u043d\u0430 \u0438 \u043c\u0430\u0433\u0438\u044f \u043f\u043e\u0440\u0442\u0430\u043b\u043e\u0432\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u043b\u044e\u0431\u043e\u0433\u043e \u0441\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u0434\u0432\u0438\u0436\u043a\u0430 \u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u043d\u0430\u00a0\u0442\u0440\u0435\u0445 \u043a\u0438\u0442\u0430\u0445: \u0441\u0435\u043a\u0442\u043e\u0440\u0430\u0445, \u0441\u0442\u0435\u043d\u0430\u0445 \u0438 \u043f\u043e\u0440\u0442\u0430\u043b\u0430\u0445. \u0412\u00a0\u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442\u00a0\u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0434\u0432\u0438\u0436\u043a\u043e\u0432, \u0437\u0434\u0435\u0441\u044c \u043c\u0438\u0440 \u043d\u0435\u00a0\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0435\u0434\u0438\u043d\u043e\u0439 3D\u2011\u0441\u0435\u0442\u043a\u043e\u0439. \u041a\u0430\u0440\u0442\u0430 \u0436\u0435\u0441\u0442\u043a\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0430 \u043d\u0430\u00a0\u0434\u0432\u0430 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0434\u0430\u043d\u043d\u044b\u0445: \u0441\u0442\u0435\u043d\u044b \u0438 \u0441\u0435\u043a\u0442\u043e\u0440\u0430.\u0412\u00a0\u043a\u043e\u0434\u0435 MicroBuild \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043b\u0430\u043a\u043e\u043d\u0438\u0447\u043d\u043e:static FWall GWalls[] = { &#8230; };static FSector GSectors[] = { &#8230; };\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u0430\u043d\u0430\u0442\u043e\u043c\u0438\u044e \u044d\u0442\u0438\u0445 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439.\u0421\u0442\u0435\u043d\u044b (FWall)\u0412\u00a0\u0441\u0430\u043c\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u043c \u0432\u0438\u0434\u0435 \u0441\u0442\u0435\u043d\u0430\u00a0\u2014 \u044d\u0442\u043e \u043e\u0442\u0440\u0435\u0437\u043e\u043a \u043d\u0430\u00a0\u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438, \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0439 \u0434\u0432\u0443\u043c\u044f \u0442\u043e\u0447\u043a\u0430\u043c\u0438, \u0438 \u0435\u0451 \u0446\u0432\u0435\u0442 (\u0438\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b). \u041e\u0434\u043d\u0430\u043a\u043e \u0432\u00a0\u043f\u043e\u0440\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0434\u0432\u0438\u0436\u043a\u0430\u0445 \u0441\u0442\u0435\u043d\u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u00ab\u043e\u043a\u043d\u043e\u043c\u00bb \u0432\u00a0\u0441\u043e\u0441\u0435\u0434\u043d\u044e\u044e \u043a\u043e\u043c\u043d\u0430\u0442\u0443. \u0414\u043b\u044f\u00a0\u044d\u0442\u043e\u0433\u043e \u0432\u00a0\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0432\u0432\u043e\u0434\u044f\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043f\u043e\u0440\u0442\u0430\u043b\u0430:struct FWall{    FIntVector2D Point1, Point2; \/\/ \u041a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043d\u0430\u0447\u0430\u043b\u0430 \u0438 \u043a\u043e\u043d\u0446\u0430 \u0441\u0442\u0435\u043d\u044b (2D)    uint8 WallPaletteIndex;      \/\/ \u0418\u043d\u0434\u0435\u043a\u0441 \u0446\u0432\u0435\u0442\u0430 \u0441\u0442\u0435\u043d\u044b \u0432 \u043f\u0430\u043b\u0438\u0442\u0440\u0435    int8 PortalNextSector;       \/\/ \u041d\u043e\u043c\u0435\u0440 \u0441\u0435\u043a\u0442\u043e\u0440\u0430 \u0437\u0430 \u044d\u0442\u043e\u0439 \u0441\u0442\u0435\u043d\u043e\u0439 (-1, \u0435\u0441\u043b\u0438 \u0441\u0442\u0435\u043d\u0430 \u0433\u043b\u0443\u0445\u0430\u044f)    int8 PortalNextWall;         \/\/ \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0435\u043d\u044b \u0432 \u0441\u043e\u0441\u0435\u0434\u043d\u0435\u043c \u0441\u0435\u043a\u0442\u043e\u0440\u0435    FAngle PortalAngleDelta;     \/\/ \u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0443\u0433\u043b\u0430 \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0435 (\u0434\u043b\u044f \u043d\u0435\u0435\u0432\u043a\u043b\u0438\u0434\u043e\u0432\u043e\u0439 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438)};\u0421\u0435\u043a\u0442\u043e\u0440\u0430 (FSector)\u0421\u0435\u043a\u0442\u043e\u0440\u00a0\u2014 \u044d\u0442\u043e \u0432\u044b\u043f\u0443\u043a\u043b\u044b\u0439 \u043c\u043d\u043e\u0433\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u0443\u044e \u043a\u043e\u043c\u043d\u0430\u0442\u0443. \u041e\u043d \u043d\u0435\u00a0\u0445\u0440\u0430\u043d\u0438\u0442 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0441\u0430\u043c \u043f\u043e\u00a0\u0441\u0435\u0431\u0435. \u0412\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u043e\u043d \u0437\u043d\u0430\u0435\u0442 \u0432\u044b\u0441\u043e\u0442\u0443 \u0441\u0432\u043e\u0435\u0433\u043e \u043f\u043e\u043b\u0430, \u043f\u043e\u0442\u043e\u043b\u043a\u0430 \u0438 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u00ab\u0441\u0440\u0435\u0437\u00bb \u0432\u00a0\u043e\u0431\u0449\u0435\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0435 \u0441\u0442\u0435\u043d, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0435\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0430\u044e\u0442:struct FSector{    int8 FloorZ;             \/\/ \u0412\u044b\u0441\u043e\u0442\u0430 \u043f\u043e\u043b\u0430    int8 CeilZ;              \/\/ \u0412\u044b\u0441\u043e\u0442\u0430 \u043f\u043e\u0442\u043e\u043b\u043a\u0430    uint8 WallStartIndex;    \/\/ \u0418\u043d\u0434\u0435\u043a\u0441 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0435\u043d\u044b \u0441\u0435\u043a\u0442\u043e\u0440\u0430 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 GWalls    uint8 WallCount;         \/\/ \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0435\u043d \u0443 \u044d\u0442\u043e\u0433\u043e \u0441\u0435\u043a\u0442\u043e\u0440\u0430    uint8 CeilPaletteIndex;  \/\/ \u0426\u0432\u0435\u0442 \u043f\u043e\u0442\u043e\u043b\u043a\u0430 \u043f\u043e \u043f\u0430\u043b\u0438\u0442\u0440\u0435    uint8 FloorPaletteIndex; \/\/ \u0426\u0432\u0435\u0442 \u043f\u043e\u043b\u0430 \u043f\u043e \u043f\u0430\u043b\u0438\u0442\u0440\u0435};\u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0442\u0430\u043a\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435, \u043e\u0431\u0445\u043e\u0434 \u043a\u0430\u0440\u0442\u044b \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u0431\u044b\u0441\u0442\u0440\u044b\u043c: \u043c\u044b \u0437\u043d\u0430\u0435\u043c, \u0432\u00a0\u043a\u0430\u043a\u043e\u043c \u0441\u0435\u043a\u0442\u043e\u0440\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0438\u0433\u0440\u043e\u043a, \u0431\u0435\u0440\u0435\u043c \u0435\u0433\u043e \u0441\u0442\u0435\u043d\u044b, \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u0435\u043c \u0438\u0445, \u0430\u00a0\u0435\u0441\u043b\u0438 \u043d\u0430\u0442\u044b\u043a\u0430\u0435\u043c\u0441\u044f \u043d\u0430\u00a0\u0441\u0442\u0435\u043d\u0443, \u0433\u0434\u0435\u00a0PortalNextSector != -1, \u0442\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a\u00a0\u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0441\u0435\u043a\u0442\u043e\u0440\u0430.\u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u0430\u0440\u0442\u044b ThreeMaps.h: 13\u00a0\u0441\u0442\u0435\u043d \u0438 3\u00a0\u0441\u0435\u043a\u0442\u043e\u0440\u0430\u041a\u0430\u043a 2D\u2011\u043a\u0430\u0440\u0442\u0430 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 3D\u2011\u043c\u0438\u0440\u0412\u0441\u044f \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044f \u043f\u0441\u0435\u0432\u0434\u043e-3D \u0434\u0432\u0438\u0436\u043a\u043e\u0432 \u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u043d\u0430\u00a0\u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0435 \u0443\u0440\u043e\u0432\u043d\u044f \u0448\u043a\u043e\u043b\u044c\u043d\u043e\u0439 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438. \u041d\u0438\u043a\u0430\u043a\u0438\u0445 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0447\u0435\u0442\u044b\u0440\u0435\u0445\u043c\u0435\u0440\u043d\u044b\u0445 \u043a\u0432\u0430\u0442\u0435\u0440\u043d\u0438\u043e\u043d\u043e\u0432\u00a0\u2014 \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430 \u0438 \u0437\u0430\u043a\u043e\u043d \u043f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u044b.\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u0434\u0432\u0443\u0445 \u0442\u043e\u0447\u0435\u043a \u0441\u0442\u0435\u043d\u044b \u0438\u0437\u00a0\u043f\u043b\u043e\u0441\u043a\u043e\u0439 \u043a\u0430\u0440\u0442\u044b \u0432\u00a0\u0442\u0440\u0435\u0445\u043c\u0435\u0440\u043d\u0443\u044e \u043a\u043e\u043b\u043e\u043d\u043d\u0443 \u043d\u0430\u00a0\u044d\u043a\u0440\u0430\u043d\u0435 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437\u00a0\u0447\u0435\u0442\u044b\u0440\u0435\u0445 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0448\u0430\u0433\u043e\u0432.\u0428\u0430\u0433 1. \u041f\u0435\u0440\u0435\u043d\u043e\u0441 \u0432\u00a0\u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0438 \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u044b \u0431\u0435\u0440\u0435\u043c \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0441\u0442\u0435\u043d\u044b \u0438 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u043c \u0438\u0445 \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0438\u0433\u0440\u043e\u043a \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u0432\u00a0\u0446\u0435\u043d\u0442\u0440\u0435 \u0432\u0441\u0435\u043b\u0435\u043d\u043d\u043e\u0439 (\u0432 \u0442\u043e\u0447\u043a\u0435 0, 0).\/\/ \u041f\u0435\u0440\u0435\u043d\u043e\u0441 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043a\u0430\u043c\u0435\u0440\u044bconst FVector2D D1 = Wall.Point1 &#8212; InCameraLocation;const FVector2D D2 = Wall.Point2 &#8212; InCameraLocation;\/\/ \u041e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043f\u043e\u0432\u043e\u0440\u043e\u0442, \u0447\u0442\u043e\u0431\u044b \u0441\u0442\u0435\u043d\u0430 \u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c \u043b\u0438\u0446\u043e\u043c \u043a \u0438\u0433\u0440\u043e\u043a\u0443FVector2D T1 = FVector2D(D1.X * CosA + D1.Y * SinA, D1.Y * CosA &#8212; D1.X * SinA);FVector2D T2 = FVector2D(D2.X * CosA + D2.Y * SinA, D2.Y * CosA &#8212; D2.X * SinA);\u0422\u0435\u043f\u0435\u0440\u044c \u0432\u00a0\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u0445 T1\u00a0\u0438 T2\u00a0\u043e\u0441\u044c X \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430\u00a0\u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0432\u043b\u0435\u0432\u043e\u2011\u0432\u043f\u0440\u0430\u0432\u043e \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u0437\u0433\u043b\u044f\u0434\u0430 \u0438\u0433\u0440\u043e\u043a\u0430, \u0430\u00a0Y\u00a0\u2014 \u0437\u0430\u00a0\u0433\u043b\u0443\u0431\u0438\u043d\u0443 (\u0432\u043f\u0435\u0440\u0435\u0434\u2011\u043d\u0430\u0437\u0430\u0434). \u0417\u0434\u0435\u0441\u044c\u00a0\u0436\u0435 \u0440\u043e\u0436\u0434\u0430\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0432\u0430\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f: \u0435\u0441\u043b\u0438 Y \u043e\u0431\u0435\u0438\u0445 \u0442\u043e\u0447\u0435\u043a \u043c\u0435\u043d\u044c\u0448\u0435 \u043d\u0443\u043b\u044f, \u0442\u043e \u0441\u0442\u0435\u043d\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0437\u0430\u00a0\u0441\u043f\u0438\u043d\u043e\u0439. \u041c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0435\u0451 \u0447\u0435\u0440\u0435\u0437\u00a0continue.\u0428\u0430\u0433 2. \u0411\u043b\u0438\u0436\u043d\u0438\u0439 \u043a\u043b\u0438\u043f\u043f\u0438\u043d\u0433 (Near Clipping)\u0415\u0441\u043b\u0438 \u0438\u0433\u0440\u043e\u043a \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u043a\u00a0\u0441\u0442\u0435\u043d\u0435 \u0432\u043f\u043b\u043e\u0442\u043d\u0443\u044e \u0438\u043b\u0438\u00a0\u0432\u0441\u0442\u0430\u0435\u0442 \u0432\u0434\u043e\u043b\u044c \u043d\u0435\u0435, \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430 Y \u043e\u0434\u043d\u043e\u0439 \u0438\u0437\u00a0\u0442\u043e\u0447\u0435\u043a \u0441\u0442\u0440\u0435\u043c\u0438\u0442\u0441\u044f \u043a\u00a0\u043d\u0443\u043b\u044e. \u041f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043d\u0430\u00a0\u043d\u043e\u043b\u044c \u0441\u043b\u043e\u043c\u0430\u0435\u0442 fixed\u2011point \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0443 \u0438 \u0443\u0432\u0435\u0434\u0435\u0442 \u0440\u0430\u0441\u0447\u0435\u0442\u044b \u0432\u00a0\u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0441\u0442\u044c.\u0427\u0442\u043e\u0431\u044b \u044d\u0442\u043e\u0433\u043e \u043d\u0435\u00a0\u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u043b\u043e, \u043c\u044b \u043e\u0442\u0441\u0435\u043a\u0430\u0435\u043c \u0441\u0442\u0435\u043d\u0443 \u043f\u043e\u00a0\u0431\u043b\u0438\u0436\u043d\u0435\u0439 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 (NearZ). \u0415\u0441\u043b\u0438 \u0442\u043e\u0447\u043a\u0430 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u0435\u0442 \u044d\u0442\u0443 \u043d\u0435\u0432\u0438\u0434\u0438\u043c\u0443\u044e \u043b\u0438\u043d\u0438\u044e, \u043c\u044b \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e \u043f\u0435\u0440\u0435\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u0435\u0451 X \u0438 Y \u043d\u0430\u00a0\u0433\u0440\u0430\u043d\u0438\u0446\u0435 \u043e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u044f:constexpr FFixedFloat NearZ = FFixedFloat::ZeroPointFive;if(T1.Y &lt;= NearZ) {     if(T2.Y == T1.Y) continue;     T1.X = T1.X + (T2.X &#8212; T1.X) * (NearZ &#8212; T1.Y) \/ (T2.Y &#8212; T1.Y);     T1.Y = NearZ; }if(T2.Y &lt;= NearZ) {     if(T2.Y == T1.Y) continue;     T2.X = T2.X + (T1.X &#8212; T2.X) * (NearZ &#8212; T2.Y) \/ (T1.Y &#8212; T2.Y);     T2.Y = NearZ; }\u0428\u0430\u0433 3. \u041f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u043d\u0430\u044f \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u044f\u0414\u0430\u043b\u044c\u0448\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0437\u0430\u043a\u043e\u043d \u043f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u044b: \u0447\u0435\u043c \u0434\u0430\u043b\u044c\u0448\u0435 \u043e\u0431\u044a\u0435\u043a\u0442 (\u0431\u043e\u043b\u044c\u0448\u0435 Y), \u0442\u0435\u043c \u043c\u0435\u043d\u044c\u0448\u0435 \u043e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043d\u0430\u00a0\u044d\u043a\u0440\u0430\u043d\u0435. \u041c\u044b \u0434\u0435\u043b\u0438\u043c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043d\u0430\u00a0\u0433\u043b\u0443\u0431\u0438\u043d\u0443 Y \u0438 \u043f\u0440\u043e\u0435\u0446\u0438\u0440\u0443\u0435\u043c \u0438\u0445 \u043d\u0430\u00a0\u044d\u043a\u0440\u0430\u043d:\/\/ \u041f\u0440\u043e\u0435\u043a\u0446\u0438\u044f \u043f\u043e \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u0438 (X-\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u044d\u043a\u0440\u0430\u043d\u0430)const int16 X1 = WINDOW_HALF_WIDTH + (T1.X * FovDistance \/ T1.Y).ToInt();const int16 X2 = WINDOW_HALF_WIDTH + (T2.X * FovDistance \/ T2.Y).ToInt();if (X1 &gt;= X2) continue; \/\/ \u041e\u0442\u0441\u0435\u043a\u0430\u0435\u043c \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044b\u0435 \u0441\u043f\u0438\u043d\u043e\u0439 \u0441\u0442\u0435\u043d\u044b\/\/ \u041f\u0440\u043e\u0435\u043a\u0446\u0438\u044f \u043f\u043e \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u0438 (\u0432\u044b\u0441\u043e\u0442\u0430 \u043f\u043e\u043b\u0430 \u0438 \u043f\u043e\u0442\u043e\u043b\u043a\u0430)const int16 Ceil1  = WINDOW_HALF_HEIGHT &#8212; (FFixedFloat(Sector.CeilZ  &#8212; FPlayer::LocationZ) * FovDistance \/ T1.Y).ToInt();const int16 Floor1 = WINDOW_HALF_HEIGHT &#8212; (FFixedFloat(Sector.FloorZ &#8212; FPlayer::LocationZ) * FovDistance \/ T1.Y).ToInt();const int16 Ceil2  = WINDOW_HALF_HEIGHT &#8212; (FFixedFloat(Sector.CeilZ  &#8212; FPlayer::LocationZ) * FovDistance \/ T2.Y).ToInt();const int16 Floor2 = WINDOW_HALF_HEIGHT &#8212; (FFixedFloat(Sector.FloorZ &#8212; FPlayer::LocationZ) * FovDistance \/ T2.Y).ToInt();\u041f\u043e\u0442\u043e\u043b\u043e\u043a \u0438 \u043f\u043e\u043b \u0441\u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e, \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u00a0Z: \u0434\u043b\u044f\u00a0\u043f\u043e\u0442\u043e\u043b\u043a\u0430 \u0431\u0435\u0440\u0435\u043c\u00a0CeilZ, \u0434\u043b\u044f\u00a0\u043f\u043e\u043b\u0430\u00a0\u2014\u00a0FloorZ.\u0428\u0430\u0433 4. \u0420\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u043f\u043e\u043b\u043e\u0441\u0430\u043c\u0438\u0412\u0441\u0451, \u0447\u0442\u043e\u00a0\u043d\u0430\u043c \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c\u00a0\u2014 \u043f\u0440\u043e\u0439\u0442\u0438 \u0446\u0438\u043a\u043b\u043e\u043c \u043e\u0442\u00a0\u043b\u0435\u0432\u043e\u0439 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0441\u0442\u0435\u043d\u044b X1\u00a0\u0434\u043e\u00a0\u043f\u0440\u0430\u0432\u043e\u0439 X2. \u041c\u044b \u043b\u0438\u043d\u0435\u0439\u043d\u043e \u0438\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u0438\u0440\u0443\u0435\u043c (Lerp) \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432\u044b\u0441\u043e\u0442\u044b \u043f\u043e\u043b\u0430 \u0438 \u043f\u043e\u0442\u043e\u043b\u043a\u0430 \u043c\u0435\u0436\u0434\u0443 \u043f\u0435\u0440\u0432\u043e\u0439 \u0438 \u0432\u0442\u043e\u0440\u043e\u0439 \u0442\u043e\u0447\u043a\u043e\u0439 \u0438 \u0440\u0438\u0441\u0443\u0435\u043c \u0441\u0442\u0435\u043d\u0443 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u043b\u0438\u043d\u0438\u044f\u043c\u0438 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439, \u043a\u0430\u043a\u00a0\u0432\u00a0\u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u043c Wolfenstein 3D \u0434\u0432\u0438\u0436\u043a\u0435.if (Wall.PortalNextSector == -1) \/\/ \u0415\u0441\u043b\u0438 \u0441\u0442\u0435\u043d\u0430 \u0433\u043b\u0443\u0445\u0430\u044f{    for (int16 X = StartX; X &lt;= EndX; ++X)    {        const FFixedFloat Delta = FFixedFloat(X &#8212; X1) \/ FFixedFloat(X2 &#8212; X1);        const int16 Ceil  = FMath::Lerp(Ceil1 , Ceil2 , Delta);        const int16 Floor = FMath::Lerp(Floor1, Floor2, Delta);        \/\/ \u0420\u0438\u0441\u0443\u0435\u043c \u043a\u043e\u043d\u0442\u0443\u0440 \u0434\u043b\u044f \u043a\u0440\u0430\u0441\u043e\u0442\u044b, \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0446\u0432\u0435\u0442\u043e\u043c \u0438\u0437 \u043f\u0430\u043b\u0438\u0442\u0440\u044b        const FColor WallColor = (X == X1 || X == X2) ? FColor(0, 0, 0) : GPalette[Wall.WallPaletteIndex];        DrawWall(X, Ceil, Floor, WallColor);        \/\/ \u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u043a\u043b\u0438\u043f\u043f\u0438\u043d\u0433\u0430 \u0434\u043b\u044f \u043f\u043e\u0440\u0442\u0430\u043b\u043e\u0432        ClipTop[X]    = FMath::Clamp&lt;int16&gt;(Ceil , ClipTop[X], ClipBottom[X]);        ClipBottom[X] = FMath::Clamp&lt;int16&gt;(Floor, ClipTop[X], ClipBottom[X]);    }}\u041f\u0438\u0448\u0435\u043c MicroBuild \u043d\u0430\u00a0\u0441\u043f\u0438\u0447\u0435\u0447\u043d\u043e\u043c \u043a\u043e\u0440\u043e\u0431\u043a\u0435\u041f\u0435\u0440\u0435\u043d\u043e\u0441 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0438 \u043d\u0430\u00a0\u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0435 \u0436\u0435\u043b\u0435\u0437\u043e\u00a0\u2014 \u0441\u0430\u043c\u0430\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430\u044f \u0438 \u0441\u043b\u043e\u0436\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u0432 AVR \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u043e\u0441\u043c\u044b\u0441\u043b\u0438\u0442\u044c \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u043a\u0430\u0436\u0434\u0443\u044e \u0441\u0442\u0440\u043e\u0447\u043a\u0443 \u043a\u043e\u0434\u0430. \u041d\u043e\u00a0\u043e\u0431\u043e\u00a0\u0432\u0441\u0435\u043c \u043f\u043e\u00a0\u043f\u043e\u0440\u044f\u0434\u043a\u0443.\u041f\u0440\u043e\u0442\u043e\u0442\u0438\u043f \u043d\u0430\u00a0SDL2\u00a0\u0438 \u0432\u043e\u0439\u043d\u0430 \u0441\u00a0\u0442\u0438\u043f\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445\u0420\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0438 \u043e\u0442\u043b\u0430\u0436\u0438\u0432\u0430\u0442\u044c 3D\u2011\u0434\u0432\u0438\u0436\u043e\u043a \u0441\u0440\u0430\u0437\u0443 \u043d\u0430\u00a0\u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0435\u00a0\u2014 \u0437\u0430\u0442\u0435\u044f \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0448\u043d\u0430\u044f. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0435\u0440\u0432\u044b\u0439 \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f \u044f \u0441\u043e\u0431\u0440\u0430\u043b \u043d\u0430\u00a0\u041f\u041a \u0441\u00a0\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 SDL2. \u0411\u0430\u0437\u043e\u0432\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u0440\u0435\u043d\u0434\u0435\u0440\u0430 \u0437\u0430\u043d\u044f\u043b\u0430 \u043e\u0442\u00a0\u0441\u0438\u043b\u044b 100\u00a0\u0441\u0442\u0440\u043e\u043a \u043a\u043e\u0434\u0430.\u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043a\u0441\u0442\u0430\u0442\u0438 \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430\u0437\u044b\u0432\u0430\u043b\u0441\u044f \u00abCool 3D\u00bb:D\u0417\u0430\u0442\u0435\u043c \u044f \u0438\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0437\u0430\u0433\u043d\u0430\u043b \u041f\u041a\u2011\u0432\u0435\u0440\u0441\u0438\u044e \u0432\u00a0\u0440\u0430\u043c\u043a\u0438 \u0431\u0443\u0434\u0443\u0449\u0435\u0433\u043e \u0436\u0435\u043b\u0435\u0437\u0430: \u0432\u044b\u0441\u0442\u0430\u0432\u0438\u043b \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u044d\u043a\u0440\u0430\u043d\u0430 160\u00d7128\u00a0\u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 (\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442 \u0434\u043b\u044f\u00a0\u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0446\u0432\u0435\u0442\u043d\u044b\u0445 \u0434\u0438\u0441\u043f\u043b\u0435\u0435\u0432 \u043f\u043e\u0434\u00a0Arduino \u043f\u043e\u00a0\u0442\u0438\u043f\u0443 ST7735) \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u00a0WINDOW_SCALE, \u0447\u0442\u043e\u0431\u044b \u043d\u0435\u00a0\u043b\u043e\u043c\u0430\u0442\u044c \u0433\u043b\u0430\u0437\u0430 \u043d\u0430\u00a0\u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u043c \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0435.\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0448\u0430\u0433\u043e\u043c \u0441\u0442\u0430\u043b\u0430 \u0437\u0430\u043c\u0435\u043d\u0430 \u00ab\u0442\u044f\u0436\u0435\u043b\u044b\u0445\u00bb \u0434\u043b\u044f 8-\u0431\u0438\u0442\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 (int32_t,\u00a0int64_t) \u043d\u0430\u00a0\u043b\u0435\u0433\u043a\u043e\u0432\u0435\u0441\u043d\u044b\u0435\u00a0int8_t\u00a0\u0438\u00a0int16_t. \u0418 \u0437\u0434\u0435\u0441\u044c \u043c\u0435\u043d\u044f \u0436\u0434\u0430\u043b \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u044b\u0439 \u0431\u0430\u0433, \u043d\u0430\u00a0\u043f\u043e\u0438\u0441\u043a \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0443\u0448\u043b\u043e \u043f\u043e\u043b\u0442\u043e\u0440\u0430&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-498792","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/498792","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=498792"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/498792\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=498792"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=498792"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=498792"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}