{"id":274352,"date":"2016-02-16T11:08:01","date_gmt":"2016-02-16T08:08:01","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=274352"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=274352","title":{"rendered":"\u041c\u043d\u043e\u0433\u043e\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u043e\u043d\u043b\u0430\u0439\u043d-\u0448\u0443\u0442\u0435\u0440 \u043d\u0430 WebGL \u0438 asyncio, \u0447\u0430\u0441\u0442\u044c \u0432\u0442\u043e\u0440\u0430\u044f"},"content":{"rendered":"<p>       <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/7f7\/b31\/ed7\/7f7b31ed7b3e41099718749ed5b7ccd5.jpg\"\/><br \/>  \u0412 \u044d\u0442\u043e\u043c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0435 \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u043b\u0441\u044f \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043d\u043e\u0433\u043e <code>3D<\/code>-\u0448\u0443\u0442\u0435\u0440\u0430, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u043e\u0442 \u0438\u043c\u043f\u043e\u0440\u0442\u0430 \u0441\u0438\u043c\u043f\u0430\u0442\u0438\u0447\u043d\u044b\u0445 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u0442\u0430\u043d\u043a\u043e\u0432 \u043d\u0430 \u0441\u0446\u0435\u043d\u0443 \u0438 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0438\u0433\u0440\u043e\u043a\u043e\u0432 \u0438 \u0431\u043e\u0442\u043e\u0432 \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>websocket<\/code> \u0438 <code>asyncio<\/code> \u0438 \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u043a\u043e\u0439 \u0438\u0445 \u043f\u043e \u043a\u043e\u043c\u043d\u0430\u0442\u0430\u043c.<\/p>\n<p>  <a href=\"#0\"> \u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 <\/a><br \/>  <a href=\"#1\">1. \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0438\u0433\u0440\u044b <\/a><br \/>  <a href=\"#2\">2. \u0418\u043c\u043f\u043e\u0440\u0442 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u0438 blender <\/a><br \/>  <a href=\"#3\">3. \u041f\u043e\u0434\u0433\u0440\u0443\u0437\u043a\u0430 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u0432 \u0438\u0433\u0440\u0435 \u0441 babylon.js \u0438 \u0441\u0430\u043c\u0438 \u043c\u043e\u0434\u0435\u043b\u0438 <\/a><br \/>  <a href=\"#4\">4. \u041f\u0435\u0440\u0435\u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f, \u043c\u0438\u043d\u0438\u043a\u0430\u0440\u0442\u0430 \u0438 \u0437\u0432\u0443\u043a\u0438 \u0438\u0433\u0440\u044b \u0432 babylon.js <\/a><br \/>  <a href=\"#5\">5. \u0412\u0435\u0431\u0441\u043e\u043a\u0435\u0442\u044b \u0438 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u0438\u0433\u0440\u044b <\/a><br \/>  <a href=\"#6\">6. \u0418\u0433\u0440\u043e\u043a\u0438 \u0438 \u0438\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0446\u0438\u044f <\/a><br \/>  <a href=\"#7\">7. \u0411\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u043a\u0430 \u0438\u0433\u0440\u043e\u043a\u043e\u0432 \u043f\u043e \u043a\u043e\u043c\u043d\u0430\u0442\u0430\u043c \u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u044b\u0439 \u043f\u0438\u0442\u043e\u043d <\/a><br \/>  <a href=\"#8\">8. Asyncio \u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0431\u043e\u0442\u0430 <\/a><br \/>  <a href=\"#9\">9. Nginx \u0438 \u043f\u0440\u043e\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u043e\u043a\u0435\u0442\u043e\u0432 <\/a><br \/>  <a href=\"#10\">10. \u0410\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0435 \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 memcache <\/a><br \/>  <a href=\"#11\">11. \u041f\u043e\u0441\u043b\u0435\u0441\u043b\u043e\u0432\u0438\u0435 \u0438 RoadMap<\/a><\/p>\n<p>  \u0412\u0441\u0435\u0445 \u043a\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430 \u0442\u0435\u043c\u0430 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0432 <code>Python3<\/code>, <code>WebGL<\/code> \u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0433\u0440, \u043f\u0440\u043e\u0448\u0443 \u043f\u043e\u0434 \u043a\u0430\u0442.<br \/>  <a name=\"habracut\"><\/a>  <\/p>\n<h3><a name=\"0\"><\/a><font color=\"orange\">\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/font><\/h3>\n<p>  \u0421\u0430\u043c\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u0437\u0430\u0434\u0443\u043c\u044b\u0432\u0430\u043b\u0430\u0441\u044c \u043a\u0430\u043a \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 \u0442\u0435\u043c\u044b \u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c <a href=\"https:\/\/github.com\/KeepSafe\/aiohttp\">aiohttp<\/a> \u0438 <code>asyncio<\/code>, \u0438 \u0435\u0441\u043b\u0438 <a href=\"http:\/\/habrahabr.ru\/post\/242541\/\">\u043f\u0435\u0440\u0432\u0430\u044f \u0447\u0430\u0441\u0442\u044c<\/a> \u0431\u044b\u043b\u0430 \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u0430 \u0442\u043e\u043c\u0443, \u043a\u0430\u043a \u043b\u0443\u0447\u0448\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043c\u043e\u0434\u0443\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043f\u043e \u0442\u0438\u043f\u0443 <code>django<\/code>, \u043f\u043e\u0432\u0435\u0440\u0445 <code>aiohttp( asyncio )<\/code>, \u0442\u043e \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u0443\u0436\u0435 \u0437\u0430\u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0437\u0430\u043d\u044f\u0442\u044c\u0441\u044f \u0447\u0435\u043c \u0442\u043e \u0431\u043e\u043b\u0435\u0435 \u0442\u0432\u043e\u0440\u0447\u0435\u0441\u043a\u0438\u043c. <\/p>\n<p>  \u0415\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043c\u043d\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c <code>3D<\/code>-\u0438\u0433\u0440\u0443\u0448\u043a\u0443, \u0430 \u0433\u0434\u0435 \u0435\u0449\u0435 \u043a\u0430\u043a \u043d\u0435 \u0432 \u0438\u0433\u0440\u0430\u0445 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435. <\/p>\n<p>  \u0418\u0433\u0440\u0443\u0448\u043a\u0430 \u0443 \u043d\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u0431\u0435\u0437 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438, \u0441 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u043e\u043f\u0430\u0434\u0430\u0442\u044c \u0434\u0440\u0443\u0433 \u043f\u043e \u0434\u0440\u0443\u0433\u0443, \u0431\u043e\u0442\u0430\u043c\u0438, \u043a\u043e\u043c\u043d\u0430\u0442\u0430\u043c\u0438, \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u0447\u0430\u0442\u043e\u043c, \u0438 \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u043b\u0430\u043d\u0434\u0448\u0430\u0444\u0442\u043e\u043c. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0438\u0433\u0440\u043e\u0432\u044b\u0445 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u043c\u044b \u0432\u043e\u0437\u044c\u043c\u0451\u043c \u043f\u0430\u0440\u0443 \u0442\u0430\u043d\u043a\u043e\u0432, \u043a\u0430\u043a \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u0438 \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u044b\u0435, \u0438, \u0432 \u0442\u043e \u0436\u0435 \u0432\u0440\u0435\u043c\u044f, \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0438\u0433\u0440\u043e\u0432\u044b\u0435 \u043c\u043e\u0434\u0435\u043b\u0438. \u041d\u0443 \u0438 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u043c \u043e \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0447\u0435\u0440\u0435\u0437 <code>memcached<\/code>.<\/p>\n<p>  \u0414\u043b\u044f \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e\u0441\u0442\u0438, \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430\u043c\u0438 \u043e\u0442\u0434\u0430\u043b\u0435\u043d\u043d\u043e \u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u044e\u0449\u0438\u043c\u0438 \u0438\u043d\u0444\u043e\u0433\u0440\u0430\u0444\u0438\u043a\u0443, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0441\u0435\u0442\u0435\u0432\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u0440\u044f\u043c\u043e\u043b\u0438\u043d\u0435\u0439\u043d\u043e \u0438 \u0443\u0434\u043e\u0431\u043d\u0435\u0439 \u0432\u0441\u0435 \u0442\u0430\u043a\u0438 \u043a\u043e\u0433\u0434\u0430 \u0441\u0442\u0440\u0435\u043b\u043a\u0430\u043c\u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u0447\u0442\u043e \u043a\u043e\u043c\u0443 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0438 \u0447\u0442\u043e \u043a\u043e\u0433\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442.<br \/>  \u041f\u0440\u0438\u043c\u0435\u0440\u044b \u043a\u043e\u0434\u0430, \u0438 \u0432 \u0438\u043d\u0444\u043e\u0433\u0440\u0430\u0444\u0438\u043a\u0435, \u0438 \u0432 \u043e\u0431\u044b\u0447\u043d\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435, \u043e\u0447\u0435\u043d\u044c \u0447\u0430\u0441\u0442\u043e \u0431\u0443\u0434\u0443\u0442 \u0441\u0438\u043b\u044c\u043d\u043e \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u044b, \u0434\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0435\u0433\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u043e\u0431\u0449\u0435\u0439 \u0441\u0445\u0435\u043c\u044b \u0440\u0430\u0431\u043e\u0442\u044b. \u0422\u0435\u043c \u0431\u043e\u043b\u0435\u0435, \u0447\u0442\u043e \u043f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 \u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c\u0438 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 <a href=\"https:\/\/github.com\/alikzao\/tao1\">github<\/a>. <\/p>\n<p>  \u041d\u043e \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0447\u0442\u043e \u044d\u0442\u043e \u043d\u0435 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u0430\u044f \u0438\u0433\u0440\u0430 \u2014 \u0432 \u0442\u043e\u043c \u0441\u043c\u044b\u0441\u043b\u0435, \u0447\u0442\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043b <code>git clone<\/code> \u0438 \u043f\u043e\u0448\u0451\u043b \u0432 \u0431\u0430\u043d\u043a\u043e\u043c\u0430\u0442. \u042d\u0442\u043e, \u0441\u043a\u043e\u0440\u0435\u0435, \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a, \u0434\u0435\u043c\u043a\u0443 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 <code>asyncio<\/code> \u0438 <code>webgl<\/code> \u0432 \u043e\u0434\u043d\u043e\u043c \u0444\u043b\u0430\u043a\u043e\u043d\u0435. \u0417\u0434\u0435\u0441\u044c \u043d\u0435\u0442 \u0432\u0438\u0442\u0440\u0438\u043d\u044b, \u0440\u0435\u0439\u0442\u0438\u043d\u0433\u043e\u0432, \u0434\u043e\u0441\u043a\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u043e\u0442\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u0438 \u0442.\u0434., \u043d\u043e, \u0441 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u043c\u043d\u0435 \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0434\u043b\u044f <code>open sourse<\/code> \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c\u043e\u0433\u043e \u043e\u0442 \u0441\u043b\u0443\u0447\u0430\u044f \u043a \u0441\u043b\u0443\u0447\u0430\u044e, \u0432 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c.<\/p>\n<h3><a name=\"2\"><\/a><font color=\"orange\">2 \u0418\u043c\u043f\u043e\u0440\u0442 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u0438 blender<\/font><\/h3>\n<p>  \u0415\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043d\u0430\u043c \u0434\u043b\u044f \u0438\u0433\u0440\u0443\u0448\u043a\u0438 \u043d\u0443\u0436\u043d\u044b <code>3D<\/code> \u043c\u043e\u0434\u0435\u043b\u0438 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0435\u0439, \u043d\u0443\u0436\u043d\u044b \u043c\u043e\u0434\u0435\u043b\u0438 \u0434\u043b\u044f \u0438\u043c\u0438\u0442\u0430\u0446\u0438\u0438 \u043b\u0430\u043d\u0434\u0448\u0430\u0444\u0442\u0430, \u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0439 \u0438 \u0442.\u0434.<br \/>  \u041f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430\u043c\u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043b\u044e\u0434\u0438, \u0442\u0430\u043d\u043a\u0438, \u0441\u0430\u043c\u043e\u043b\u0435\u0442\u044b. \u0415\u0441\u0442\u044c \u0434\u0432\u0430 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u2014 \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u044c, \u0438 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0443\u0436\u0435 \u0433\u043e\u0442\u043e\u0432\u0443\u044e. \u0421\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431, \u044d\u0442\u043e \u043d\u0430\u0439\u0442\u0438 \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0441\u0430\u0439\u0442\u043e\u0432, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 <a href=\"http:\/\/tf3dm.com\/\">\u0442\u0443\u0442<\/a> \u0438\u043b\u0438 <a href=\"http:\/\/www.blendswap.com\/blends\">\u0442\u0443\u0442<\/a>. \u041a\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0435\u043d \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0430\u043d\u043a\u043e\u0432 \u0438 \u043f\u0440\u043e\u0447\u0438\u0445 \u043c\u043e\u0434\u0435\u043b\u0435\u0439, \u043d\u0430 \u044e\u0442\u0443\u0431\u0435 \u043f\u043e\u043b\u043d\u043e \u0432\u0438\u0434\u0435\u043e, \u043d\u0430 \u0445\u0430\u0431\u0440\u0435 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e\u0442\u0441\u044f \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b \u043f\u043e \u044d\u0442\u043e\u0439 <a href=\"http:\/\/habrahabr.ru\/post\/273543\/\">\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0435<\/a>.<\/p>\n<p>  \u041e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c\u0441\u044f \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0439 \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0438\u043c\u043f\u043e\u0440\u0442\u0430. \u0418\u0437 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c\u044b\u0445 \u0432 <code>blender<\/code> \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u0432, \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e\u0442\u0441\u044f <code>.die .obj .3ds<\/code>. <\/p>\n<p>  \u0423 \u0438\u043c\u043f\u043e\u0440\u0442\u0430\/\u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0430 \u0435\u0441\u0442\u044c \u0440\u044f\u0434 \u043d\u044e\u0430\u043d\u0441\u043e\u0432. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u043c\u044b \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c <code>.3ds<\/code>, \u0442\u043e, \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u043c\u043e\u0434\u0435\u043b\u044c \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0431\u0435\u0437 \u0442\u0435\u043a\u0441\u0442\u0443\u0440, \u043d\u043e \u0441 \u0443\u0436\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430\u043c\u0438. \u0412 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0430\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0430\u0434\u043e \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0443 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0441 \u0434\u0438\u0441\u043a\u0430 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b. \u0414\u043b\u044f <code>.obj<\/code>, \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u043a\u0440\u043e\u043c\u0435 \u0442\u0435\u043a\u0441\u0442\u0443\u0440 \u0434\u043e\u043b\u0436\u0435\u043d \u0438\u0434\u0442\u0438 <code>.mtl<\/code> \u0444\u0430\u0439\u043b\u0438\u043a, \u0435\u0441\u043b\u0438 \u043e\u043d \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442, \u0442\u043e \u043e\u0431\u044b\u0447\u043d\u043e \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u043c\u0435\u043d\u044c\u0448\u0435. <\/p>\n<p>  \u0418\u043d\u043e\u0433\u0434\u0430 \u0443\u0436\u0435 \u043f\u043e\u0441\u043b\u0435 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0430 \u043c\u043e\u0434\u0435\u043b\u0438 \u043d\u0430 \u0441\u0446\u0435\u043d\u0443, \u043c\u043e\u0436\u0435\u0442 \u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u0447\u0442\u043e <code>chrome<\/code> \u0432\u044b\u043b\u0435\u0442\u0430\u0435\u0442, \u0441 \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435\u043c, \u0447\u0442\u043e \u0443 \u043d\u0435\u0433\u043e \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c <code>webgl<\/code>. \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0430\u0434\u043e \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u0442\u044c\u0441\u044f \u0443\u0431\u0440\u0430\u0442\u044c \u0432\u0441\u0435 \u043b\u0438\u0448\u043d\u0435\u0435 \u0432 \u0431\u043b\u0435\u043d\u0434\u0435\u0440\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0438, \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u0438 \u0442.\u0434. <\/p>\n<p>  \u0414\u0430\u043b\u0435\u0435 \u043e\u0434\u0438\u043d \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u043d\u0435\u043c\u0430\u043b\u043e\u0432\u0430\u0436\u043d\u044b\u0445 \u043c\u043e\u043c\u0435\u043d\u0442\u043e\u0432. \u0414\u043b\u044f \u043c\u043e\u0434\u0435\u043b\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c\u0441\u044f \u0434\u0432\u0438\u0433\u0430\u0442\u044c \u043f\u043e \u043a\u0430\u0440\u0442\u0435,<br \/>  \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u043a\u043b\u0435\u0438\u0442\u044c \u0432\u0441\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u043c\u043e\u0434\u0435\u043b\u044c. \u0418\u043d\u0430\u0447\u0435 \u043c\u044b \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u043c \u0438\u0445 \u043f\u0435\u0440\u0435\u0434\u0432\u0438\u0433\u0430\u0442\u044c, \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0447\u0442\u043e \u0432\u043c\u0435\u0441\u0442\u043e \u0442\u0430\u043d\u043a\u0430 \u0435\u0437\u0434\u0438\u0442\u044c \u0431\u0443\u0434\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0433\u043e \u043f\u0443\u043b\u0435\u043c\u0435\u0442, \u0430 \u043f\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043d\u0443\u0436\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0434\u0435\u0440\u0435\u0432\u0443, \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 \u043a\u0430\u0440\u0442\u0435 \u043f\u043e\u043c\u0435\u043d\u044f\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0435\u043d\u0451\u043a \u043e\u0442 \u0434\u0435\u0440\u0435\u0432\u0430, \u0430 \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u0432 \u0446\u0435\u043d\u0442\u0440\u0435 \u043a\u0430\u0440\u0442\u044b.<\/p>\n<p>  \u0414\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0434\u0432\u0430 \u0441\u043f\u043e\u0441\u043e\u0431\u0430:<br \/>  1) \u041e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0432\u0441\u0435 \u0434\u0435\u0442\u0430\u043b\u0438 \u043c\u043e\u0434\u0435\u043b\u0438 \u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0435\u0451 \u043e\u0434\u043d\u0438\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c. \u042d\u0442\u043e\u0442 \u0441\u043f\u043e\u0441\u043e\u0431 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u043d\u043e \u043e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043e\u0434\u043d\u0430 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0430 \u0432 \u0432\u0438\u0434\u0435 <code>UV<\/code> \u2014 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u043a\u0438. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u0430\u0443\u0442\u043b\u0430\u0439\u043d\u0435\u0440 \u0441 \u0448\u0438\u0444\u0442\u043e\u043c \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u0432\u0441\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u043e\u043d\u0438 \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u044f\u0442\u0441\u044f \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u043d\u044b\u043c \u043e\u0440\u0430\u043d\u0436\u0435\u0432\u044b\u043c \u0446\u0432\u0435\u0442\u043e\u043c \u0438 \u0432 \u043c\u0435\u043d\u044e <code>object<\/code> \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043f\u0443\u043d\u043a\u0442 <code>join<\/code>.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/f64\/0b6\/366\/f640b63667a146019cd9dc76b21fac64.jpg\"\/><br \/>  2) \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u2014 \u0441\u0432\u044f\u0437\u0430\u0442\u044c \u0432\u0441\u0435 \u0434\u0435\u0442\u0430\u043b\u0438 \u043f\u043e \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0443 \u0420\u043e\u0434\u0438\u0442\u0435\u043b\u044c-\u0420\u0435\u0431\u0435\u043d\u043e\u043a. \u0412 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0430\u043c\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u043d\u0435 \u0431\u0443\u0434\u0435\u0442, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u043d\u0430 \u043a\u0430\u0436\u0434\u0443\u044e \u0434\u0435\u0442\u0430\u043b\u044c \u0443 \u043d\u0430\u0441 \u0441\u0432\u043e\u044f \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0430. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u0430\u0432\u043e\u0439 \u043a\u043d\u043e\u043f\u043a\u043e\u0439 \u043c\u044b\u0448\u0438 \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u043f\u043e\u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0438 \u0440\u0435\u0431\u0435\u043d\u043a\u0430, \u043d\u0430\u0436\u0430\u0442\u044c <code>ctrl+P<\/code> \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0432 \u043c\u0435\u043d\u044e <code>object<\/code>. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0432 \u0430\u0443\u0442\u043b\u0430\u0439\u043d\u0435\u0440\u0435 \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0443\u0432\u0438\u0434\u0435\u0442\u044c, \u0447\u0442\u043e \u0432\u0441\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u043d\u0430\u0448\u0430 \u043c\u043e\u0434\u0435\u043b\u044c, \u043e\u0442\u043d\u043e\u0441\u044f\u0442\u0441\u044f \u043a \u043e\u0434\u043d\u043e\u043c\u0443 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044e.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/b7b\/b83\/01d\/b7bb8301db2c407f96a020b42d9bc408.jpg\"\/><br \/>  \u0418 \u0435\u0449\u0435, \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0442\u0430\u043a\u0443\u044e \u0440\u0435\u043c\u0430\u0440\u043a\u0443, \u0447\u0442\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0447\u0430\u0441\u0442\u043e \u043a\u0430\u043a\u0430\u044f \u0442\u043e \u043c\u043e\u0434\u0435\u043b\u044c \u043c\u043e\u0436\u0435\u0442 \u043f\u043e \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u044b\u043c \u043f\u0440\u0438\u0447\u0438\u043d\u0430\u043c \u043d\u0435 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u0431\u043b\u0435\u043d\u0434\u0435\u0440 \u0438\u043b\u0438 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u0432\u0438\u0434\u0435 \u043a\u0430\u043a\u043e\u0433\u043e \u0442\u043e \u0445\u043b\u0430\u043c\u0430. \u0418 \u043e\u0447\u0435\u043d\u044c \u0447\u0430\u0441\u0442\u043e \u0431\u044b\u0432\u0430\u0435\u0442 \u0447\u0442\u043e \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0434\u0443\u0442 \u0441 \u043c\u043e\u0434\u0435\u043b\u044c\u044e \u043d\u0435 \u0445\u043e\u0442\u044f\u0442 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f. \u0412 \u0442\u0430\u043a\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u043e\u0434\u0435\u043b\u0430\u0435\u0448\u044c \u0438 \u043d\u0430\u0434\u043e \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0434\u0440\u0443\u0433\u0438\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430\u043c. <\/p>\n<h3><a name=\"3\"><\/a><font color=\"orange\">3. \u041f\u043e\u0434\u0433\u0440\u0443\u0437\u043a\u0430 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u0432 \u0438\u0433\u0440\u0435 \u0441 babylon.js \u0438 \u0441\u0430\u043c\u0438 \u043c\u043e\u0434\u0435\u043b\u0438<\/font><\/h3>\n<p>  \u0421\u0430\u043c\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043c\u0435\u0441\u0442\u043e\u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u043c\u0435\u0448\u0430 \u043d\u0430 \u0434\u0438\u0441\u043a\u0435: <\/p>\n<pre><code class=\"javascript\">loader = new BABYLON.AssetsManager(scene); mesh  = loader.addMeshTask('enemy1', &quot;&quot;, &quot;\/static\/game\/t3\/&quot;, &quot;t.babylon&quot;);<\/code><\/pre>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u0432 \u043b\u044e\u0431\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0447\u0442\u043e \u043d\u0430\u0448\u0430 \u043c\u043e\u0434\u0435\u043b\u044c \u0443\u0436\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u0430 \u0438 \u0434\u0430\u043b\u044c\u0448\u0435 \u0432\u044b\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0435\u0451 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c, \u0435\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e.<\/p>\n<pre><code class=\"javascript\">mesh.onSuccess = function (task) {       task.loadedMeshes[0].position = new BABYLON.Vector3(10, 2, 20);  };<\/code><\/pre>\n<p>  \u041e\u0434\u043d\u0430 \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u043a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u0442\u044c \u0434\u0435\u0440\u0435\u0432\u044c\u044f, \u0447\u0442\u043e\u0431 \u043d\u0435 \u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043a\u0430\u0436\u0434\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u0438 \u043d\u0430 \u043a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e \u0441\u0446\u0435\u043d\u0435 \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c\u0438:<\/p>\n<pre><code class=\"javascript\">var palm = loader.addMeshTask('palm', &quot;&quot;, &quot;\/static\/game\/g6\/&quot;, &quot;untitled.babylon&quot;); palm.onSuccess = function (task) {         var p = task.loadedMeshes[0];         p.position   = new BABYLON.Vector3(25, -2, 25);         var p1 = p.clone('p1');         p1.position = new BABYLON.Vector3(10, -2, 20);         var p2 = p.clone('p2');         p2.position = new BABYLON.Vector3(15, -2, 30); };<\/code><\/pre>\n<p>  \u0422\u0430\u043a\u0436\u0435 \u043a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u0433\u0440\u0430\u0435\u0442 \u0432\u0430\u0436\u043d\u0443\u044e \u0440\u043e\u043b\u044c \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 <code>AssetsManager<\/code>. \u041e\u043d \u0440\u0438\u0441\u0443\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u0435\u043d\u044c\u043a\u0443\u044e \u0437\u0430\u0441\u0442\u0430\u0432\u043a\u0443, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043f\u043e\u0434\u0433\u0440\u0443\u0437\u0438\u0442\u0441\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0441\u0446\u0435\u043d\u044b, \u0438 \u0441\u043b\u0435\u0434\u0438\u0442 \u0447\u0442\u043e\u0431 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u043b\u043e\u0441\u044c \u0432\u0441\u0435 \u0447\u0442\u043e \u043c\u044b \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u043c \u0432 <code>loader.onFinish<\/code>. <\/p>\n<pre><code class=\"javascript\">var createScene = function () {     .  .  . } var scene = createScene(); loader.onFinish = function (tasks) {     engine.runRenderLoop(function () {         scene.render();     }); };<\/code><\/pre>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/b9e\/c3a\/e8d\/b9ec3ae8daa54b29a27cf55334c8c551.jpg\"\/><br \/>  \u041c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u0437\u0431\u0435\u0433\u0430\u0442\u044c \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0439 \u043f\u043e\u0434\u0433\u0440\u0443\u0437\u043a\u0438 \u0447\u0435\u0433\u043e \u0431\u044b \u0442\u043e \u043d\u0438 \u0431\u044b\u043b\u043e \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0438\u0433\u0440\u044b, \u043f\u043e \u0440\u0430\u0437\u043d\u044b\u043c \u043f\u0440\u0438\u0447\u0438\u043d\u0430\u043c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0441\u0435 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0438 \u0433\u0440\u0443\u0437\u044f\u0442\u0441\u044f \u043f\u0440\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u0430 \u0443\u0436\u0435 \u0432 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0441\u043e\u043a\u0435\u0442\u043e\u0432 \u0438 \u0432 \u043a\u043b\u0430\u0441\u0441\u0435 \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0435\u043c \u0437\u0430 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0438 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0438\u0433\u0440\u043e\u043a\u043e\u0432 \u043c\u044b \u043a\u043b\u043e\u043d\u0438\u0440\u0443\u0435\u043c \u043d\u0443\u0436\u043d\u0443\u044e \u043d\u0430\u043c \u0442\u0435\u0445\u043d\u0438\u043a\u0443 \u0438 \u0442.\u0434. \u0421\u0445\u0435\u043c\u0430, \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a: <\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/253\/14d\/39a\/25314d39a8d74d9da9948310eacf1c71.jpg\"\/><br \/>  \u0414\u0430\u043b\u0435\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u043e \u0441\u0430\u043c\u0438 \u043c\u043e\u0434\u0435\u043b\u0438, \u0438 \u0445\u043e\u0442\u044c \u0434\u0430\u043d\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u043a\u0430\u0440\u0442\u044b \u0441\u043a\u043e\u0440\u0435\u0435 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442, \u0447\u0435\u043c \u0433\u043e\u0442\u043e\u0432\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u043d\u043e \u0434\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u043e\u0431\u0449\u0435\u0439 \u043a\u0430\u0440\u0442\u0438\u043d\u044b \u043d\u0435 \u043f\u043e\u043c\u0435\u0448\u0430\u0435\u0442.<\/p>\n<p>  \u041f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0438, \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0443 \u043d\u0430\u0441 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u0434\u0432\u0443\u043c\u044f \u0442\u0438\u043f\u0430\u043c\u0438 \u0442\u0430\u043d\u043a\u043e\u0432, \u0422-90 \u0438 \u0410\u0431\u0440\u0430\u043c\u0441. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u0438 \u043f\u043e\u0431\u0435\u0434 \u0438 \u043f\u043e\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0443 \u043d\u0430\u0441 \u0441\u0435\u0439\u0447\u0430\u0441 \u043d\u0435\u0442, \u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u043e\u043c \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0432\u0441\u0435 \u044d\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0440\u0438\u0434\u0443\u043c\u044b\u0432\u0430\u0442\u044c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0435\u0439\u0447\u0430\u0441 \u043d\u0435\u0442 \u0432\u044b\u0431\u043e\u0440\u0430 \u0438 \u043f\u0435\u0440\u0432\u043e\u0435 \u043b\u0438\u0446\u043e \u0432\u0441\u0435\u0433\u0434\u0430 \u0438\u0433\u0440\u0430\u0435\u0442 \u0410\u0431\u0440\u0430\u043c\u0441\u043e\u043c, \u0430 \u0431\u043e\u0442 \u0438 \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0438\u0433\u0440\u043e\u043a\u0438 \u0432\u0438\u0434\u043d\u044b \u043a\u0430\u043a \u0422-90. <\/p>\n<p>  \u041d\u0430 \u0441\u0430\u043c\u043e\u0439 \u043a\u0430\u0440\u0442\u0435 \u043c\u044b \u0432\u0438\u0434\u0438\u043c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0435\u043b\u044c\u0435\u0444, \u043e\u043d \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 <code>babylon.js<\/code> \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c <a href=\"http:\/\/doc.babylonjs.com\/tutorials\/14._Height_Map\">heightMap<\/a>, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u043d\u0430 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0443 \u0433\u0440\u0443\u043d\u0442\u0430 \u043d\u0430\u043b\u043e\u0436\u0438\u0442\u044c \u0447\u0435\u0440\u043d\u043e \u0431\u0435\u043b\u0443\u044e \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 \u0438 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0442\u043e\u0433\u043e, \u0433\u0434\u0435 \u0441\u0432\u0435\u0442\u043b\u0430\u044f \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044c, \u0430 \u0433\u0434\u0435 \u0442\u0435\u043c\u043d\u0430\u044f \u0438 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0433\u043e\u0440\u044b \u0438 \u0445\u043e\u043b\u043c\u044b, \u0447\u0430\u0441\u0442\u044c \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a \u043c\u043e\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u0445, \u0447\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u0440\u0430\u0437\u043c\u044b\u0442\u044b\u0439 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043c\u0435\u0436\u0434\u0443 \u0442\u0435\u043c\u043d\u044b\u043c \u0438 \u0431\u0435\u043b\u044b\u043c, \u0442\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043b\u043e\u0433\u0438\u0439 \u0441\u043a\u043b\u043e\u043d. <\/p>\n<pre><code class=\"javascript\">    var ground = BABYLON.Mesh.CreateGroundFromHeightMap(&quot;ground&quot;, &quot;\/static\/HMap.png&quot;, 200, 200, 70, 0, 10, scene, false);     var groundMaterial = new BABYLON.StandardMaterial(&quot;ground&quot;, scene);     groundMaterial.diffuseTexture = new BABYLON.Texture(&quot;\/static\/ground.jpg&quot;, scene);     ground.material = groundMaterial;<\/code><\/pre>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/969\/445\/4b1\/9694454b1a594f378cd1b2672a06221a.jpg\"\/><br \/>  \u0414\u0430\u043b\u0435\u0435 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0430\u043d\u0442\u0443\u0440\u0430\u0436 \u0432 \u0432\u0438\u0434\u0435 \u0434\u043e\u043c\u0430, \u0432\u043e\u0434\u043e\u043d\u0430\u043f\u043e\u0440\u043d\u043e\u0439 \u0431\u0430\u0448\u043d\u0438 \u0432\u043e\u0437\u043b\u0435 \u043d\u0435\u0433\u043e, \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0434\u0435\u0440\u0435\u0432\u044c\u0435\u0432 \u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0442\u0440\u0430\u0432\u044b.<br \/>  \u0422\u0440\u0430\u0432\u0430 \u0432\u044b\u0448\u043b\u0430 \u0443 \u043d\u0430\u0441 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043d\u0438\u0437\u043a\u043e\u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0439, \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c\u044e \u0441 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u043e\u0439 \u043d\u0430 \u043d\u0435\u0439. \u0418 \u044d\u0442\u0430 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c \u043d\u0430\u043a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u043f\u043e \u0440\u0430\u0437\u043d\u044b\u043c \u043c\u0435\u0441\u0442\u0430\u043c. \u0412\u043e\u043e\u0431\u0449\u0435, \u0447\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u043d\u0438\u0437\u043a\u043e \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u043c\u043e\u0434\u0435\u043b\u0438, \u0442\u0435\u043c \u043b\u0443\u0447\u0448\u0435, \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u043d\u043e \u043f\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u043c \u043f\u0440\u0438\u0447\u0438\u043d\u0430\u043c \u0431\u0443\u0434\u0435\u0442 \u0441\u0442\u0440\u0430\u0434\u0430\u0442\u044c \u0437\u0440\u0435\u043b\u0438\u0449\u043d\u043e\u0441\u0442\u044c.<br \/>  \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0431\u043e\u0440\u0430 \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 &quot;\u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430 \u0433\u0440\u0430\u0444\u0438\u043a\u0438&quot;, \u043d\u043e \u043d\u0435 \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435.<br \/>  \u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0438 \u043e\u0442 \u0442\u0440\u0430\u0432\u044b, \u0431\u0430\u043d\u0430\u043d\u043e\u0432\u0430\u044f \u043f\u0430\u043b\u044c\u043c\u0430 \u0443 \u043d\u0430\u0441 \u0438\u043c\u0435\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0432\u0435\u0440\u0448\u0438\u043d, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u044b\u043b\u043e \u0440\u0435\u0448\u0435\u043d\u043e \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0430\u0440\u0443 \u0448\u0442\u0443\u043a \u043d\u0430 \u043a\u0430\u0440\u0442\u0435.<br \/>  \u0427\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0435\u0440\u0448\u0438\u043d \u043d\u0430 \u043a\u0430\u0440\u0442\u0435, \u0442\u0435\u043c \u043d\u0438\u0436\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c <code>FPS<\/code> \u0438 \u0442\u0434.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/110\/d5c\/919\/110d5c91960940c4b7244c89553cb439.jpg\"\/><br \/>  \u0414\u043e\u043c \u0441\u0442\u043e\u0438\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0435, \u0438 \u0435\u0433\u043e \u0431\u044b\u043b\u043e \u0440\u0435\u0448\u0435\u043d\u043e \u043d\u0430\u043a\u0440\u044b\u0442\u044c \u0432\u0441\u0435-\u0442\u0430\u043a\u0438 \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u044b\u043c \u043a\u0443\u0431\u043e\u043c \u0441 \u043a\u043e\u043b\u043b\u0438\u0437\u0438\u044f\u043c\u0438. <\/p>\n<p>  \u0418 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u2014 \u044d\u0442\u043e \u0442\u0440\u0438 \u0440\u0430\u0437\u043d\u043e\u0446\u0432\u0435\u0442\u043d\u044b\u0445 \u043a\u0443\u0431\u0430, \u043e\u043d\u0438 \u043d\u0435 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u043c\u0438\u0448\u0435\u043d\u0438. \u041f\u0440\u0438 \u043f\u043e\u043f\u0430\u0434\u0430\u043d\u0438\u0438 \u0432 \u043a\u0430\u0436\u0434\u044b\u0439 \u043e\u043d \u0437\u0430\u0433\u043e\u0440\u0430\u0435\u0442\u0441\u044f \u0438 \u0438\u0441\u0447\u0435\u0437\u0430\u0435\u0442.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/c2a\/a72\/6ed\/c2aa726ed49c447cafc9694065382a6c.jpg\"\/>  <\/p>\n<h3><a name=\"4\"><\/a><font color=\"orange\">4. \u041f\u0435\u0440\u0435\u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f, \u043c\u0438\u043d\u0438\u043a\u0430\u0440\u0442\u0430 \u0438 \u0437\u0432\u0443\u043a\u0438 \u0438\u0433\u0440\u044b \u0432 babylon.js <\/font><\/h3>\n<p>  \u0413\u043e\u0432\u043e\u0440\u044f \u043e \u043f\u0435\u0440\u0435\u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f\u0445, \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0440\u0435\u0447\u044c \u0438\u0434\u0435\u0442 \u043e \u043f\u0435\u0440\u0432\u043e\u043c \u043b\u0438\u0446\u0435, \u0442\u0430\u043a \u043a\u0430\u043a \u043f\u0435\u0440\u0435\u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u0434\u0440\u0443\u0433\u0438\u0445 \u0438\u0433\u0440\u043e\u043a\u043e\u0432 \u0438 \u0431\u043e\u0442\u043e\u0432 \u2014 \u044d\u0442\u043e \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043c\u0435\u043d\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u043e\u043a\u0435\u0442\u043e\u0432 \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u043e \u0447\u0435\u043c \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u043d\u0438\u0436\u0435.<\/p>\n<p>  \u0421\u0430\u043c\u043e \u043f\u043e \u0441\u0435\u0431\u0435 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435 \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u0430\u043c\u0435\u0440\u043e\u0439 \u0438 \u0432\u0438\u0434\u0438\u043c\u043e\u0439 \u0447\u0430\u0441\u0442\u044c\u044e \u0438\u0433\u0440\u043e\u043a\u0430. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0438\u0433\u0440\u043e\u043a \u043f\u043e\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442 \u0432\u043f\u0440\u0430\u0432\u043e, \u0437\u043d\u0430\u0447\u0438\u0442 \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u0430\u043c\u0435\u0440\u0443 \u043d\u0430\u043f\u0440\u0430\u0432\u043e \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0442\u043e\u0433\u043e, \u043a\u0443\u0434\u0430 \u0441\u0435\u0439\u0447\u0430\u0441 \u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0438\u043b\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0446\u0435\u043d\u0443 \u043d\u0430 \u043d\u0443\u0436\u043d\u044b\u0439 \u0433\u0440\u0430\u0434\u0443\u0441. \u0422\u0430\u043a\u0436\u0435 \u0438 \u043c\u043e\u0434\u0435\u043b\u044c, \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0430\u044e\u0449\u0430\u044f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e \u043f\u043e\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043e\u043f\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432, \u0442\u0430\u043a\u0436\u0435 \u0434\u043e\u043b\u0436\u043d\u0430 \u043f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u0441\u044f.<br \/>  \u0412 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0432 \u0438\u0433\u0440\u0430\u0445, \u0441\u0434\u0435\u043b\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 <code>babylon.js<\/code> \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u043e\u0442 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043b\u0438\u0446\u0430, \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u0434\u0432\u0435 \u043a\u0430\u043c\u0435\u0440\u044b:<\/p>\n<ul>\n<li><code>FreeCamera<\/code> \u2014 \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u0435\u043c \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430 \u0438 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0437\u0430 \u043d\u0435\u0439, \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0445\u043e\u0432\u0435\u0440\u0435\u0434 \u0442\u0435\u0445\u043d\u0438\u043a\u0438, \u0434\u043b\u044f \u043b\u044e\u0434\u0435\u0439 \u0438 \u0432\u0441\u0435\u0433\u043e \u043b\u0435\u0442\u0430\u044e\u0449\u0435\u0433\u043e, \u0443 <code>FreeCamera<\/code> \u0435\u0441\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0438\u043d\u0435\u0440\u0446\u0438\u0438 \u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f, \u0447\u0442\u043e \u0442\u043e\u0436\u0435 \u0432\u0435\u0441\u044c\u043c\u0430 \u0432\u0430\u0436\u043d\u043e. <\/li>\n<li><code>FollowCamera<\/code> \u2014 \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442, \u044d\u0442\u043e \u043a\u0430\u043c\u0435\u0440\u0430 \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0437\u0430 \u043a\u0430\u043a\u0438\u043c-\u0442\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c, \u0443\u0434\u043e\u0431\u043d\u0435\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u043a\u043e\u0433\u0434\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441 \u043c\u044b\u0448\u043a\u0438 \u0438 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044b \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f. \u0422\u043e \u0435\u0441\u0442\u044c, \u043e\u0431\u0437\u043e\u0440 \u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f.<\/li>\n<\/ul>\n<p>  \u041f\u0440\u0438\u043c\u0435\u0440\u044b:<\/p>\n<pre><code class=\"javascript\">\/\/FollowCamera var camera = new BABYLON.FollowCamera(&quot;camera1&quot;, new BABYLON.Vector3(0, 2, 0), scene); camera.target = mesh; ``````javascript \/\/FreeCamera var camera = new BABYLON.FreeCamera(&quot;camera1&quot;, new BABYLON.Vector3( 0, 2, 0), scene);   mesh.parent = camera;<\/code><\/pre>\n<p>  \u0412\u043e \u0432\u0440\u0435\u043c\u044f \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0437\u0432\u0443\u043a\u0438, \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u043f\u0430\u0434\u0430\u043d\u0438\u044f, \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u0441\u0442\u0440\u0435\u043b\u0430, \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u0438 \u0442.\u0434. \u0423 <code>babylon.js<\/code> \u0435\u0441\u0442\u044c \u0445\u043e\u0440\u043e\u0448\u0435\u0435 <a href=\"http:\/\/doc.babylonjs.com\/tutorials\/16._Playing_sounds_and_music\">API<\/a> \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0432\u0443\u043a\u043e\u043c. \u0422\u0435\u043c\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0432\u0443\u043a\u043e\u043c \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043e\u0431\u0448\u0438\u0440\u043d\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0430\u0440\u0443 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432.<br \/>  \u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438:<\/p>\n<pre><code class=\"javascript\">var music = new BABYLON.Sound(&quot;Music&quot;, &quot;music.wav&quot;, scene, null, {           playbackRate:0.5,  \/\/ \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f.            volume: 0.1,           \/\/ \u0433\u0440\u043e\u043c\u043a\u043e\u0441\u0442\u044c \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f.           loop: true,               \/\/ \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0442\u044c \u0438\u043b\u0438 \u043d\u0435\u0442 \u0437\u0432\u0443\u043a.           autoplay: true         \/\/ \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0443\u0436\u043d\u043e \u043b\u0438 \u0441\u0440\u0430\u0437\u0443 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u043d\u0438\u0435. });<\/code><\/pre>\n<p>  \u041f\u0440\u0438\u043c\u0435\u0440 \u0437\u0432\u0443\u043a\u0430 \u0432\u044b\u0441\u0442\u0440\u0435\u043b\u0430 \u2014 \u043f\u0440\u0438 \u043a\u043b\u0438\u043a\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u043f\u043e\u0438\u043d\u0442\u0435\u0440\u043b\u043e\u043a \u0441\u043d\u044f\u0442 \u0438 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c \u0437\u0432\u0443\u043a \u043e\u0434\u0438\u043d\u043e\u0447\u043d\u043e\u0433\u043e \u0432\u044b\u0441\u0442\u0440\u0435\u043b\u0430.<\/p>\n<pre><code class=\"javascript\">var gunS = new BABYLON.Sound(&quot;gunshot&quot;, &quot;static\/gun.wav&quot;, scene); window.addEventListener(&quot;mousedown&quot;, function (e) {        if (!lock &amp;&amp; e.button === 0) gunS.play();  });<\/code><\/pre>\n<p>  \u0417\u0432\u0443\u043a \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u0442\u0435\u0445\u043d\u0438\u043a\u0438 \u0432\u0435\u0448\u0430\u0435\u043c \u043d\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u043d\u0430\u0436\u0430\u0442\u0438\u044f \u0441\u0442\u0440\u0435\u043b\u043e\u043a \u0432\u043f\u0435\u0440\u0435\u0434 \u0438 \u043d\u0430\u0437\u0430\u0434 \u0438, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043d\u0430\u0447\u0430\u043b\u043e \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u043d\u0438\u044f. \u041d\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u043e\u0442\u043f\u0443\u0441\u043a\u0430\u043d\u0438\u044f \u043a\u043b\u0430\u0432\u0438\u0448\u0438 \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u043d\u0438\u0435.<\/p>\n<pre><code class=\"javascript\">    var ms = new BABYLON.Sound(&quot;mss&quot;, &quot;static\/move.mp3&quot;, scene, null, { loop: true, autoplay: false });         document.addEventListener(&quot;keydown&quot;,  function(e){         switch (e.keyCode) {            case 38: case 40: case 83: case 87:         if (!ms.isPlaying) ms.play();         break;         }     });     document.addEventListener(&quot;keyup&quot;,   function(e){         switch (e.keyCode) {             case 38:  case 40: case 83: case 87:                 if (ms.isPlaying) ms.pause();                 break;                }     });<\/code><\/pre>\n<p>  <\/p>\n<h4>\u041c\u0438\u043d\u0438\u043a\u0430\u0440\u0442\u0430<\/h4>\n<p>  \u0423 \u043b\u044e\u0431\u043e\u0433\u043e \u0448\u0443\u0442\u0435\u0440\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u043c\u0438\u043d\u0438\u043a\u0430\u0440\u0442\u0430 \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u0438\u0434\u043d\u043e \u043b\u0438\u0431\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0432\u043e\u0438\u0445 \u0438\u0433\u0440\u043e\u043a\u043e\u0432, \u043b\u0438\u0431\u043e \u0432\u0441\u0435\u0445 \u0441\u0440\u0430\u0437\u0443, \u0432\u0438\u0434\u043d\u043e \u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0438 \u043e\u0431\u0449\u0438\u0439 \u043b\u0430\u043d\u0434\u0448\u0430\u0444\u0442, \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u043f\u0440\u0438\u0433\u043b\u044f\u0434\u0435\u0442\u044c\u0441\u044f, \u0432\u0438\u0434\u043d\u043e \u0438 \u0441\u043d\u0430\u0440\u044f\u0434\u044b. \u0412 <code>babylon.js<\/code> \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u044d\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c. \u041d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u2014 \u044d\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0435\u0449\u0435 \u043e\u0434\u043d\u0443 \u043a\u0430\u043c\u0435\u0440\u0443, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0435\u0451 \u0441\u0432\u0435\u0440\u0445\u0443 \u043d\u0430\u0434 \u043a\u0430\u0440\u0442\u043e\u0439 \u0438 \u0440\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u0438\u0434 \u0441 \u044d\u0442\u043e\u0439 \u043a\u0430\u043c\u0435\u0440\u044b \u0432 \u043d\u0443\u0436\u043d\u043e\u043c \u043d\u0430\u043c \u0443\u0433\u043b\u0443.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/311\/443\/419\/3114434197ec483b9d3814dc86003702.jpg\"\/><br \/>  \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u0431\u0435\u0440\u0435\u043c <code>freeCamera<\/code> \u0438 \u0433\u043e\u0432\u043e\u0440\u0438\u043c \u0435\u0439, \u0447\u0442\u043e \u043e\u043d\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u0442\u044c\u0441\u044f \u0441\u0432\u0435\u0440\u0445\u0443:<\/p>\n<pre><code class=\"javascript\">camera2 = new BABYLON.FreeCamera(&quot;minimap&quot;, new BABYLON.Vector3(0,170,0), scene);<\/code><\/pre>\n<p>  \u0427\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430 \u043f\u043e <code>Y<\/code>, \u0442\u0435\u043c \u043f\u043e\u043b\u043d\u0435\u0435 \u043e\u0431\u0437\u043e\u0440, \u043d\u043e \u0442\u0435\u043c \u043c\u0435\u043b\u044c\u0447\u0435 \u0434\u0435\u0442\u0430\u043b\u0438 \u043d\u0430 \u043a\u0430\u0440\u0442\u0435.<br \/>  \u0414\u0430\u043b\u0435\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043a\u0430\u043c\u0435\u0440\u0435 \u043a\u0430\u043a \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u0442\u044c \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0441 \u043d\u0435\u0451. <\/p>\n<pre><code class=\"javascript\">camera2.viewport = new BABYLON.Viewport(x, y, width, height);<\/code><\/pre>\n<p>  \u0418 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u2014 \u043d\u0430\u0434\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u0430 \u0441\u0446\u0435\u043d\u0443 \u043e\u0431\u0435 \u043a\u0430\u043c\u0435\u0440\u044b (\u043a\u043e\u0433\u0434\u0430 \u043a\u0430\u043c\u0435\u0440\u0430 \u043e\u0434\u043d\u0430 \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c):<\/p>\n<pre><code class=\"javascript\">scene.activeCameras.push(camera); scene.activeCameras.push(camera2);<\/code><\/pre>\n<p>  <\/p>\n<h3><a name=\"5\"><\/a><font color=\"orange\">5. \u0412\u0435\u0431\u0441\u043e\u043a\u0435\u0442\u044b \u0438 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u0438\u0433\u0440\u044b<\/font><\/h3>\n<p>  \u0412\u0441\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0438\u0433\u0440\u044b \u0441\u0442\u0440\u043e\u0438\u0442\u0441\u044f \u043d\u0430 <code>websoket<\/code>-\u0430\u0445, \u0438\u0433\u0440\u043e\u043a \u0441\u043e\u0432\u0435\u0440\u0448\u0430\u0435\u0442 \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435, \u043f\u043e\u0432\u043e\u0440\u043e\u0442 \u043c\u044b\u0448\u0438 \u0438\u043b\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0435 \u043a\u043b\u0430\u0432\u0438\u0448\u0438, \u043d\u0430 \u044d\u0442\u043e \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435 \u0432\u0435\u0448\u0430\u0435\u0442\u0441\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u0435, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043c\u0435\u0441\u0442\u043e\u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0438\u0433\u0440\u043e\u043a\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440, \u0430 \u0441\u0435\u0440\u0432\u0435\u0440 \u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0440\u0443\u0435\u0442 \u0438\u0445 \u0432\u0441\u0435\u043c \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0430\u043c \u0438\u0433\u0440\u044b \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u0434\u0430\u043d\u043d\u043e\u0439 \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u043a\u043e\u043c\u043d\u0430\u0442\u0435. <\/p>\n<p>  \u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u044b \u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f <code>FreeCamera<\/code>, \u0442\u043e \u043e\u043d\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c, \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0435\u0451 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<ul>\n<li><code>camera.cameraRotation<\/code> \u2014 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 <code>X<\/code> \u0438 <code>Y<\/code> \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430 \u043f\u043e \u043e\u0441\u044f\u043c. <\/li>\n<li><code>camera.position<\/code> \u2014 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 <code>X<\/code>, <code>Y<\/code> \u0438 <code>Z<\/code> \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043c\u0435\u0441\u0442\u043e\u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u043c\u0435\u0448\u0430 \u043d\u0430 \u043a\u0430\u0440\u0442\u0435.<\/li>\n<\/ul>\n<p>  \u041d\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0435, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0439 \u043d\u0438\u0436\u0435, \u043c\u044b \u0432\u0438\u0434\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043e\u0442 \u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u0438\u0433\u0440\u043e\u043a\u0430, \u0434\u043e \u043e\u0431\u043c\u0435\u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u043c\u0438 \u043f\u0440\u0438 \u0440\u0435\u0430\u043a\u0446\u0438\u0438 \u043d\u0430 \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/bf2\/b47\/32f\/bf2b4732fdc546f99af9e996521873c9.jpg\"\/>  <\/p>\n<h3><a name=\"6\"><\/a><font color=\"orange\">6. \u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 <\/font><\/h3>\n<p>  \u0412\u044b\u0448\u0435 \u043c\u044b \u0443\u0432\u0438\u0434\u0435\u043b\u0438 \u043a\u0440\u0430\u0442\u043a\u0443\u044e \u0441\u0445\u0435\u043c\u0443, \u043a\u0430\u043a \u0431\u044b \u043e\u0447\u0435\u043d\u044c \u0441\u0436\u0430\u0442\u043e, \u0430 \u0442\u0435\u043f\u0435\u0440\u044c \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c\u0441\u044f \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043d\u0430 \u0442\u043e\u043c, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c. \u0412 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0435 \u0441\u043e\u043a\u0435\u0442\u043e\u0432 \u043c\u044b \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0435\u0433\u043e <code>action<\/code>, \u0442\u043e \u043a\u0430\u043a\u043e\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441\u043e\u0432\u0435\u0440\u0448\u0438\u043b \u0438\u0433\u0440\u043e\u043a \u0438 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u044d\u0442\u0438\u043c \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u043d\u0443\u0436\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0441\u043e\u0431\u044b\u0442\u0438\u044f:<\/p>\n<pre><code class=\"python\">def game_handler(request):     .  .  .     while True:         msg = yield from ws.receive()         try:             if msg.tp == MsgType.text:                 if msg.data == 'close':                     close(ws)                 else:                     e = json.loads( msg.data )                     action = e['e']                     if action in handlers:                         handler = handlers[action]                         handler(ws, e)                      .  .  .<\/code><\/pre>\n<p>  \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u043a \u043d\u0430\u043c \u043f\u0440\u0438\u0448\u0435\u043b <code>move<\/code>, \u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u0438\u0433\u0440\u043e\u043a \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u043b\u0441\u044f \u043d\u0430 \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b. \u0412 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0435 \u044d\u0442\u043e\u0433\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u043c \u044d\u0442\u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043a\u043b\u0430\u0441\u0441\u0443 <code>Player<\/code> \u043e\u043d \u0438\u0445 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0438 \u043c\u044b \u0434\u0430\u043b\u044c\u0448\u0435 \u0438\u0445 \u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0440\u0443\u0435\u043c \u0432\u0441\u0435\u043c \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u043c \u0438\u0433\u0440\u043e\u043a\u0430\u043c \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0438\u043c\u0441\u044f \u0432 \u043a\u043e\u043c\u043d\u0430\u0442\u0435 \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442.<\/p>\n<pre><code class=\"python\">def h_move(me, e):     me.player.set_pos(e['x'], e['y'], e['z'])     mess = dict(e=&quot;move&quot;, id=me.player.id, **me.player.pos_as_dict)     me.player.room.send_all(mess, except_=(me.player,))<\/code><\/pre>\n<p>  \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u0432\u0441\u0435 \u0447\u0442\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u0434\u0435\u043b\u0430\u0435\u0442 \u043a\u043b\u0430\u0441\u0441 <code>Player<\/code> \u0441 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c\u0438, \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442 \u0438\u0445 \u0431\u043e\u0442\u0443, \u0447\u0442\u043e\u0431\u044b \u0442\u043e\u0442 \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0441\u044f \u043d\u0430 \u043d\u0438\u0445. \u0410 \u0432 \u0438\u0434\u0435\u0430\u043b\u0435 \u043e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u0432\u0435\u0440\u044f\u0442\u044c \u0432\u0441\u044e \u043a\u0430\u0440\u0442\u0443 \u0441 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c\u0438, \u0438 \u0435\u0441\u043b\u0438 \u0438\u0433\u0440\u043e\u043a \u043d\u0430\u0441\u043a\u043e\u0447\u0438\u043b \u043d\u0430 \u043f\u0440\u0435\u043f\u044f\u0442\u0441\u0442\u0432\u0438\u0435, \u0442\u043e \u043e\u043d, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u043e \u0438\u0437\u0431\u0435\u0436\u0430\u043d\u0438\u0435 \u0447\u0438\u0442\u0435\u0440\u0441\u0442\u0432\u0430, \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0434\u0430\u0432\u0430\u0442\u044c \u0435\u043c\u0443 \u043f\u0440\u043e\u0441\u043e\u0447\u0438\u0442\u044c\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0441\u0442\u0435\u043d\u0443, \u0435\u0441\u043b\u0438 \u043d\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u0435 \u043f\u043e\u043c\u0435\u043d\u044f\u044e\u0442 \u0441\u043a\u0440\u0438\u043f\u0442.<\/p>\n<pre><code class=\"python\">class Player(list):     .  .  .     def __init__(self, client, room, x=0, y=0, z=0, a=0, b=0):         list.__init__(self, (x, y, z, a, b))         self._client = client         self._room = room         Player.last_id += 1         self._id = Player.last_id         room.add_player(self)      .  .  .     def set_rot(self, a, b): self[3:5] = a, b      def getX(self): return self[0]     .  .  .     def setX(self, newX): self[0] = newX     .  .  .     x = property(getX, setX)     .  .  .     @property     def pos_as_dict(self):         return dict(zip(('x', 'y', 'z'), self.pos))<\/code><\/pre>\n<p>  \u0412 \u043a\u043b\u0430\u0441\u0441\u0435 <code>Player<\/code> \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c <code>property<\/code>, \u0434\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u0443\u0434\u043e\u0431\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c\u0438.  \u041a\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u043d\u0430 \u0445\u0430\u0431\u0440\u0435 \u0431\u044b\u043b \u0445\u043e\u0440\u0448\u0438\u0439 <a href=\"http:\/\/habrahabr.ru\/post\/137415\/\">\u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b<\/a> \u043d\u0430 \u044d\u0442\u0443 \u0442\u0435\u043c\u0443.<\/p>\n<h3><a name=\"7\"><\/a><font color=\"orange\">7. \u0411\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u043a\u0430 \u0438\u0433\u0440\u043e\u043a\u043e\u0432 \u043f\u043e \u043a\u043e\u043c\u043d\u0430\u0442\u0430\u043c <\/font><\/h3>\n<p>  \u0414\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0432\u0430\u0436\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043b\u044e\u0431\u043e\u0439 \u0438\u0433\u0440\u044b, \u044d\u0442\u043e \u0440\u0430\u0437\u0432\u0435\u0441\u0442\u0438 \u0438\u0433\u0440\u043e\u043a\u043e\u0432 \u043f\u043e \u0440\u0430\u0437\u043d\u044b\u043c \u043a\u043b\u0430\u043d\u0430\u043c, \u043a\u043e\u043c\u043d\u0430\u0442\u0430\u043c, \u043f\u043b\u0430\u043d\u0435\u0442\u0430\u043c, \u0441\u0442\u0440\u0430\u043d\u0430\u043c \u0438 \u0442.\u0434. \u041f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0438\u043d\u0430\u0447\u0435 \u043e\u043d\u0438 \u0432\u0441\u0435 \u043d\u0435 \u0432\u043b\u0435\u0437\u0443\u0442 \u043d\u0430 \u043e\u0434\u043d\u0443 \u043a\u0430\u0440\u0442\u0443. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u043e\u043a\u0430 \u0447\u0442\u043e \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u2014 \u0435\u0441\u043b\u0438 \u0432 \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043c\u043d\u0430\u0442\u0435 \u043d\u0430\u0431\u0440\u0430\u043b\u043e\u0441\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u0433\u0440\u043e\u043a\u043e\u0432, \u0447\u0435\u043c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e 4 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0431\u043e\u0442\u043e\u043c), \u0442\u043e \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u043e\u0432\u0443\u044e \u043a\u043e\u043c\u043d\u0430\u0442\u0443 \u0438 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0438\u0433\u0440\u043e\u043a\u043e\u0432 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0442\u0443\u0434\u0430, \u0438 \u0442\u0430\u043a \u043f\u043e \u043a\u0440\u0443\u0433\u0443.<\/p>\n<p>  \u041d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0441\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0442\u043e\u043c, \u043a\u0430\u043a\u043e\u0439 \u0438\u0433\u0440\u043e\u043a \u0432 \u043a\u0430\u043a\u043e\u0439 \u043a\u043e\u043c\u043d\u0430\u0442\u0435 \u0438 \u0442.\u0434., \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432 \u043f\u0430\u043c\u044f\u0442\u0438, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443, \u0440\u0430\u0437 \u0443 \u043d\u0430\u0441 \u043d\u0435\u0442 \u0435\u0449\u0435 \u0432\u0438\u0442\u0440\u0438\u043d\u044b \u0438 \u0440\u0435\u0439\u0442\u0438\u043d\u0433\u043e\u0432, \u0442\u043e \u043d\u0435\u0442 \u0438 \u0441\u043c\u044b\u0441\u043b\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a\u0443\u044e-\u0442\u043e \u0431\u0430\u0437\u0443. <\/p>\n<p>  \u041d\u043e\u043c\u0435\u0440 \u043a\u043e\u043c\u043d\u0430\u0442\u044b \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u0433\u0440\u043e\u043a\u0443 \u043a\u043e\u0433\u0434\u0430 \u043e\u043d \u0441\u043e \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u043e \u0440\u043e\u0443\u0442\u0443 <code>\/pregame<\/code>, \u0437\u0430\u0445\u043e\u0434\u0438\u0442 \u0432 \u0438\u0433\u0440\u0443. \u041f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0443, \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 <code>ajax<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0443\u0434\u0430\u0447\u043d\u043e\u0433\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u043f\u0435\u0440\u0435\u0430\u0434\u0440\u0435\u0441\u043e\u0432\u044b\u0432\u0430\u0435\u0442 \u0438\u0433\u0440\u043e\u043a\u0430 \u0432 \u043d\u0443\u0436\u043d\u0443\u044e \u043a\u043e\u043c\u043d\u0430\u0442\u0443.<\/p>\n<pre><code class=\"javascript\">if (data.result == 'ok') {     window.location = '\/game#'+data.room;<\/code><\/pre>\n<p>  \u041d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0434\u0435\u043c \u043f\u043e \u0441\u043b\u043e\u0432\u0430\u0440\u044e <code>rooms<\/code>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0441\u0435\u0445 \u043a\u043e\u043c\u043d\u0430\u0442 \u0438 \u0438\u0433\u0440\u043e\u043a\u043e\u0432, \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0438\u0445\u0441\u044f \u0432 \u043d\u0438\u0445, \u0438 \u0435\u0441\u043b\u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438\u0433\u0440\u043e\u043a\u043e\u0432 \u043d\u0435 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 \u0437\u0430\u0434\u0430\u043d\u043d\u0443\u044e \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u0443, \u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c <code>id<\/code> \u043a\u043e\u043c\u043d\u0430\u0442\u044b \u043a\u043b\u0438\u0435\u043d\u0442\u0443. \u0410 \u0435\u0441\u043b\u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438\u0433\u0440\u043e\u043a\u043e\u0432 \u0431\u043e\u043b\u044c\u0448\u0435, \u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u043e\u0432\u0443\u044e \u043a\u043e\u043c\u043d\u0430\u0442\u0443.<\/p>\n<pre><code class=\"python\">def check_room(request):         found = None     for _id, room in rooms.items():         if len(room.players) &lt; 3:             found = _id             break     else:         while not found:             _id = uuid4().hex[:3]             if _id not in rooms: found = _id<\/code><\/pre>\n<p>  \u0417\u0430 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u043a\u043e\u043c\u043d\u0430\u0442\u0430\u043c\u0438 \u0443 \u043d\u0430\u0441 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043a\u043b\u0430\u0441\u0441 <code>Room<\/code>. \u0415\u0433\u043e \u043e\u0431\u0449\u0430\u044f \u0441\u0445\u0435\u043c\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/1e3\/0db\/e11\/1e30dbe1100e4218993dff627285a975.jpg\"\/><br \/>  \u0422\u0443\u0442 \u043c\u044b \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u043e\u043d \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 \u0441 \u043a\u043b\u0430\u0441\u0441\u043e\u043c <code>Player<\/code>, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0432\u0441\u044f \u0441\u0445\u0435\u043c\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u043b\u0438\u043d\u0435\u0439\u043d\u043e, \u043d\u043e \u0432 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u0438\u0442\u043e\u0433\u0435 \u043e\u043d\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0443\u0434\u043e\u0431\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u0432\u043e\u0442 \u0446\u0435\u043f\u043e\u0447\u043a\u0438:<\/p>\n<pre><code class=\"python\"># \u0440\u0430\u0437\u043e\u0441\u043b\u0430\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u043c \u0438\u0433\u0440\u043e\u043a\u0430\u043c \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0438\u043c\u0441\u044f \u0432 \u043a\u043e\u043c\u043d\u0430\u0442\u0435  me.player.room.send_all( {&quot;e&quot; : &quot;move&quot;,  .  .  . }) # \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435\u0445 \u0438\u0433\u0440\u043e\u043a\u043e\u0432 \u043a\u043e\u043c\u043d\u0430\u0442\u044b me.player.room.players # \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0438\u0433\u0440\u043e\u043a\u0430 \u0432 \u043a\u043e\u043c\u043d\u0430\u0442\u0443 me.player.room.add_player(self) # \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0438\u0433\u0440\u043e\u043a\u0430 \u0438\u0437 \u043a\u043e\u043c\u043d\u0430\u0442\u044b me.player.room.remove_player( me.player )<\/code><\/pre>\n<p>  \u041d\u0435\u043c\u043d\u043e\u0433\u043e \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u043f\u043e \u043f\u043e\u0432\u043e\u0434\u0443 <code>me.player<\/code>, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0443 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0438\u0437 \u043a\u043e\u043b\u043b\u0435\u0433 \u044d\u0442\u043e \u0432\u044b\u0437\u0432\u0430\u043b\u043e \u0432\u043e\u043f\u0440\u043e\u0441\u044b, <code>me<\/code> \u044d\u0442\u043e \u0441\u043e\u043a\u0435\u0442 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u044e\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u044f:<\/p>\n<pre><code class=\"python\">def h_new(me, e):     me.player = Player(me, Room.get( room_id ), x, z)<\/code><\/pre>\n<p>  \u0422\u0443\u0442, \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u043a\u0430\u043a \u0441\u043a\u0430\u0437\u0430\u043b \u0431\u044b \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0447\u0438\u043a, \u0438\u0433\u0440\u0430 \u0441\u043b\u043e\u0432. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u044b \u0437\u043d\u0430\u0435\u043c, \u0447\u0442\u043e \u0432\u0441\u0435 \u0432 \u043f\u0438\u0442\u043e\u043d\u0435 \u0435\u0441\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442.<br \/>  \u0412\u043e\u0442 \u0442\u0430\u043a \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u0435\u0439:<\/p>\n<pre><code class=\"python\">player = Player( Room.get(room_id), x, z) player.me = me me.player = player<\/code><\/pre>\n<p>  \u0418 \u0443 \u043d\u0430\u0441 \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442\u0441\u044f \u0434\u0432\u0435 \u0441\u0441\u044b\u043b\u043a\u0438, <code>player<\/code> \u043c\u043e\u0434\u0443\u043b\u044f \u0438 <code>.player<\/code> \u043e\u0431\u044a\u0435\u043a\u0442\u0430 <code>me<\/code>, \u043e\u0431\u0435 \u0440\u0430\u0432\u043d\u043e\u043f\u0440\u0430\u0432\u043d\u044b \u0438 \u0441\u0441\u044b\u043b\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u043e\u0431\u044a\u0435\u043a\u0442 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043a\u0430 \u0435\u0441\u0442\u044c \u0445\u043e\u0442\u044c \u043e\u0434\u043d\u0430 \u0441\u0441\u044b\u043b\u043a\u0430.<\/p>\n<p>  \u042d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043d\u0430 \u0435\u0449\u0435 \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435:<\/p>\n<pre><code class=\"python\">&gt;&gt;&gt; a = {1} &gt;&gt;&gt; b = a &gt;&gt;&gt; b.add(2) &gt;&gt;&gt; b {1, 2} &gt;&gt;&gt; a {1, 2}<\/code><\/pre>\n<p>  \u0412 \u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 <code>b<\/code> \u0438 <code>a<\/code> \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u043e\u0434\u043d\u043e \u043e\u0431\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. <\/p>\n<pre><code class=\"python\">&gt;&gt;&gt; a.add(3) &gt;&gt;&gt; a {1, 2, 3} &gt;&gt;&gt; b {1, 2, 3}<\/code><\/pre>\n<p>  \u0421\u043c\u043e\u0442\u0440\u0438\u043c \u0434\u0430\u043b\u0435\u0435:<\/p>\n<pre><code class=\"python\">&gt;&gt;&gt; class A(object): ...     pass ...  &gt;&gt;&gt; a = A() &gt;&gt;&gt; a.player = b &gt;&gt;&gt; a.player {1, 2, 3} &gt;&gt;&gt; b {1, 2, 3} &gt;&gt;&gt; a.__dict__ {'player': {1, 2, 3}}<\/code><\/pre>\n<p>  \u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u0430\u0445\u0430\u0440. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u043d\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442\u0441\u044f \u0432 \u0441\u043b\u043e\u0432\u0430\u0440\u044c <code>__dict__<\/code><\/p>\n<p>  \u0412 \u0438\u0442\u043e\u0433\u0435 \u043c\u044b \u0441\u0435\u0439\u0447\u0430\u0441 \u0443\u0431\u0438\u043b\u0438 \u043e\u0434\u043d\u0443 \u043d\u0430\u0448\u0443 \u0441\u0441\u044b\u043b\u043a\u0443 <code>a<\/code>, \u043d\u043e \u0432\u043c\u0435\u0441\u0442\u043e \u043d\u0435\u0451 \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u0434\u0440\u0443\u0433\u0443\u044e, \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0430\u0449\u0443\u044e \u043d\u043e\u0432\u043e\u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u043c\u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u0443, \u0430 \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043b\u0435\u0436\u0430\u0449\u0443\u044e \u0432 \u0441\u043b\u043e\u0432\u0430\u0440\u0435 <code>__dict__<\/code> \u044d\u0442\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430.<\/p>\n<pre><code class=\"python\">&gt;&gt;&gt; a &lt;__main__.A object at 0x7f3040db91d0&gt;<\/code><\/pre>\n<p>  <\/p>\n<h3><a name=\"8\"><\/a><font color=\"orange\">8. Asyncio \u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0431\u043e\u0442\u0430 <\/font><\/h3>\n<p>  \u0412 \u043b\u044e\u0431\u043e\u0439 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0438\u0433\u0440\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0445\u043e\u0442\u044c \u043e\u0434\u0438\u043d \u0431\u043e\u0442, \u0438 \u043d\u0430\u0448\u0430 \u0438\u0433\u0440\u0430 \u043d\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435. \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u043f\u043e\u043a\u0430 \u0432\u0441\u0435, \u0447\u0442\u043e \u0443\u043c\u0435\u0435\u0442 \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0430\u0448 \u0431\u043e\u0442, \u044d\u0442\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0442\u044c\u0441\u044f \u043a\u043e\u043d\u0446\u0435\u043d\u0442\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u043a\u0440\u0443\u0433\u0430\u043c\u0438, \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0430\u044f\u0441\u044c \u043a \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0438\u0433\u0440\u043e\u043a. \u0415\u0441\u043b\u0438 \u0437\u0430\u0448\u0451\u043b \u043d\u043e\u0432\u044b\u0439 \u0438\u0433\u0440\u043e\u043a, \u0442\u043e \u0431\u043e\u0442 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0441\u0432\u043e\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u043d\u0435\u0433\u043e.<br \/>  \u0421\u0442\u0440\u043e\u0447\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0441\u044b\u043b\u0430\u044e\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435, \u0432\u0441\u0435\u043c \u0438\u0433\u0440\u043e\u043a\u0430\u043c \u0432 \u043a\u043e\u043c\u043d\u0430\u0442\u0435 \u043e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u0445, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043f\u0435\u0440\u0435\u0434\u0432\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u0431\u043e\u0442.<\/p>\n<pre><code class=\"python\">mess = dict(e=&quot;move&quot;, bot=1, id=self.id, **self.pos_as_dict) self.room.send_all(mess, except_=(self,))<\/code><\/pre>\n<p>  \u041e\u0431\u0449\u0430\u044f \u0441\u0445\u0435\u043c\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0431\u043e\u0442\u0430 \u0438 \u0435\u0433\u043e \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u0439 \u0447\u0430\u0441\u0442\u044c\u044e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/424\/440\/4e0\/4244404e0c01441c968a80ed78d412c3.jpg\"\/><br \/>  \u0412 \u043a\u043b\u0430\u0441\u0441\u0435 <code>Room<\/code> \u043c\u044b \u0432 <code>__init__<\/code> \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 <code>Bot<\/code>. \u0410 \u0443\u0436\u0435 \u0432 <code>def __init__<\/code> \u0432 \u0441\u0430\u043c\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0435 <code>Bot<\/code> \u043c\u044b \u0432 <code>asyncio.async(self.update())<\/code> \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u0437\u0430\u0434\u0430\u0447\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0434\u043e\u043b\u0436\u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u043f\u0440\u043e\u0445\u043e\u0434\u0435.<br \/>  \u0412\u044b\u0437\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0435\u0439 <code>yield<\/code> \u043d\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0441\u0430\u043c\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u0430 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043e\u0431\u044a\u0435\u043a\u0442-\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440. \u0422\u0430\u043a \u0436\u0435 \u043a\u0430\u043a \u0438 \u0432\u044b\u0437\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u043d\u043e\u0439 \u043a\u0430\u043a <code>class<\/code> \u043d\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u044d\u0442\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u0430 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043e\u0431\u044a\u0435\u043a\u0442, \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0439 \u044d\u0442\u0438\u043c \u043a\u043b\u0430\u0441\u0441\u043e\u043c. \u0412\u044b\u0437\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0435\u0439 <code>yield<\/code> \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0451\u0442 \u0442\u043e\u0433\u0434\u0430, \u043a\u043e\u0433\u0434\u0430 \u0443 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u043d \u043c\u0435\u0442\u043e\u0434 <code>.__next__()<\/code>. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u2014 <code>next<\/code> \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0434\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440\u0435 <code>@coroutine<\/code> \u2014 \u043e\u043d \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u0443.<br \/>  \u041f\u0440\u043e\u0449\u0435 \u0433\u043e\u0432\u043e\u0440\u044f, \u043a\u0430\u0436\u0434\u044b\u0435 100 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434 \u043c\u044b \u043e\u0442\u0441\u044b\u043b\u0430\u0435\u043c \u043a\u043b\u0438\u0435\u043d\u0442\u0443 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0441 \u043d\u043e\u0432\u044b\u043c\u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c\u0438 \u0434\u043b\u044f \u0431\u043e\u0442\u0430, \u0438 \u043a\u0430\u0436\u0434\u044b\u0435 \u043f\u043e\u043b\u0441\u0435\u043a\u0443\u043d\u0434\u044b \u0443 \u043d\u0430\u0441 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0431\u043e\u0442\u0430.<\/p>\n<p>  \u041f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0437\u0430\u0434\u0430\u0447\u0430\u043c\u0438 \u0432 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u0446\u0438\u043a\u043b\u0435:<\/p>\n<pre><code class=\"python\">import asyncio  @asyncio.coroutine def test( name ):     ctr = 0     while True:         yield from asyncio.sleep(2)         ctr += 1         print(&quot;Task {}: test({})&quot;.format( ctr, name ))  asyncio.async( test(&quot;A&quot;) ) asyncio.async( test(&quot;B&quot;) ) asyncio.async( test(&quot;C&quot;) )  loop = asyncio.get_event_loop() loop.run_forever( )<\/code><\/pre>\n<p>  \u0412\u0441\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u043c \u0432 <code>asyncio.async<\/code>, \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u0441\u044f \u043f\u043e \u043a\u0440\u0443\u0433\u0443 \u0441 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u043e\u0439, \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u0432 <code>asyncio.sleep(2)<\/code> \u0432 \u0434\u0432\u0435 \u0441\u0435\u043a\u0443\u043d\u0434\u044b). \u041f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0443 \u044d\u0442\u043e\u0433\u043e \u043e\u0447\u0435\u043d\u044c \u043e\u0431\u0448\u0438\u0440\u043d\u043e\u0435, \u043f\u043e\u043c\u0438\u043c\u043e \u0431\u043e\u0442\u043e\u0432 \u0434\u043b\u044f \u0438\u0433\u0440 \u043c\u043e\u0436\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u0431\u043e\u0442\u044b \u0434\u043b\u044f \u0441\u0438\u0441\u0442\u0435\u043c \u0442\u0440\u0435\u0439\u0434\u0438\u043d\u0433\u0430, \u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u0438, \u0447\u0442\u043e \u0443\u0434\u043e\u0431\u043d\u043e, \u043d\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044f \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u044b. \u0427\u0442\u043e \u043d\u0430 \u043c\u043e\u0439 \u0441\u0443\u0431\u044a\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0438 \u043c\u0435\u0441\u0442\u0430\u043c\u0438, \u0447\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0446\u0435\u043d\u043d\u043e, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0437\u043e\u043e\u043f\u0430\u0440\u043a\u0430.<br \/>  <i>\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0432\u0435\u0440\u0441\u0438\u044f\u0445 <code>Python<\/code> \u043f\u043e\u0441\u043b\u0435 3.4.3 <code>asyncio.async<\/code> \u0441\u0442\u0430\u043d\u0435\u0442 \u0430\u043b\u0438\u0430\u0441\u043e\u043c \u0438 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043c\u0435\u043d\u0435\u043d \u043d\u0430 <code>asyncio.ensure_future<\/code>. <\/i><\/p>\n<h3><a name=\"9\"><\/a><font color=\"orange\">9. Nginx \u0438 \u043f\u0440\u043e\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u043e\u043a\u0435\u0442\u043e\u0432<\/font><\/h3>\n<p>  \u0418 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0447\u0442\u043e \u0441\u0442\u043e\u0438\u0442 \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u044c \u0432 \u0441\u0432\u044f\u0437\u0438 \u0441 \u0438\u0433\u0440\u043e\u0439 \u2014 \u044d\u0442\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0443\u044e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443 <code>Nginx<\/code> \u0434\u043b\u044f \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0442\u043e\u0447\u043d\u043e \u0437\u043d\u0430\u0435\u043c, \u0447\u0442\u043e \u043d\u0430\u0448 \u043f\u0440\u043e\u0435\u043a\u0442 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0438 \u0441 <code>websocket<\/code> \u0438 \u0441 <code>http<\/code>. \u041f\u0435\u0440\u0432\u043e\u0435, \u0447\u0442\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0432 \u0433\u043e\u043b\u043e\u0432\u0443, \u044d\u0442\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u0430\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f:<\/p>\n<pre><code class=\"python\">server {         server_name        aio.dev;          location \/ {                  proxy_pass http:\/\/127.0.0.1:8080;          } }<\/code><\/pre>\n<p>  \u0418 \u043e\u043d\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c, \u043d\u043e \u0443 \u043d\u0435\u0435 \u0435\u0441\u0442\u044c \u043e\u0434\u0438\u043d \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0439 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u043a \u2014 \u0432 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0435 \u043d\u0430 \u0432\u043d\u0435\u0448\u043d\u0435\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u0441 \u0442\u0430\u043a\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0435\u0439 \u0441\u043e\u043a\u0435\u0442\u044b \u0443\u0436\u0435 \u043d\u0435 \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u0438\u0442\u044c\u0441\u044f \u043a \u0432\u043d\u0435\u0448\u043d\u0435\u043c\u0443 \u0430\u0434\u0440\u0435\u0441\u0443 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 <code>5.5.5.10<\/code> \u0430 \u043d\u0435 \u043a <code>loalhost<\/code>.<br \/>  \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0438\u0434\u0435\u044f \u044d\u0442\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c: <\/p>\n<pre><code class=\"nginx\">server {         server_name        aio.dev;          location \/ {                  proxy_pass http:\/\/5.5.0.10:8080;          } }<\/code><\/pre>\n<p>  \u041d\u043e \u043e\u043d\u0430 \u0442\u043e\u0436\u0435 \u0443\u0449\u0435\u0440\u0431\u043d\u0430, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u0438\u0442\u043e\u043d\u0430 \u043d\u0438\u0436\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 <code>nginx<\/code> \u043d\u0430 \u043f\u043e\u0440\u044f\u0434\u043a\u0438, \u0438 \u0432 \u043b\u044e\u0431\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 <code>proxy_pass<\/code> \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c <code><a href=\"http:\/\/127.0.0.1\"><\/a>127.0.0.1:8080<\/code><br \/>  \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e <code>Nginx<\/code>-a, \u043f\u043e\u044f\u0432\u0438\u0432\u0448\u0435\u0439\u0441\u044f \u043f\u0430\u0440\u0443 \u043b\u0435\u0442 \u043d\u0430\u0437\u0430\u0434, \u043f\u0440\u043e\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0441\u043e\u043a\u0435\u0442\u043e\u0432:<\/p>\n<pre><code class=\"nginx\">server {         server_name        aio.dev;          location \/ {                  proxy_pass http:\/\/127.0.0.1:8080;          }         location \/ws {               proxy_pass http:\/\/127.0.0.1:8080;               proxy_http_version 1.1;               proxy_set_header Upgrade $http_upgrade;               proxy_set_header Connection &quot;upgrade&quot;;        } }<\/code><\/pre>\n<p>  \u0414\u043b\u044f \u0430\u0434\u0440\u0435\u0441\u0430 \u043f\u0440\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u043e\u043a\u0435\u0442\u043e\u0432 \u043c\u044b \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043f\u043e\u0440\u0442 80 <code>var uri = &quot;ws:\/\/aio.dev:80\/ws&quot;<\/code>, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e <code>Nginx<\/code> \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d \u043d\u0430 \u043f\u0440\u043e\u0441\u043b\u0443\u0448\u0438\u0432\u0430\u043d\u0438\u0435 80 \u043f\u043e\u0440\u0442\u0430, \u0435\u0441\u043b\u0438 \u043c\u044b \u044f\u0432\u043d\u043e \u043d\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c <code>listen<\/code>.<br \/>  \u0418 \u0432 \u0442\u0430\u043a\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0432\u0441\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0437\u0430 <code>Nginx<\/code>-\u043e\u043c, \u0438 \u0431\u0443\u0434\u0443\u0442 \u0443\u0434\u043e\u0431\u043d\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0438 <code>websoket<\/code>-\u044b, \u0438 <code>http<\/code>.<\/p>\n<h3><a name=\"10\"><\/a><font color=\"orange\">10. \u0410\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0435 \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435.<\/font><\/h3>\n<p>  \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443, \u0438\u0433\u0440\u0430 \u0431\u044b\u043b\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u043a\u0430\u043a \u043e\u0434\u0438\u043d \u0438\u0437 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u044b\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430, \u0442\u043e \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0430\u0440\u0443 \u0441\u043b\u043e\u0432 \u043f\u0440\u043e \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u043d\u043e\u0432\u043e\u0432\u0432\u0435\u0434\u0435\u043d\u0438\u044f. <\/p>\n<p>  \u0412 \u044d\u0442\u043e\u043c \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>memcached<\/code> \u0434\u043b\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0441 <code>@asyncio.coroutine<\/code>. \u0412 \u043b\u044e\u0431\u043e\u043c \u0431\u043e\u043b\u0435\u0435-\u043c\u0435\u043d\u0435\u0435 \u043f\u043e\u0441\u0435\u0449\u0430\u0435\u043c\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u0441\u0430\u0439\u0442\u0435 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0441\u0435\u0449\u0430\u0435\u043c\u044b\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u2014 \u0433\u043b\u0430\u0432\u043d\u0443\u044e, \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u043d\u043e\u0432\u043e\u0441\u0442\u0438, \u0438 \u0442.\u0434., \u0430 \u0442\u0430\u043a\u0436\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u043a\u0435\u0448 \u043f\u0440\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b, \u0434\u043e \u0438\u0441\u0442\u0435\u0447\u0435\u043d\u0438\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0411\u043b\u0430\u0433\u043e <a href=\"https:\/\/github.com\/aio-libs\/aiomcache\">\u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u0434\u0440\u0430\u0439\u0432\u0435\u0440<\/a> \u0434\u043b\u044f memcached \u0443\u0436\u0435 \u0431\u044b\u043b \u043d\u0430\u043f\u0438\u0441\u0430\u043d  <a href=\"https:\/\/habrahabr.ru\/users\/svetlov\/\" class=\"user_link\">svetlov<\/a>, \u043e\u0441\u0442\u0430\u0432\u0430\u043b\u043e\u0441\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0434\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440 \u0438 \u0440\u0435\u0448\u0438\u0442\u044c \u043f\u0430\u0440\u0443 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c.<\/p>\n<p>  \u0421\u0430\u043c\u043e \u043f\u043e \u0441\u0435\u0431\u0435 \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0431\u044b\u043b\u043e \u0440\u0435\u0448\u0435\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0432 \u0432\u0438\u0434\u0435 \u0434\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440\u0430 \u043d\u0430\u0434 \u043b\u044e\u0431\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u0430\u043a \u0432 <a href=\"https:\/\/beaker.readthedocs.org\/en\/latest\/caching.html#decorator-api\">beaker<\/a>. \u0412 \u0434\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u0432\u0440\u0435\u043c\u044f \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e, \u0432 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438, \u0438 \u0431\u0443\u0434\u0435\u0442 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043a\u043b\u044e\u0447 \u0434\u043b\u044f memcached.<\/p>\n<p>  \u0421\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u043f\u043e\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0438\u0445 \u0432 <code>memcached<\/code> \u0431\u0443\u0434\u0443\u0442 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>pickle<\/code>. \u0418 \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u043d\u044e\u0430\u043d\u0441 \u2014 \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043f\u043e\u0432\u0435\u0440\u0445 <code>aiohttp<\/code>, \u0442\u043e \u0432 \u043d\u0435\u043c \u043d\u0435 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b\u0441\u044f <code>CIMultiDict<\/code>, \u044d\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u043b\u043e\u0432\u0430\u0440\u044f \u0441 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u0438\u043c\u0435\u0442\u044c \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0435 \u043a\u043b\u044e\u0447\u0438, \u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u0430\u044f \u0434\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u043d\u0430 <code>Cython<\/code> \u0430\u0432\u0442\u043e\u0440\u043e\u043c <code>aiohttp<\/code>.<\/p>\n<pre><code class=\"python\">    dct = CIMultiDict()     print( dct )     &lt;CIMultiDict {}&gt;     dct = MultiDict({'1':['www', 333]})     print( dct )     &lt;MultiDict {'1': ['www', 333]}&gt;     dct = MultiDict([('a', 'b'), ('a', 'c')])     print( dct )     &lt;MultiDict {'a': 'b', 'a': 'c'}&gt;     dct = dict([('a', 'b'), ('a', 'c')])     print( dct )     {'a': 'c'}<\/code><\/pre>\n<p>  \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0442\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0441\u044c \u0432 \u043d\u0435\u043c, \u043e\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c \u043d\u0435 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0443\u0435\u043c\u044b \u0432 <code>pickle<\/code>. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0438\u0445 \u0434\u043e\u0441\u0442\u0430\u0442\u044c \u0438 \u043f\u0435\u0440\u0435\u043f\u0430\u043a\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0442\u043d\u043e, \u043d\u043e \u043d\u0430\u0434\u0435\u044e\u0441\u044c, \u0447\u0442\u043e \u0441\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c <code>CIMultiDict<\/code> \u0441\u0442\u0430\u043d\u0435\u0442 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0443\u0435\u043c\u044b\u043c \u0432 <code>pickle<\/code>.<\/p>\n<pre><code class=\"python\">d = MultiDict([('a', 'b'), ('a', 'c')]) prepared = [(k, v) for k, v in d.items()] saved = pickle.dumps(prepared) restored = pickle.loads(saved) refined = MultiDict( restored )<\/code><\/pre>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"python\">def cache(name, expire=0):     def decorator(func):         @asyncio.coroutine         def wrapper(request=None, **kwargs):             args = [r for r in [request] if isinstance(r, aiohttp.web_reqrep.Request)]             key = cache_key(name, kwargs)              mc = request.app.mc             value = yield from mc.get(key)             if value is None:                 value = yield from func(*args, **kwargs)                 v_h = {}                 if isinstance(value, web.Response):                     v_h = value._headers                     value._headers = [(k, v) for k, v in value._headers.items()]                 yield from mc.set(key, pickle.dumps(value, protocol=pickle.HIGHEST_PROTOCOL), exptime=expire)                 if isinstance(value, web.Response):                     value._headers = v_h             else:                 value = pickle.loads(value)                 if isinstance(value, web.Response):                     value._headers = CIMultiDict(value._headers)             return value          return wrapper      return decorator<\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u041f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e, \u043d\u0430\u043f\u0438\u0441\u0430\u0432 \u0441\u0432\u0435\u0440\u0445\u0443 \u0434\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440 \u0438 \u0443\u043a\u0430\u0437\u0430\u0432 \u0442\u0430\u043c \u0432\u0440\u0435\u043c\u044f \u0438\u0441\u0442\u0435\u0447\u0435\u043d\u0438\u044f \u043a\u044d\u0448\u0430 \u0438 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435. <\/p>\n<pre><code class=\"python\">from core.union import cache  @cache('list_cached', expire=10 ) @asyncio.coroutine def list_tags(request):             return templ('list_tags', request, {})<\/code><\/pre>\n<p>  <\/p>\n<h3><a name=\"11\"><\/a><font color=\"orange\">\u041f\u043e\u0441\u043b\u0435\u0441\u043b\u043e\u0432\u0438\u0435<\/font><\/h3>\n<p>  \u041d\u0430 \u0434\u0430\u043d\u043d\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u044d\u0442\u043e \u0441\u043a\u043e\u0440\u0435\u0435 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u0430\u0434\u0438\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438\u0433\u0440\u044b \u0438, \u0441\u043a\u043e\u0440\u0435\u0435, \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 <code>WebGL<\/code> \u0438 <code>asyncio<\/code> \u0447\u0435\u043c \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u043d \u0432\u0435\u0440\u0441\u0438\u044f. \u041d\u043e \u044f \u043d\u0430\u0434\u0435\u044e\u0441\u044c, \u0447\u0442\u043e \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0432\u0435\u0440\u0441\u0438\u044f\u0445 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 \u0432\u0441\u0435 \u0431\u0443\u0434\u0435\u0442 \u0443\u0436\u0435 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u043b\u0438\u0436\u0435 \u043a \u0438\u0434\u0435\u0430\u043b\u0443. \u0425\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438\u0433\u0440\u0443 \u0432 \u0432\u0438\u0434\u0435 \u043a\u043e\u0441\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0430\u0433\u0438, \u0433\u0434\u0435 \u0438\u0433\u0440\u043e\u043a\u0438 \u043c\u043e\u0433\u043b\u0438 \u0431\u044b \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u043c\u0435\u043d\u044f\u0442\u044c \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0435\u0439 \u0434\u043b\u044f \u0431\u043e\u0451\u0432 \u0432 \u0432\u043e\u0437\u0434\u0443\u0445\u0435, \u043d\u0430 \u0437\u0435\u043c\u043b\u0435 \u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0432 \u0432\u0438\u0434\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0438\u0433\u0440\u043e\u043a\u043e\u0432.<\/p>\n<p>  \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u043d\u0440\u0430\u0432\u0438\u043b\u0438\u0441\u044c \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0438 \u0438\u0437 <font color=\"orange\">Star Wars<\/font>, \u0442\u043e \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u0441\u0435 \u0432 \u0444\u0443\u0442\u0443\u0440\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u0432\u0438\u0434\u0435, \u0447\u0435\u043c \u0432 \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u043e\u043c.<br \/>  \u0421 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 \u043b\u043e\u043a\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043b\u044e\u0431\u043e\u0439 \u0438\u0437 \u0443\u0440\u043e\u0432\u043d\u0435\u0439 \u0438\u0433\u0440\u044b, \u0441\u0434\u0435\u043b\u0430\u0432 \u0435\u0433\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c, \u0438, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044d\u0442\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u043c\u0435\u043d\u044f\u0442\u044c \u043a\u0430\u0440\u0442\u044b \u0438 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0438 \u0438\u0433\u0440\u044b.<\/p>\n<p>  \u041d\u0438\u0436\u0435 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u044b \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435, \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432 \u0442\u043e\u0439 \u0438\u043b\u0438 \u0438\u043d\u043e\u0439 \u0441\u0442\u0435\u043f\u0435\u043d\u0438 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0438 \u043d\u0430\u0434 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438, \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u0431\u0443\u0434\u0435\u0442 \u0432\u0435\u0441\u0442\u0438\u0441\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430.<\/p>\n<h5><font color=\"green\">Ping<\/font><\/h5>\n<p>  \u0421\u0435\u0440\u0432\u0435\u0440 \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043f\u0438\u043d\u0433 \u043e\u0442 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0433\u0440\u043e\u043a\u0430 \u0438 \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u0442\u044c\u0441\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043f\u043e\u043f\u0430\u0434\u0430\u043d\u0438\u044f, \u043f\u0435\u0440\u0435\u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u0438 \u0442.\u0434. \u0445\u043e\u0442\u044f \u0431\u044b \u043f\u0440\u0438\u0431\u043b\u0438\u0437\u0438\u0442\u0435\u043b\u044c\u043d\u043e. \u041d\u043e\u0432\u044b\u0439 \u0438\u0433\u0440\u043e\u043a \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0435\u0442\u0441\u044f, \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u043e\u043f\u0430\u0434\u0430\u0442\u044c \u0432 \u0442\u0443 \u043a\u043e\u043c\u043d\u0430\u0442\u0443, \u0433\u0434\u0435 \u0443 \u043e\u043f\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0439 \u043f\u0438\u043d\u0433. \u0425\u043e\u0442\u044f \u0434\u043b\u044f \u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0442 \u0440\u0430\u0437\u043d\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0432 \u0433\u043e\u043b\u043e\u0432\u0443. <\/p>\n<h5><font color=\"green\">\u0427\u0438\u0442\u0435\u0440\u0441\u0442\u0432\u043e<\/font><\/h5>\n<p>  \u0415\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0434\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043a\u043b\u0438\u0435\u043d\u0442\u0443 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435\u043b\u044c\u0437\u044f \u0438 \u043f\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u0441\u0435\u0440\u0432\u0435\u0440 \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0438\u043c\u0435\u0442\u044c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e \u0432\u0441\u0435\u0439 \u043a\u0430\u0440\u0442\u0435 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u0438\u0433\u0440\u043e\u043a\u043e\u0432, \u0442\u0440\u0430\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u043f\u0443\u043b\u044c, \u0442\u043e \u0435\u0441\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u043f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0439 \u0432\u0435\u043a\u0442\u043e\u0440 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b, \u0438 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0447\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u043e \u044d\u0442\u043e\u043c\u0443 \u0432\u0435\u043a\u0442\u043e\u0440\u0443 \u0434\u0432\u0438\u0433\u0430\u043b\u0438\u0441\u044c \u043f\u0443\u043b\u0438. \u0418\u043d\u0430\u0447\u0435, \u043f\u0440\u0438 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0441\u0442\u0438 \u0438\u0433\u0440\u044b, \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u0438\u0437\u0431\u0435\u0436\u043d\u044b\u043c \u043f\u0440\u043e\u0446\u0432\u0435\u0442\u0430\u043d\u0438\u0435 \u0440\u0430\u0437\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u043e\u0433\u043e \u0447\u0438\u0442\u0435\u0440\u0441\u0442\u0432\u0430. <\/p>\n<h4>Roadmap \u2014 \u0438\u0433\u0440\u044b<\/h4>\n<p>  Client: <\/p>\n<p>  <\/p>\n<ul>\n<li>\u0421\u0442\u0440\u0435\u043b\u044c\u0431\u0430 \u0443 \u0431\u043e\u0442\u0430, \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0438\u0434\u043e\u0432 \u043e\u0440\u0443\u0436\u0438\u044f.<\/li>\n<li>\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0442\u0430\u043d\u043a\u043e\u043c \u2014 \u043c\u044b\u0448\u044c\u044e \u043f\u043e\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0431\u0430\u0448\u043d\u044f, \u0441\u0442\u0440\u0435\u043b\u043e\u0447\u043a\u0430\u043c\u0438 \u0441\u0430\u043c \u0442\u0430\u043d\u043a<\/li>\n<li>\u041f\u0435\u0440\u0435\u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u0434 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0443\u0433\u043b\u0430\u043c\u0438<\/li>\n<li>\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u0430\u0440\u0442 \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0432\u043e\u0439\u043d\u044b \u0432 \u043a\u043e\u0441\u043c\u043e\u0441\u0435\/\u043d\u0435\u0431\u0435<\/li>\n<li>\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u0430\u0440\u0442 \u0438 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0435\u0439 \u043f\u0435\u0445\u043e\u0442\u044b \u0434\u043b\u044f \u0432\u043e\u0439\u043d\u044b \u0432 \u043f\u043e\u043b\u0435 like Urban Terror<\/li>\n<\/ul>\n<p>  Server:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0441\u0435\u0445 \u043f\u0435\u0440\u0435\u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0439<\/li>\n<li>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0439 \u0432\u044b\u0441\u0442\u0440\u0435\u043b\u0430<\/li>\n<li>\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u0431\u043e\u0442\u043e\u0432 ( \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0431\u043e\u0442\u043e\u0432, \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0438\u0445 \u0443\u0431\u044b\u0432\u0430\u043d\u0438\u0435 \u0438 \u0442.\u0434.) <\/li>\n<li>\u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u0418\u0418 \u0443 \u0431\u043e\u0442\u043e\u0432<\/li>\n<\/ul>\n<p>  <\/p>\n<h4>Roadmap \u2014 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 \u0432 \u0446\u0435\u043b\u043e\u043c<\/h4>\n<p>  <\/p>\n<ul>\n<li>\u041d\u0435\u0431\u043e\u043b\u044c\u0448\u0430\u044f CMS<\/li>\n<li>\u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0434\u043b\u044f \u0441\u043a\u043b\u0430\u0434\u0441\u043a\u043e\u0433\u043e \u0443\u0447\u0435\u0442\u0430 (\u043c\u0438\u043d\u0438 ERP)<\/li>\n<li>\u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043e\u0442\u0447\u0435\u0442\u043e\u0432<\/li>\n<li>Web \u043a\u043b\u0438\u0435\u043d\u0442 \u0434\u043b\u044f MongoDB <\/li>\n<li>\u0414\u0435\u043c\u043a\u0430 \u043c\u0438\u043d\u0438 \u0441\u043e\u0446-\u0441\u0435\u0442\u0438<\/li>\n<\/ul>\n<p>  <i>\u041d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u0447\u0442\u043e-\u0442\u043e \u0437\u0430\u0431\u044b\u043b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c, \u0433\u0434\u0435 \u0442\u043e \u043c\u043e\u0433 \u0441 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043c\u0438 \u043e\u0448\u0438\u0431\u0438\u0442\u044c\u0441\u044f. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u043e\u0448\u0443 \u0432\u0441\u0435 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0438 \u043f\u0440\u043e\u0447\u0438\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u043b\u0438\u0447\u043a\u0443.<\/i><\/p>\n<p>  <a href=\"http:\/\/habrahabr.ru\/post\/242541\/\">\u041f\u0435\u0440\u0432\u0430\u044f \u0447\u0430\u0441\u0442\u044c<\/a><br \/>  <a href=\"http:\/\/habrahabr.ru\/post\/246259\/\">\u041e\u0431\u0437\u043e\u0440\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u043f\u043e babylon.js \u0438 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0435\u0433\u043e \u0441 three.js<\/a><br \/>  \u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043d\u0430 <a href=\"https:\/\/github.com\/alikzao\/tao1\">github<\/a><br \/>  <a href=\"http:\/\/tao1.readthedocs.org\/\">\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043d\u0430 readthedocs<\/a><br \/>  <a href=\"http:\/\/tf3dm.com\/\">\u041e\u0434\u0438\u043d \u0438\u0437 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u0432\u044b\u0431\u043e\u0440\u043e\u043c \u043f\u043b\u0430\u0442\u043d\u044b\u0445 \u0438 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0445 3D \u041c\u043e\u0434\u0435\u043b\u0435\u0439<\/a><br \/>  <a href=\"http:\/\/www.blendswap.com\/blends\">\u0421\u0430\u0439\u0442 \u0441 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u043c\u0438 3D \u043c\u043e\u0434\u0435\u043b\u044f\u043c\u0438 \u0434\u043b\u044f Blender<\/a><br \/>  <a href=\"http:\/\/www.babylonjs-playground.com\/#YIT1S\"> \u0420\u043e\u0442\u0430\u0446\u0438\u044f<\/a><br \/>  <a href=\"http:\/\/doc.babylonjs.com\/tutorials\/16._Playing_sounds_and_music\">\u0440\u0430\u0431\u043e\u0442\u0430 \u0441\u043e \u0437\u0432\u0443\u043a\u043e\u043c \u0432 babylon.js<\/a><br \/>  <a href=\"http:\/\/www.babylonjs-playground.com\/#PTV7W#1\">\u041f\u0440\u0438\u043c\u0435\u0440 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0437\u0432\u0443\u043a\u0430<\/a><br \/>  <a href=\"https:\/\/docs.python.org\/3\/library\/asyncio-task.html#example-hello-world-coroutine\">\u041dello world \u043d\u0430 asynio<\/a><br \/>  <a href=\"https:\/\/docs.python.org\/3\/library\/asyncio-task.html#asyncio.sleep\">Sleep<\/a><br \/>  <a href=\"https:\/\/docs.python.org\/3\/library\/asyncio-task.html#example-parallel-execution-of-tasks\">\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u0437\u0430\u0434\u0430\u0447\u0430\u043c\u0438<\/a><br \/>  <a href=\"https:\/\/docs.python.org\/3\/library\/asyncio-eventloop.html#delayed-calls\">\u041e\u0442\u0441\u0442\u0440\u043e\u0447\u0435\u043d\u043d\u044b\u0435 \u0432\u044b\u0437\u043e\u0432\u044b<\/a><br \/>  <a href=\"https:\/\/www.python.org\/dev\/peps\/pep-0492\/\">pep-0492<\/a><br \/>  <a href=\"http:\/\/asvetlov.blogspot.com\/\">\u0411\u043b\u043e\u0433  <a href=\"https:\/\/habrahabr.ru\/users\/svetlov\/\" class=\"user_link\">svetlov<\/a> \u0430\u0432\u0442\u043e\u0440\u0430 aiohttp <\/a><br \/>  <a href=\"https:\/\/github.com\/aio-libs\/aiomcache\">\u0410\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u0434\u0440\u0430\u0439\u0432\u0435\u0440 memcached<\/a><br \/>  <a href=\"http:\/\/doc.babylonjs.com\/tutorials\">\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0434\u043b\u044f babylon.js<\/a><br \/>  <a href=\"https:\/\/github.com\/KeepSafe\/aiohttp\/tree\/master\/docs\">\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u043e aiohttp \u043d\u0430 github<\/a><br \/>  <a href=\"http:\/\/aiohttp.readthedocs.org\/\">\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u043e aiohttp \u043d\u0430 readthedocs<\/a><br \/>  <a href=\"https:\/\/docs.python.org\/3\/whatsnew\/3.3.html#pep-380\">\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u043e yield from <\/a><br \/>  <a href=\"https:\/\/github.com\/aio-libs\">aio-libs \u2014 \u0441\u043f\u0438\u0441\u043e\u043a \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a<\/a><br \/>  <a href=\"http:\/\/asyncio.org\/\">\u0415\u0449\u0435 \u043e\u0434\u0438\u043d \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043b\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a<\/a><\/p>\n<p>  \u0411\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043f\u0440\u043e \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u044b:<br \/>  <a href=\"http:\/\/www.dabeaz.com\/generators\/Generators.pdf\">http:\/\/www.dabeaz.com\/generators\/Generators.pdf<\/a><br \/>  <a href=\"http:\/\/www.dabeaz.com\/coroutines\/Coroutines.pdf\">http:\/\/www.dabeaz.com\/coroutines\/Coroutines.pdf<\/a><br \/>  <a href=\"http:\/\/www.dabeaz.com\/finalgenerator\/FinalGenerator.pdf\">http:\/\/www.dabeaz.com\/finalgenerator\/FinalGenerator.pdf<\/a>                 <\/p>\n<div class=\"clear\"><\/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:\/\/habrahabr.ru\/post\/252575\/\"> https:\/\/habrahabr.ru\/post\/252575\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>       <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/7f7\/b31\/ed7\/7f7b31ed7b3e41099718749ed5b7ccd5.jpg\"\/><br \/>  \u0412 \u044d\u0442\u043e\u043c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0435 \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u043b\u0441\u044f \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043d\u043e\u0433\u043e <code>3D<\/code>-\u0448\u0443\u0442\u0435\u0440\u0430, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u043e\u0442 \u0438\u043c\u043f\u043e\u0440\u0442\u0430 \u0441\u0438\u043c\u043f\u0430\u0442\u0438\u0447\u043d\u044b\u0445 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u0442\u0430\u043d\u043a\u043e\u0432 \u043d\u0430 \u0441\u0446\u0435\u043d\u0443 \u0438 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0438\u0433\u0440\u043e\u043a\u043e\u0432 \u0438 \u0431\u043e\u0442\u043e\u0432 \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>websocket<\/code> \u0438 <code>asyncio<\/code> \u0438 \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u043a\u043e\u0439 \u0438\u0445 \u043f\u043e \u043a\u043e\u043c\u043d\u0430\u0442\u0430\u043c.<\/p>\n<p>  <a href=\"#0\"> \u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 <\/a><br \/>  <a href=\"#1\">1. \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0438\u0433\u0440\u044b <\/a><br \/>  <a href=\"#2\">2. \u0418\u043c\u043f\u043e\u0440\u0442 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u0438 blender <\/a><br \/>  <a href=\"#3\">3. \u041f\u043e\u0434\u0433\u0440\u0443\u0437\u043a\u0430 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u0432 \u0438\u0433\u0440\u0435 \u0441 babylon.js \u0438 \u0441\u0430\u043c\u0438 \u043c\u043e\u0434\u0435\u043b\u0438 <\/a><br \/>  <a href=\"#4\">4. \u041f\u0435\u0440\u0435\u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f, \u043c\u0438\u043d\u0438\u043a\u0430\u0440\u0442\u0430 \u0438 \u0437\u0432\u0443\u043a\u0438 \u0438\u0433\u0440\u044b \u0432 babylon.js <\/a><br \/>  <a href=\"#5\">5. \u0412\u0435\u0431\u0441\u043e\u043a\u0435\u0442\u044b \u0438 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u0438\u0433\u0440\u044b <\/a><br \/>  <a href=\"#6\">6. \u0418\u0433\u0440\u043e\u043a\u0438 \u0438 \u0438\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0446\u0438\u044f <\/a><br \/>  <a href=\"#7\">7. \u0411\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u043a\u0430 \u0438\u0433\u0440\u043e\u043a\u043e\u0432 \u043f\u043e \u043a\u043e\u043c\u043d\u0430\u0442\u0430\u043c \u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u044b\u0439 \u043f\u0438\u0442\u043e\u043d <\/a><br \/>  <a href=\"#8\">8. Asyncio \u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0431\u043e\u0442\u0430 <\/a><br \/>  <a href=\"#9\">9. Nginx \u0438 \u043f\u0440\u043e\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u043e\u043a\u0435\u0442\u043e\u0432 <\/a><br \/>  <a href=\"#10\">10. \u0410\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0435 \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 memcache <\/a><br \/>  <a href=\"#11\">11. \u041f\u043e\u0441\u043b\u0435\u0441\u043b\u043e\u0432\u0438\u0435 \u0438 RoadMap<\/a><\/p>\n<p>  \u0412\u0441\u0435\u0445 \u043a\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430 \u0442\u0435\u043c\u0430 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0432 <code>Python3<\/code>, <code>WebGL<\/code> \u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0433\u0440, \u043f\u0440\u043e\u0448\u0443 \u043f\u043e\u0434 \u043a\u0430\u0442.  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-274352","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/274352","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=274352"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/274352\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=274352"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=274352"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=274352"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}