{"id":352160,"date":"2024-05-20T22:03:19","date_gmt":"2024-05-20T22:03:19","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=352160"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=352160","title":{"rendered":"<span>\u0421\u0430\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u043b, \u0441\u0430\u043c \u043f\u043e\u0438\u0433\u0440\u0430\u043b: \u043a\u0430\u043a \u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b 2D-\u0438\u0433\u0440\u0443 \u0434\u043b\u044f Android \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0441 \u043d\u0443\u043b\u044f, \u0432\u0435\u0441\u043e\u043c \u043c\u0435\u043d\u0435\u0435 1\u043c\u0431?<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/webt\/0y\/os\/et\/0yosetjj6dw8s5ycicghsmeqhf0.jpeg\" alt=\"image\" data-src=\"https:\/\/habrastorage.org\/webt\/0y\/os\/et\/0yosetjj6dw8s5ycicghsmeqhf0.jpeg\" data-blurred=\"true\"\/><\/p>\n<p>  \u041c\u043d\u043e\u0433\u0438\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u044b \u0442\u0430\u043a \u0438\u043b\u0438 \u0438\u043d\u0430\u0447\u0435 \u0438\u043c\u0435\u044e\u0442 \u0442\u044f\u0433\u0443 \u0438 \u0438\u043d\u0442\u0435\u0440\u0435\u0441 \u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0438\u0433\u0440. \u041d\u0435\u043c\u0430\u043b\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u043f\u0435\u0446\u043e\u0432 \u0431\u044b\u043b\u043e \u0437\u0430\u043c\u0435\u0447\u0435\u043d\u043e \u0437\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0445 \u0438 \u043c\u0438\u043b\u0435\u043d\u044c\u043a\u0438\u0445 \u0438\u0433\u0440\u0443\u0448\u0435\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u044b\u043b\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u044b \u0437\u0430 \u043a\u043e\u0440\u043e\u0442\u043a\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u00abjust for fun\u00bb. \u0411\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0437\u0430 \u0441\u0447\u0430\u0441\u0442\u044c\u0435 \u0432\u0437\u044f\u0442\u044c \u0433\u043e\u0442\u043e\u0432\u044b\u0439 \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u0434\u0432\u0438\u0436\u043e\u043a \u043f\u043e \u0442\u0438\u043f\u0443 Unity\/UE \u0438 \u043f\u043e\u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0441\u0432\u043e\u0451 \u0441 \u0438\u0445 \u043f\u043e\u043c\u043e\u0449\u044c\u044e, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0443\u043f\u043e\u0440\u043d\u044b\u0435 \u0438\u0437\u0443\u0447\u0430\u044e\u0442 \u0438 \u043f\u044b\u0442\u0430\u044e\u0442\u0441\u044f \u0447\u0442\u043e-\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432 \u044d\u043a\u0437\u043e\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0434\u0432\u0438\u0436\u043a\u0430\u0445 \u0442\u0438\u043f\u0430 Godot\/Urho, \u0430 \u0441\u043e\u0432\u0441\u0435\u043c \u043f\u0440\u043e\u0436\u0436\u0451\u043d\u043d\u044b\u0435 \u0440\u0435\u0431\u044f\u0442\u0430 \u043b\u044e\u0431\u044f\u0442 \u043f\u0438\u0441\u0430\u0442\u044c \u0438\u0433\u0440\u0443\u0448\u043a\u0438\u2026 \u0441 \u043d\u0443\u043b\u044f. \u0422\u0430\u043a\u043e\u0432\u044b\u043c \u043b\u044e\u0431\u0438\u0442\u0435\u043b\u0435\u043c \u043f\u0438\u0441\u0430\u0442\u044c \u0432\u0441\u0435 \u0441\u0430\u043c \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u0438 \u044f. \u0418 \u0432 \u043e\u0434\u0438\u043d \u0434\u0435\u043d\u044c \u043c\u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u043f\u0440\u0438\u043a\u043e\u043b\u044c\u043d\u043e\u0435, \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u0435 \u0438 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u2014 \u0434\u0432\u0430\u0434\u044d\u0448\u043d\u043e\u0435! \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0432\u044b \u0443\u0437\u043d\u0430\u0435\u0442\u0435 \u043f\u0440\u043e: \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e 2D-\u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440\u0430 \u0441 \u043d\u0443\u043b\u044f \u043d\u0430 \u0431\u0430\u0437\u0435 OpenGL ES, \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u00ab\u0441\u044b\u0440\u043e\u0433\u043e\u00bb \u0432\u0432\u043e\u0434\u0430 \u0432 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0445 \u0438\u0433\u0440\u0430\u0445, \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u0438 \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u0438 \u0438 \u0430\u0434\u0430\u043f\u0442\u0430\u0446\u0438\u044f \u0438\u0433\u0440\u044b \u043f\u043e\u0434 \u043b\u044e\u0431\u044b\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430. \u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e? \u0422\u043e\u0433\u0434\u0430 \u0436\u0434\u0443 \u0432\u0430\u0441 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435!<a name=\"habracut\"><\/a><\/p>\n<h2><font color=\"#1c22be\">\u276f<\/font> <font color=\"#454cee\">\u041a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442?<\/font><\/h2>\n<p>  \u041a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u0438\u0433\u0440 \u0441 \u043d\u0443\u043b\u044f \u2014 \u044d\u0442\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0432\u0435\u0441\u0435\u043b\u043e\u0435 \u0438 \u0443\u0432\u043b\u0435\u043a\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0437\u0430\u043d\u044f\u0442\u0438\u0435 \u0441\u0430\u043c\u043e \u043f\u043e \u0441\u0435\u0431\u0435. \u0412\u0435\u0434\u044c \u0443\u0434\u043e\u0432\u043e\u043b\u044c\u0441\u0442\u0432\u0438\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0433\u0440\u0430\u0435\u0442 \u0432 \u0443\u0436\u0435 \u0433\u043e\u0442\u043e\u0432\u0443\u044e \u0438\u0433\u0440\u0443, \u043d\u043e \u0438 \u0435\u0451 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0432\u043e\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u0412 \u0433\u0435\u0439\u043c\u0434\u0435\u0432\u0435 \u0435\u0441\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0438 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u2014 \u0438 \u0434\u043b\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0430.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/43c\/3b2\/441\/43c3b244183aab1ba0ddb893890fd0fc.webp\" alt=\"image\"\/><\/div>\n<p>  \u041e\u0434\u0438\u043d \u0438\u0437 \u043f\u0440\u043e\u0448\u043b\u044b\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u2014 3D \u0448\u0443\u0442\u044d\u043c\u0430\u043f \u043f\u043e\u0434\u2026 \u043a\u043e\u043c\u043c\u0443\u043d\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u0441 Windows Mobile \u0431\u0435\u0437 \u0432\u0438\u0434\u0435\u043e\u0443\u0441\u043a\u043e\u0440\u0438\u0442\u0435\u043b\u0435\u0439! \u0418\u0433\u0440\u0430 \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0430 \u0438 \u043d\u0430 HTC Gene, \u0438 \u043d\u0430 QTek S110!<\/p>\n<p>  \u0412 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0441\u0442\u0443\u0434\u0438\u044f\u0445 \u043f\u0440\u0438\u043d\u044f\u0442\u043e \u0432\u0441\u044e \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u043d\u0430 \u0446\u0435\u043b\u044b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432. \u0410\u0440\u0442\u043e\u0432\u0438\u043a\u0438 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442\u0441\u044f \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u0439, \u0437\u0432\u0443\u043a\u043e\u0432\u0438\u043a\u0438 \u2014 \u043c\u0443\u0437\u044b\u043a\u043e\u0439 \u0438 \u0437\u0432\u0443\u043a\u043e\u0432\u044b\u043c\u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0430\u043c\u0438, \u0433\u0435\u0439\u043c\u0434\u0438\u0437\u0430\u0439\u043d\u0435\u0440\u044b \u2014 \u043f\u0440\u043e\u0434\u0443\u043c\u044b\u0432\u0430\u044e\u0442 \u043c\u0438\u0440 \u0438 \u0433\u0435\u0439\u043c\u043f\u043b\u0435\u0439 \u0431\u0443\u0434\u0443\u0449\u0435\u0439 \u0438\u0433\u0440\u044b, \u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u044b \u2014 \u0432\u043e\u043f\u043b\u043e\u0449\u0430\u044e\u0442 \u0432\u0441\u0451 \u044d\u0442\u043e \u0432 \u0436\u0438\u0437\u043d\u044c. \u041e\u0434\u043d\u0430\u043a\u043e, \u0437\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 20 \u043b\u0435\u0442 \u043f\u043e\u044f\u0432\u0438\u043b\u043e\u0441\u044c \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e <i>\u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0445<\/i> \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0438\u043b\u0438 \u0434\u0430\u0436\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438-\u043e\u0434\u0438\u043d\u043e\u0447\u043a\u0438 \u043c\u043e\u0433\u0443\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0438\u0433\u0440\u044b \u0441\u0430\u043c\u0438!<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/post_images\/09f\/c9b\/a4e\/09fc9ba4e810e46453d8a6051fae7a47.jpg\" alt=\"image\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/09f\/c9b\/a4e\/09fc9ba4e810e46453d8a6051fae7a47.jpg\" data-blurred=\"true\"\/><\/div>\n<p>  \u041f\u043e\u0434\u043e\u0431\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0442 \u0432 \u0441\u0435\u0431\u044f \u043a\u0430\u043a \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 <i>\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u044b \u0438\u0433\u0440<\/i>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0431\u044b\u0447\u043d\u043e \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u0441\u0435\u0440\u044c\u0451\u0437\u043d\u044b\u0445 \u043d\u0430\u0432\u044b\u043a\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0438\u0433\u0440\u0443 \u0438\u0437 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0431\u043b\u043e\u043a\u043e\u0432, \u0442\u0430\u043a \u0438 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0445 \u0438\u0433\u0440\u043e\u0432\u044b\u0445 \u0434\u0432\u0438\u0436\u043a\u043e\u0432 \u043d\u0430 \u043c\u0430\u043d\u0435\u0440 Unity \u0438\u043b\u0438 Unreal Engine, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c \u043f\u0438\u0441\u0430\u0442\u044c \u0438\u0433\u0440\u044b \u0438 \u043f\u0440\u043e\u0434\u0443\u043c\u044b\u0432\u0430\u0442\u044c \u0438\u0445 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 \u0441\u0430\u043c\u0438\u043c. \u041c\u043e\u0436\u043d\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0447\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u00ab\u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f\u00bb \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u0438\u0434\u0435\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e \u043d\u0430 \u0440\u044b\u043d\u043a\u0435 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0445 \u0438\u0433\u0440, \u0433\u0434\u0435 \u0431\u0430\u043b\u043e\u043c \u043f\u0440\u0430\u0432\u044f\u0442 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u0438 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0435 \u0434\u043e\u043d\u0430\u0442\u043d\u044b\u0435 \u0438\u0433\u0440\u0443\u0448\u043a\u0438, \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0435 <i>\u0433\u0438\u043f\u0435\u0440\u043a\u0435\u0436\u0443\u0430\u043b\u043e\u043c<\/i>.<\/p>\n<p>  \u041d\u043e \u0443 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0438\u043d\u0443\u0441\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0430\u043d\u0430\u043b\u044c\u043d\u043e \u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0438\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432:<\/p>\n<ul>\n<li> <b>\u0411\u043e\u043b\u044c\u0448\u043e\u0439 \u0432\u0435\u0441 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/b>: \u041f\u0440\u0438 \u0441\u0431\u043e\u0440\u043a\u0435, Unity \u0438 UE \u0441\u043e\u0437\u0434\u0430\u044e\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u0431\u044a\u0451\u043c\u043d\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b \u0438\u0437-\u0437\u0430 \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0434\u0430\u0436\u0435 \u043f\u0443\u0441\u0442\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u043c\u043e\u0436\u0435\u0442 \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u043e \u0432\u0435\u0441\u0438\u0442\u044c 50-100 \u043c\u0435\u0433\u0430\u0431\u0430\u0439\u0442.<\/li>\n<li> <b>\u041d\u0435\u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c<\/b>: \u0418 \u0443 Unity, \u0438 \u0443 UE \u043e\u0447\u0435\u043d\u044c \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0441\u043d\u044b\u0435 \u0438 \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440\u044b \u00ab\u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c\u00bb. \u0415\u0441\u043b\u0438 \u0441\u0435\u0439\u0447\u0430\u0441 \u043a\u0443\u043f\u0438\u0442\u044c \u0434\u0435\u0448\u0435\u0432\u044b\u0439 \u0441\u043c\u0430\u0440\u0442\u0444\u043e\u043d \u0437\u0430 3-4 \u0442\u044b\u0441\u044f\u0447\u0438 \u0440\u0443\u0431\u043b\u0435\u0439 \u0438 \u043f\u043e\u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043d\u0435\u0433\u043e \u043d\u0430\u043a\u0430\u0442\u0438\u0442\u044c \u043a\u0430\u043a\u043e\u0439-\u043d\u0438\u0431\u0443\u0434\u044c 3 \u0432 \u0440\u044f\u0434, \u0442\u043e \u043d\u0430\u0441 \u0436\u0434\u0443\u0442 \u043b\u0438\u0431\u043e \u0432\u044b\u043b\u0435\u0442\u044b, \u043b\u0438\u0431\u043e \u0434\u0438\u043a\u0438\u0435 \u0442\u043e\u0440\u043c\u043e\u0437\u0430.<\/li>\n<\/ul>\n<p>  \u041b\u0438\u0447\u043d\u043e \u044f \u0434\u043b\u044f \u0441\u0435\u0431\u044f \u043f\u0440\u0438\u043c\u0435\u0442\u0438\u043b \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u043c\u0438\u043d\u0443\u0441 \u2014 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0434\u0435\u043f\u043b\u043e\u0438\u0442\u044c \u0438\u0433\u0440\u044b \u043d\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0441 \u0441\u0442\u0430\u0440\u044b\u043c\u0438 \u0432\u0435\u0440\u0441\u0438\u044f\u043c\u0438 Android, \u043d\u043e \u044d\u0442\u043e, \u043e\u043f\u044f\u0442\u044c \u0436\u0435, \u043c\u043e\u044f \u043b\u0438\u0447\u043d\u0430\u044f \u0445\u043e\u0442\u0435\u043b\u043a\u0430.<\/p>\n<p>  \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a\u043e\u0433\u0434\u0430 \u043c\u043d\u0435 \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u043f\u0440\u0438\u0448\u043b\u0430 \u043c\u044b\u0441\u043b\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438\u0433\u0440\u0443\u0448\u043a\u0443, \u044f \u0440\u0435\u0448\u0438\u043b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0435\u0451 \u0441 \u043d\u0443\u043b\u044f \u2014 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u0434\u0432\u0438\u0436\u043a\u043e\u0432, \u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0432 \u0432\u0441\u0451 \u0441\u0430\u043c \u2014 \u0438 \u0438\u0433\u0440\u043e\u0432\u0443\u044e \u043b\u043e\u0433\u0438\u043a\u0443, \u0438 \u0441\u0430\u043c \u00ab\u0434\u0432\u0438\u0436\u043e\u043a\u00bb (\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0435\u0435 \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a). \u041d\u0435 \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u0432 \u044d\u0442\u043e\u043c \u0435\u0441\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0441\u043b\u043e\u0436\u043d\u043e\u0435 \u2014 \u0432 \u0433\u0435\u0439\u043c\u0434\u0435\u0432\u0435 \u0435\u0441\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u043a\u0430\u0441\u0442\u0430 \u00ab\u043e\u0442\u0448\u0435\u043b\u044c\u043d\u0438\u043a\u043e\u0432\u00bb, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u0441\u0435\u0431\u044f \u00ab\u0434\u0432\u0438\u0436\u043a\u043e\u043f\u0438\u0441\u0430\u0442\u0435\u043b\u044f\u043c\u0438\u00bb \u0438 \u043f\u0438\u0448\u0443\u0442 \u043b\u0438\u0431\u043e \u0434\u0432\u0438\u0436\u043a\u0438, \u043b\u0438\u0431\u043e \u0438\u0433\u0440\u044b \u2014 \u043f\u0440\u0430\u0432\u0434\u0430, \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0445\u043e\u0442\u044f-\u0431\u044b \u043e\u0434\u043d\u0430 \u0438\u0433\u0440\u0430 \u0434\u043e\u0445\u043e\u0434\u0438\u0442 \u0434\u043e \u0440\u0435\u043b\u0438\u0437\u0430.<\/p>\n<h2><font color=\"#1c22be\">\u276f<\/font> <font color=\"#454cee\">\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c\u0441\u044f \u0441 \u0437\u0430\u0434\u0430\u0447\u0430\u043c\u0438<\/font><\/h2>\n<p>  \u041f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c, \u043a\u0430\u043a \u0441\u0430\u0434\u0438\u0442\u0441\u044f \u0438 \u043f\u0438\u043b\u0438\u0442\u044c \u0438\u0433\u0440\u0443\u0448\u043a\u0443, \u043d\u0443\u0436\u043d\u043e \u0441\u0440\u0430\u0437\u0443 \u0436\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u0441\u044f \u0441 \u0446\u0435\u043b\u044f\u043c\u0438 \u0438 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u0434 \u0441\u043e\u0431\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u2014 \u043a\u0430\u043a\u043e\u0439 \u0441\u0442\u0435\u043a \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0439 \u043c\u044b \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c, \u043a\u0430\u043a \u0431\u0443\u0434\u0435\u043c \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u0433\u0440\u043e\u0432\u0443\u044e \u043b\u043e\u0433\u0438\u043a\u0443, \u043d\u0430 \u043a\u0430\u043a\u0438\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u0445 \u0438\u0433\u0440\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0438.\u0442.\u043f. \u042f \u043f\u0440\u0438\u043a\u0438\u043d\u0443\u043b \u0438 \u0440\u0435\u0448\u0438\u043b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u043e\u0435, \u043d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u043d\u043e\u0435 \u0438 \u0437\u0430\u0431\u0430\u0432\u043d\u043e\u0435\u2026 2D-\u0448\u0443\u0442\u0435\u0440 \u0441 \u0432\u0438\u0434\u043e\u043c \u0441\u0432\u0435\u0440\u0445\u0443!<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/post_images\/fc2\/8b3\/040\/fc28b3040b91480deba59e7cb7984f94.jpg\" alt=\"image\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/fc2\/8b3\/040\/fc28b3040b91480deba59e7cb7984f94.jpg\" data-blurred=\"true\"\/><\/div>\n<p>  \u0418\u0433\u0440\u0430 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043d\u0430 Java \u2014 \u0440\u043e\u0434\u043d\u043e\u043c \u044f\u0437\u044b\u043a\u0435 \u0434\u043b\u044f Android-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439. \u041f\u0443\u0441\u0442\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b \u0431\u0435\u0437 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0432\u0435\u0441\u044f\u0442 \u0432\u0441\u0435\u0433\u043e \u043e\u043a\u043e\u043b\u043e 20 \u043a\u0438\u043b\u043e\u0431\u0430\u0439\u0442 \u2014 \u0447\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u043c \u043d\u0430 \u0440\u0443\u043a\u0443! \u041d\u0438 AppCompat, \u043d\u0438 \u043a\u0430\u043a\u0438\u0435 \u043b\u0438\u0431\u043e \u0435\u0449\u0451 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u2014 \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0438\u0437 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445!<\/p>\n<p>  \u0418\u0442\u0430\u043a, \u0447\u0442\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0432 \u043d\u0430\u0448\u0435\u0439 \u0438\u0433\u0440\u0435:<\/p>\n<ul>\n<li> <b>\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0441\u0443\u0442\u044c<\/b>: \u0412\u0438\u0434 \u0441\u0432\u0435\u0440\u0445\u0443, \u0447\u0435\u043b\u043e\u0432\u0435\u0447\u043a\u043e\u043c \u043f\u043e \u0446\u0435\u043d\u0442\u0440\u0443 \u044d\u043a\u0440\u0430\u043d\u0430 \u043c\u043e\u0436\u043d\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0438 \u0441\u0442\u0440\u0435\u043b\u044f\u0442\u044c \u0432\u043e \u0432\u0440\u0430\u0436\u0438\u043d. \u0426\u0435\u043b\u044c \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0431\u0440\u0430\u0442\u044c \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u0447\u043a\u043e\u0432 \u043f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c, \u043a\u0430\u043a \u0438\u0433\u0440\u043e\u043a\u0430 \u0437\u0430\u0433\u0440\u044b\u0437\u0443\u0442. \u0417\u0430 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u043e\u0432\u0435\u0440\u0436\u0435\u043d\u043d\u043e\u0433\u043e \u0432\u0440\u0430\u0433\u0430 \u043d\u0430\u0447\u0438\u0441\u043b\u044f\u044e\u0442\u0441\u044f \u0431\u0430\u043a\u0441\u044b, \u0437\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u043a\u0443\u043f\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u043f\u0443\u0448\u043a\u0438!<\/li>\n<li> <b>\u041e\u0440\u0443\u0436\u0438\u0435<\/b>: \u041d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0438\u0434\u043e\u0432 \u0432\u043e\u043e\u0440\u0443\u0436\u0435\u043d\u0438\u044f, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u043f\u0438\u0441\u0442\u043e\u043b\u0435\u0442\u044b, \u0434\u0440\u043e\u0431\u043e\u0432\u0438\u043a\u0438, \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u044b \u0438 \u0434\u0430\u0436\u0435 \u043f\u0443\u043b\u0435\u043c\u0435\u0442\u044b! \u0412\u0441\u0451 \u043e\u0440\u0443\u0436\u0438\u0435 \u043c\u043e\u0436\u043d\u043e \u043a\u0443\u043f\u0438\u0442\u044c \u0432 \u0432\u043d\u0443\u0442\u0440\u0438\u0438\u0433\u0440\u043e\u0432\u043e\u043c \u043c\u0430\u0433\u0430\u0437\u0438\u043d\u0435 \u0437\u0430 \u0432\u0430\u043b\u044e\u0442\u0443, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0438\u0433\u0440\u043e\u043a \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0438\u0433\u0440\u044b<\/li>\n<li> <b>\u0412\u0440\u0430\u0433\u0438<\/b>: \u0414\u0432\u0430 \u0442\u0438\u043f\u0430 \u0432\u0440\u0430\u0433\u043e\u0432 \u2014 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0437\u043e\u043c\u0431\u0438 \u0438 \u00ab\u0448\u0443\u0441\u0442\u0440\u0438\u043a\u00bb. \u0412\u0440\u0430\u0433\u0438 \u0441\u043f\u0430\u0432\u043d\u044f\u0442\u0441\u044f \u0432 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043d\u044b\u0445 \u0442\u043e\u0447\u043a\u0430\u0445 \u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442 \u0438\u0434\u0442\u0438 (\u0438\u043b\u0438 \u0431\u0435\u0436\u0430\u0442\u044c) \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0443 \u0438\u0433\u0440\u043e\u043a\u0430 \u0441 \u0446\u0435\u043b\u044c\u044e \u043f\u043e\u0431\u0438\u0442\u044c \u0435\u0433\u043e.<\/li>\n<li> <b>\u0423\u0440\u043e\u0432\u043d\u0438<\/b>: \u041c\u043e\u0436\u043d\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u0434\u0435\u043a\u043e\u0440\u0430\u0446\u0438\u0438 \u2014 \u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u044c\u0438 \u0431\u0435\u0437 \u043a\u0430\u043a\u043e\u0433\u043e \u043b\u0438\u0431\u043e \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u0430.<\/li>\n<\/ul>\n<p>  \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0438\u0433\u0440\u0430 \u043f\u0438\u0448\u0435\u0442\u0441\u044f \u0441 \u043d\u0443\u043b\u044f, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u043e\u0434\u0443\u043c\u0430\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u043e\u0434\u0443\u043b\u0438:<\/p>\n<ul>\n<li> <b>\u0413\u0440\u0430\u0444\u0438\u043a\u0430<\/b>: \u0410\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u043e-\u0443\u0441\u043a\u043e\u0440\u0435\u043d\u043d\u044b\u0439 \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440 \u043f\u043e\u043b\u0443\u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u044b\u0445 2D-\u0441\u043f\u0440\u0430\u0439\u0442\u043e\u0432 \u0441 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0430\u0444\u0444\u0438\u043d\u043d\u044b\u0445 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0439 (\u043f\u043e\u0432\u043e\u0440\u043e\u0442\/\u043c\u0430\u0441\u0448\u0442\u0430\u0431\/\u0438\u0441\u043a\u0440\u0438\u0432\u043b\u0435\u043d\u0438\u0435 \u0438.\u0442.\u043f). \u041d\u0430 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u0445 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e DIP&#8217;\u043e\u0432 (\u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438) \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u043d\u0438\u0436\u0435 \u2014 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0442\u0435\u0445\u043d\u0438\u043a\u0430 <i>\u0431\u0430\u0442\u0447\u0438\u043d\u0433\u0430<\/i>. \u0421\u0430\u043c \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 \u0431\u0430\u0437\u0435 OpenGLES 1.1 \u2014 \u0442.\u0435 \u0447\u0438\u0441\u0442\u044b\u0439 FFP.<\/li>\n<li> <b>\u0412\u0432\u043e\u0434<\/b>: \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0442\u0430\u0447\u0441\u043a\u0440\u0438\u043d\u0430 \u0438 \u0433\u0435\u0439\u043c\u043f\u0430\u0434\u043e\u0432. \u041e\u0431\u0430 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u0432\u0432\u043e\u0434\u0430 \u043e\u0447\u0435\u043d\u044c \u043b\u0435\u0433\u043a\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0430 Android \u2014 \u0434\u043b\u044f \u0442\u0430\u0447\u0441\u043a\u0440\u0438\u043d\u0430 \u043d\u0430\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u043e\u0432\u0435\u0441\u0438\u0442\u044c onTouchListener \u043d\u0430 \u043e\u043a\u043d\u043e \u043d\u0430\u0448\u0435\u0439 \u0438\u0433\u0440\u044b, \u0430 \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043a\u043d\u043e\u043f\u043e\u043a \u2014 \u043b\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u044f onKeyListener \u0438 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u043a\u043e\u0434\u044b \u043a\u043d\u043e\u043f\u043e\u043a \u0441 \u043a\u043d\u043e\u043f\u043a\u0430\u043c\u0438 \u043d\u0430\u0448\u0435\u0433\u043e \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0433\u0435\u0439\u043c\u043f\u0430\u0434\u0430.<\/li>\n<li> <b>\u0417\u0432\u0443\u043a<\/b>: \u0412\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043a\u0430\u043a \u00ab\u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0445\u00bb \u0437\u0432\u0443\u043a\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u0432 \u043f\u0430\u043c\u044f\u0442\u044c (\u0432\u044b\u0441\u0442\u0440\u0435\u043b\u044b, \u0437\u0432\u0443\u043a\u0438 \u0448\u0430\u0433\u043e\u0432 \u0438\u2026 \u0442.\u043f), \u0442\u0430\u043a \u0438 \u043c\u0443\u0437\u044b\u043a\u0438\/\u044d\u043c\u0431\u0438\u0435\u043d\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0443\u0436\u043d\u043e \u0441\u0442\u0440\u0438\u043c\u0438\u0442\u044c \u0438\u0437 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044f. \u0422\u0443\u0442 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0441\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0434\u0435\u043b\u0430\u0435\u0442 \u0437\u0430 \u043d\u0430\u0441 \u0441\u0430\u043c Android, \u0434\u043b\u044f \u0437\u0432\u0443\u043a\u043e\u0432 \u0435\u0441\u0442\u044c \u043a\u043b\u0430\u0441\u0441 \u2014 <i>SoundPool<\/i> (\u043a\u043e\u0442\u043e\u0440\u044b\u0439, \u0442\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u043d\u0435 \u0443\u043c\u0435\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0430\u0442\u044c \u043e \u0441\u0442\u0430\u0442\u0443\u0441\u0435 \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u043d\u0438\u044f \u0437\u0432\u0443\u043a\u0430), \u0434\u043b\u044f \u043c\u0443\u0437\u044b\u043a\u0438 \u2014 <i>MediaPlayer<\/i>. \u0415\u0441\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u0442\u044c PCM-\u0441\u044d\u043c\u043f\u043b\u044b \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e, \u0447\u0435\u043c \u044f \u0438 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e, \u043d\u043e \u0441 \u043d\u0438\u043c \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b.<\/li>\n<li> <b>\u00ab\u0424\u0438\u0437\u0438\u043a\u0430\u00bb<\/b>: \u042f \u043d\u0435 \u0437\u0440\u044f \u0432\u0437\u044f\u043b \u044d\u0442\u043e\u0442 \u043f\u0443\u043d\u043a\u0442 \u0432 \u043a\u0430\u0432\u044b\u0447\u043a\u0438. \ud83d\ude42 \u041f\u043e \u0441\u0443\u0442\u0438, \u0432\u0441\u044f \u0444\u0438\u0437\u0438\u043a\u0430 \u0443 \u043d\u0430\u0441 \u2014 \u044d\u0442\u043e \u043e\u0434\u0438\u043d \u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f AABB (\u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a \u0441 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u043e\u043c). \u0412\u0441\u0451, \u043d\u0438 \u043e \u043a\u0430\u043a\u043e\u0439 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0439 \u0444\u0438\u0437\u0438\u043a\u0435 \u0438 \u0440\u0435\u0447\u0438 \u043d\u0435 \u0438\u0434\u0435\u0442. \ud83d\ude42<\/li>\n<\/ul>\n<p>  \u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0439 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u0432\u044b\u0448\u0435, \u043d\u0430\u0448\u0430 \u0438\u0433\u0440\u0430 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0430 \u043b\u044e\u0431\u044b\u0445 \u0441\u043c\u0430\u0440\u0442\u0444\u043e\u043d\u0430\u0445\/\u043f\u043b\u0430\u043d\u0448\u0435\u0442\u0430\u0445\/\u0442\u0432-\u043f\u0440\u0438\u0441\u0442\u0430\u0432\u043a\u0430\u0445 \u043a\u0440\u043e\u043c\u0435 \u043a\u0438\u0442\u0430\u0439\u0441\u043a\u0438\u0445 \u0441\u043c\u0430\u0440\u0442\u0444\u043e\u043d\u043e\u0432 \u043d\u0430 \u0431\u0430\u0437\u0435 \u0447\u0438\u043f\u0441\u0435\u0442\u0430 MT6516 \u0431\u0435\u0437 GPU \u0438\u0437 2010-2011 \u0433\u043e\u0434\u043e\u0432. \u041d\u0430 \u0432\u0441\u0435\u0445 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u0445, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0441\u0430\u043c\u044b\u0439 \u043f\u0435\u0440\u0432\u044b\u0439 Android-\u0441\u043c\u0430\u0440\u0442\u0444\u043e\u043d, \u0438\u0433\u0440\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0431\u0435\u0437 \u043f\u0440\u043e\u0431\u043b\u0435\u043c. \u0410 \u0432\u043e\u0442 \u0438 \u043f\u0430\u0440\u043a \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0448\u0443 \u0438\u0433\u0440\u0443:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/post_images\/df8\/f04\/847\/df8f048472bcbd24538eb074b17c6a9d.jpg\" alt=\"image\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/df8\/f04\/847\/df8f048472bcbd24538eb074b17c6a9d.jpg\" data-blurred=\"true\"\/><\/div>\n<p>  \u0421 \u0446\u0435\u043b\u044f\u043c\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043b\u0438\u0441\u044c, \u0441\u0430\u043c\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u044c \u043a \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438\u0433\u0440\u044b! \u041f\u043e \u0441\u0443\u0442\u0438, \u0435\u0451 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0437\u0430\u043d\u044f\u043b\u0430 \u0443 \u043c\u0435\u043d\u044f \u043e\u043a\u043e\u043b\u043e \u0434\u0432\u0443-\u0442\u0440\u0435\u0445 \u0434\u043d\u0435\u0439 \u2014 \u044d\u0442\u043e \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430. \u041d\u043e \u0438 \u0441\u0430\u043c\u0430 \u0438\u0433\u0440\u0430 \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u0430\u044f \ud83d\ude42<\/p>\n<h2><font color=\"#1c22be\">\u276f<\/font> <font color=\"#454cee\">\u0420\u0435\u043d\u0434\u0435\u0440\u0435\u0440<\/font><\/h2>\n<p>  \u041d\u0430\u0447\u0438\u043d\u0430\u0435\u043c, \u043c\u044b \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u0441 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 GLES \u0438 \u043f\u0440\u043e\u0434\u0443\u043c\u044b\u0432\u0430\u043d\u0438\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u043d\u0430\u0448\u0435\u0433\u043e \u0431\u0443\u0434\u0443\u0449\u0435\u0433\u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430. \u042f \u0432\u0441\u0435\u0433\u0434\u0430 \u0441\u0442\u0430\u0432\u0438\u043b \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440 \u043d\u0430 \u043f\u0435\u0440\u0432\u043e\u0435 \u043c\u0435\u0441\u0442\u043e, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u043d\u0435 \u043e\u0441\u043e\u0431\u043e \u0441\u043b\u043e\u0436\u043d\u0430\u044f \u0438 \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u044f\u043c\u043e \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438\u0433\u0440\u044b.<\/p>\n<pre><code class=\"java\">private void attachMainLoop() {         GLView.setRenderer(new GLSurfaceView.Renderer() {             @Override             public void onSurfaceCreated(GL10 gl10, EGLConfig eglConfig) {                 Engine.log(\"GL context successfully created\");                 Engine.log(\"Vendor: %s\", GLES10.glGetString(GLES10.GL_VENDOR));                 Engine.log(\"Renderer: %s\", GLES10.glGetString(GLES10.GL_RENDERER));                  Text = new TextRenderer();                  setupRenderState();                 Engine.Current.loadResources();             }              @Override             public void onSurfaceChanged(GL10 gl10, int w, int h) {                 DeviceWidth = w;                 DeviceHeight = h;                  GLES10.glMatrixMode(GLES10.GL_PROJECTION);                 GLES10.glLoadIdentity();                 GLES10.glOrthof(0, w, h, 0, 0, 255);                  Camera.autoAdjustDistance(w, h);                  Engine.log(\"New render target resolution: %dx%d\", w, h);             }              @Override             public void onDrawFrame(GL10 gl10) {                 Engine.Current.drawFrame();             }         });         GLView.setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY);          Engine.Current.MainActivity.setContentView(GLView);     } <\/code><\/pre>\n<p>  \u041f\u043e \u0441\u0443\u0442\u0438, \u0432 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u043c \u043c\u0438\u0440\u0435, 2D \u2014 \u044d\u0442\u043e \u0447\u0430\u0441\u0442\u043d\u044b\u0439 \u0441\u043b\u0443\u0447\u0430\u0439 3D, \u043a\u043e\u0433\u0434\u0430 \u0440\u0438\u0441\u0443\u044e\u0442\u0441\u044f \u0432\u0441\u0451 \u0442\u0435 \u0436\u0435 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u044b \u0432 \u0432\u0438\u0434\u0435 \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u043e\u0432, \u043d\u043e \u0432\u043c\u0435\u0441\u0442\u043e \u043f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u043c\u0430\u0442\u0440\u0438\u0446\u044b, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043e\u0440\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432. \u0412\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0430 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 DirectDraw (\u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0430-\u043a\u043e\u043d\u0435\u0446 90\u0445) \u0438 Java-\u0442\u0435\u043b\u0435\u0444\u043e\u043d\u043e\u0432, \u0433\u0440\u0430\u0444\u0438\u043a\u0443 \u043e\u0431\u044b\u0447\u043d\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u043b\u0438 \u0430\u0434\u0430\u043f\u0442\u0438\u0432\u043d\u043e\u0439, \u0438\u0437-\u0437\u0430 \u0447\u0435\u0433\u043e \u043f\u0440\u0438 \u0441\u043c\u0435\u043d\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u0438\u0433\u0440\u043e\u0432\u043e\u0435 \u043f\u043e\u043b\u0435 \u043c\u043e\u0433\u043b\u043e \u0440\u0430\u0441\u0442\u044f\u0433\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0432\u0441\u044e \u043f\u043b\u043e\u0449\u0430\u0434\u044c \u0434\u0438\u0441\u043f\u043b\u0435\u044f. \u0421\u0435\u0439\u0447\u0430\u0441 \u0436\u0435, \u043a\u043e\u0433\u0434\u0430 \u0440\u0430\u0437\u0431\u0440\u043e\u0441 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0441\u0442\u0430\u043b \u043a\u043e\u043b\u043e\u0441\u0441\u0430\u043b\u044c\u043d\u044b\u043c, \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u0442\u044c \u0434\u0432\u0430 \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u043a \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044e \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438:<\/p>\n<ul>\n<li> <b>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043e\u0440\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0432 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u044b<\/b>: \u0415\u0441\u043b\u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0443\u0436\u0435 \u0431\u044b\u043b\u0430 \u0437\u0430\u0432\u044f\u0437\u0430\u043d\u0430 \u043d\u0430 \u043f\u0438\u043a\u0441\u0435\u043b\u0438, \u0438\u043b\u0438 \u043f\u043e \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043f\u0440\u0438\u0447\u0438\u043d\u0435 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u0435\u0451, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u0432\u044f\u0437\u0430\u0442\u044c \u0438\u0433\u0440\u0443 \u043d\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u043c \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0438 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, 480&#215;320, \u0438\u043b\u0438 480&#215;800). \u0420\u0430\u0441\u0442\u0435\u0440\u0438\u0437\u0430\u0442\u043e\u0440 \u0444\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u043d\u0435 \u043e\u043f\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0441 \u043f\u0438\u043a\u0441\u0435\u043b\u044f\u043c\u0438 \u2014 \u0443 \u043d\u0435\u0433\u043e \u0435\u0441\u0442\u044c \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b -1..1 (\u0433\u0434\u0435 -1 \u2014 \u043d\u0430\u0447\u0430\u043b\u043e \u044d\u043a\u0440\u0430\u043d\u0430, 0 \u2014 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0430, 1 \u2014 \u043a\u043e\u043d\u0435\u0446, \u044d\u0442\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f clip-space), \u0430 \u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438 \u043a\u0430\u043a \u0440\u0430\u0437 \u0438 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u0432 camera-space \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u0445 \u0432 clip-space \u2014 \u0442.\u0435 \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u0434\u0433\u043e\u043d\u044f\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u0441\u043f\u0440\u0430\u0439\u0442\u043e\u0432 \u0438\u0437 \u0436\u0435\u043b\u0430\u0435\u043c\u043e\u0433\u043e \u043d\u0430\u043c\u0438 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0432 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0439. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0434\u0432\u0438\u0436\u043a\u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043d\u044b \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0443 \u0432 \u043c\u0435\u0442\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445. \u041f\u043e\u043f\u044b\u0442\u043a\u0438 \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044f \u0432 \u043f\u0438\u043a\u0441\u0435\u043b\u044f\u0445 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0442 \u0440\u044b\u0432\u043a\u0438 \u0438 \u0431\u0430\u0433\u0438.<\/li>\n<li> <b>\u041f\u0435\u0440\u0435\u0432\u043e\u0434 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0441 \u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u043e\u0439 \u043d\u0430 \u043c\u0435\u0442\u0440\u0438\u0447\u0435\u0441\u043a\u0443\u044e\/\u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u0443\u044e<\/b>:<br \/>  \u0421\u0435\u0439\u0447\u0430\u0441 \u044d\u0442\u043e\u0442 \u0441\u043f\u043e\u0441\u043e\u0431 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0438\u043c\u0435\u043d\u043d\u043e \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0441\u0430\u043c\u044b\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \u0434\u0432\u0438\u0436\u043a\u0438 \u0438 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0438. \u0415\u0441\u043b\u0438 \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u0441\u043e\u0432\u0441\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u2014 \u0442\u043e \u043c\u044b \u0437\u0430\u0434\u0430\u0435\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0438 \u0438\u0445 \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u043d\u0435 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439, \u0430 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432 \u044d\u0442\u0438\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0432 \u043c\u0435\u0442\u0440\u0430\u0445, \u0438\u043b\u0438 \u0435\u0449\u0451 \u043a\u0430\u043a\u043e\u0439-\u043b\u0438\u0431\u043e \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442. \u042d\u0442\u043e\u0442 \u043f\u043e\u0434\u0445\u043e\u0434 \u0431\u043b\u0438\u0437\u043e\u043a \u043a \u043e\u0431\u044b\u0447\u043d\u043e\u0439 3D-\u0433\u0440\u0430\u0444\u0438\u043a\u0435 \u0438 \u0438\u043c\u0435\u0435\u0442 \u0441\u0432\u043e\u0438 \u043f\u043b\u044e\u0448\u043a\u0438: \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u043f\u0443\u0441\u0442\u0438\u0442\u044c HD-\u043f\u0430\u043a \u0434\u043b\u044f \u0432\u0430\u0448\u0435\u0439 \u0438\u0433\u0440\u044b \u0438 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u0441\u0435 \u0441\u043f\u0440\u0430\u0439\u0442\u044b \u043d\u0430 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0441 \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0441\u043e\u043a\u0438\u043c \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c, \u043d\u0435 \u043f\u0435\u0440\u0435\u0434\u0435\u043b\u044b\u0432\u0430\u044f \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0443 \u0438\u0433\u0440\u044b.<\/li>\n<\/ul>\n<p>  \u0414\u043b\u044f \u0441\u043e\u0432\u0441\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0438\u0433\u0440 \u044f \u0432\u044b\u0431\u0438\u0440\u0430\u044e \u043e\u0431\u044b\u0447\u043d\u043e \u043f\u0435\u0440\u0432\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434. \u0421\u0430\u043c\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0432\u0441\u0435\u0433\u043e \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440\u0430 \u2014 \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u043f\u0440\u0430\u0439\u0442\u043e\u0432. \u0412 \u043c\u043e\u0451\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0441\u043f\u0440\u0430\u0439\u0442\u044b \u043d\u0435 \u0431\u044b\u043b\u0438 \u0443\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u044b \u0432 \u0430\u0442\u043b\u0430\u0441\u044b (\u043e\u0434\u043d\u0430 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0430, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0430\u044f \u0432 \u0441\u0435\u0431\u0435 \u0446\u0435\u043b\u0443\u044e \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044e \u0438\u043b\u0438 \u0435\u0449\u0451 \u0447\u0442\u043e-\u0442\u043e \u0432 \u044d\u0442\u043e\u043c \u0434\u0443\u0445\u0435), \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0431\u043e\u0440\u043a\u0438 \u0442\u0430\u0439\u043b\u0430 \u0438\u0437 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b \u044f \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u043d\u0435 \u0441\u0442\u0430\u043b. \u0412 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u043c, \u0432\u0441\u0451 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e:<\/p>\n<pre><code class=\"java\">public void drawSprite(Sprite spr, float x, float y, float width, float height, float z, float rotation, Color col) {         if(spr != null) {             if(col == null)                 col = Color.White;              if(width == 0)                 width = spr.Width;              if(height == 0)                 height = spr.Height;              \/\/ Convert position from world space to screen space             x = x - Camera.X;             y = y - Camera.Y;              if(x > ViewWidth || y > ViewHeight || x + width &lt; 0 || y + height &lt; 0) {                 Statistics.OccludedDraws++;                  return;             }              GLES10.glEnable(GLES10.GL_TEXTURE_2D);             GLES10.glBindTexture(GLES10.GL_TEXTURE_2D, spr.TextureId);              GLES10.glMatrixMode(GLES10.GL_MODELVIEW);             GLES10.glLoadIdentity();             GLES10.glTranslatef(x + (width \/ 2), y + (height \/ 2), 0);             GLES10.glRotatef(rotation, 0, 0, 1);             GLES10.glTranslatef(-(width \/ 2), -(height \/ 2), 0);             GLES10.glScalef(width, height, 1.0f);              vertex(0, 0, 0, 0, col);             vertex(1, 0, 1, 0, col);             vertex(1, 1, 1, 1, col);             vertex(0, 0, 0, 0, col);             vertex(0, 1, 0, 1, col);             vertex(1, 1, 1, 1, col);             vPosBuf.rewind();             vColBuf.rewind();             vUVBuf.rewind();              GLES10.glVertexPointer(2, GLES10.GL_FLOAT, 0, vPosBuf);             GLES10.glColorPointer(4, GLES10.GL_FLOAT, 0, vColBuf);             GLES10.glTexCoordPointer(2, GLES10.GL_FLOAT, 0, vUVBuf);              GLES10.glDrawArrays(GLES10.GL_TRIANGLES, 0, 6);              Statistics.DrawCalls++;              }     }  private void vertex(float x, float y, float u, float v, Color col) {         vPosBuf.putFloat(x);         vPosBuf.putFloat(y);         vColBuf.putFloat(col.R);         vColBuf.putFloat(col.G);         vColBuf.putFloat(col.B);         vColBuf.putFloat(col.A);         vUVBuf.putFloat(u);         vUVBuf.putFloat(v);     } <\/code><\/pre>\n<p>  \u0412\u0441\u0451 \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c \u043f\u043e\u043d\u044f\u0442\u043d\u043e \u2014 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0441\u043f\u0440\u0430\u0439\u0442\u0430 \u0438\u0437 world-space \u0432 camera-space, \u043e\u0442\u0441\u0435\u043a\u0430\u0435\u043c \u0441\u043f\u0440\u0430\u0439\u0442, \u0435\u0441\u043b\u0438 \u043e\u043d \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u043c\u0438 \u044d\u043a\u0440\u0430\u043d\u0430, \u0437\u0430\u0434\u0430\u0435\u043c \u0441\u0442\u0435\u0439\u0442\u044b \u0434\u043b\u044f GAPI (\u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442, \u0438\u0445 \u0432\u0441\u0435\u0433\u043e \u0434\u0432\u0430), \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0432\u0435\u0440\u0448\u0438\u043d\u043d\u044b\u0439 \u0431\u0443\u0444\u0435\u0440 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0435\u0439 \u0438 \u0440\u0438\u0441\u0443\u0435\u043c \u043d\u0430 \u044d\u043a\u0440\u0430\u043d. \u041d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u0441\u043c\u044b\u0441\u043b\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c VBO \u0437\u0434\u0435\u0441\u044c \u043d\u0435\u0442, \u0430 \u043d\u0430 nio-\u0431\u0443\u0444\u0444\u0435\u0440\u044b \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u0440\u044f\u043c\u043e\u0439 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0431\u0435\u0437 \u043b\u0438\u0448\u043d\u0438\u0445 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0439, \u0442\u0430\u043a \u0447\u0442\u043e \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0441 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e \u043d\u0435 \u0431\u0443\u0434\u0435\u0442. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u2014 \u0432\u0435\u0440\u0448\u0438\u043d\u043d\u044b\u0439 \u0431\u0443\u0444\u0435\u0440 \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u2014 \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u0434\u0440\u0430\u0432\u043a\u043e\u043b\u043b \u043d\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u044b \u0438 \u0432\u0440\u0435\u0434\u043d\u044b.<\/p>\n<pre><code class=\"java\">        \/\/ Vertex format:         \/\/   vec2 pos; -- 8 bytes         \/\/   vec4 color; -- 16 bytes         \/\/   vec2 uv; -- 8 bytes         \/\/   32 bytes total         int numVerts = 6;         vPosBuf = ByteBuffer.allocateDirect((4 * 8) * numVerts);         vColBuf = ByteBuffer.allocateDirect((4 * 16) * numVerts);         vUVBuf = ByteBuffer.allocateDirect((4 * 8) * numVerts);         vPosBuf.order(ByteOrder.LITTLE_ENDIAN);         vColBuf.order(ByteOrder.LITTLE_ENDIAN);         vUVBuf.order(ByteOrder.LITTLE_ENDIAN);<\/code><\/pre>\n<p>  \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0432\u044b\u0437\u043e\u0432\u044b ByteBuffer.order \u2014 \u044d\u0442\u043e \u0432\u0430\u0436\u043d\u043e, \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, Java \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0432\u0441\u0435 \u0431\u0443\u0444\u0435\u0440\u044b \u0432 BIG_ENDIAN, \u0432 \u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u043a \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e Android-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u2014 LITTLE_ENDIAN, \u0438\u0437-\u0437\u0430 \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0430\u043a\u043e\u0441\u044f\u0447\u0438\u0442\u044c \u0438 \u0434\u043e\u043b\u0433\u043e \u0434\u0443\u043c\u0430\u0442\u044c \u00ab\u0430 \u043f\u043e\u0447\u0435\u043c\u0443 \u0443 \u043c\u0435\u043d\u044f \u0431\u0443\u0444\u0435\u0440\u044b \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u044b \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e, \u043d\u043e \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 \u043d\u0435\u0442!?\u00bb.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/post_images\/87f\/957\/379\/87f957379a9b9d28c7b178074048abee.png\" alt=\"image\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/87f\/957\/379\/87f957379a9b9d28c7b178074048abee.png\"\/><\/div>\n<p>  \u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438\u0433\u0440\u044b, \u043f\u0440\u0438 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0435 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043a\u0430\u0440\u0442\u044b \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0442\u0430\u0439\u043b\u043e\u0432, \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u0432\u043e\u0437\u0440\u043e\u0441\u043b\u043e \u0430\u0436 \u0434\u043e 600, \u0438\u0437-\u0437\u0430 \u0447\u0435\u0433\u043e FPS \u0432 \u0438\u0433\u0440\u0435 \u043e\u0447\u0435\u043d\u044c \u0441\u0438\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0435\u043b. \u0421\u0432\u044f\u0437\u0430\u043d\u043e \u044d\u0442\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u043d\u0430 \u0441\u0442\u0430\u0440\u044b\u0445 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0445 GPU \u043a\u0430\u0436\u0434\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u043e\u0437\u043d\u0430\u0447\u0430\u043b \u043f\u0435\u0440\u0435\u0441\u044b\u043b\u043a\u0443 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0441\u0446\u0435\u043d\u044b \u0432\u0438\u0434\u0435\u043e\u0447\u0438\u043f\u0443, \u0438\u0437-\u0437\u0430 \u0447\u0435\u0433\u043e \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u043b\u0438 \u043b\u0430\u0433\u0438. \u0424\u0438\u043a\u0441\u0438\u0442\u0441\u044f \u044d\u0442\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e: \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439 <i>\u0431\u0430\u0442\u0447\u0438\u043d\u0433\u0430<\/i> \u2014 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0442\u0435\u0445\u043d\u0438\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u00ab\u0441\u0448\u0438\u0432\u0430\u0435\u0442\u00bb \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u043f\u0440\u0430\u0439\u0442\u043e\u0432 \u0441 \u043e\u0434\u043d\u043e\u0439 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u043e\u0439 \u0432 \u043e\u0434\u0438\u043d \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0445\u043e\u0442\u044c 1000, \u0445\u043e\u0442\u044c 100000 \u0441\u043f\u0440\u0430\u0439\u0442\u043e\u0432 \u0432 \u043e\u0434\u0438\u043d \u043f\u0440\u043e\u0445\u043e\u0434! \u0415\u0441\u0442\u044c \u0434\u0432\u0430 \u0432\u0438\u0434\u0430 \u0431\u0430\u0442\u0447\u0438\u043d\u0433\u0430, \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u2014 \u043a\u043e\u0433\u0434\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u00ab\u0441\u0448\u0438\u0432\u0430\u044e\u0442\u0441\u044f\u00bb \u043f\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u043a\u0430\u0440\u0442\u044b\/\u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0438\u0433\u0440\u044b (\u043f\u0440\u0438\u0432\u0435\u0442 Unity) \u0438 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u2014 \u043a\u043e\u0433\u0434\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0441\u0448\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u044f\u043c\u043e \u043d\u0430 \u043b\u0435\u0442\u0443 (\u0442\u043e\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u0442 Unity). \u041d\u0430 \u0431\u043e\u043b\u0435\u0435 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0445 GPU \u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 GLES 3.0 \u0435\u0441\u0442\u044c \u0442\u0430\u043a\u0436\u0435 \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u0438\u043d\u0433 \u2014 \u0441\u0445\u043e\u0436\u0430\u044f \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f, \u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c\u0430\u044f \u043f\u0440\u044f\u043c\u043e \u043d\u0430 GPU. \u0421\u0443\u0442\u044c \u0435\u0451 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u0432 \u0448\u0435\u0439\u0434\u0435\u0440 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c (\u043c\u0430\u0442\u0440\u0438\u0446\u0443, \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430 \u0438.\u0442.\u043f) \u0438 \u043f\u0440\u043e\u0441\u0438\u043c \u0432\u0438\u0434\u0435\u043e\u0447\u0438\u043f \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u043d\u0443 \u0438 \u0442\u0443 \u0436\u0435 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044e, \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c, 15 \u0440\u0430\u0437. \u041a\u0430\u0436\u0434\u0430\u044f \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044f \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u0431\u0443\u0434\u0435\u0442 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0442\u044c \u0441\u0447\u0435\u0442\u0447\u0438\u043a gl_InstanceID \u043d\u0430 \u043e\u0434\u0438\u043d, \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0447\u0435\u043c\u0443 \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u0440\u0430\u0441\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u0441\u0435 \u043c\u043e\u0434\u0435\u043b\u044c\u043a\u0438 \u043d\u0430 \u0441\u0432\u043e\u0438 \u043c\u0435\u0441\u0442\u0430! \u041d\u043e \u0442\u0443\u0442 \u0443\u0436 \u0441\u043f\u0440\u0430\u0432\u0435\u0434\u043b\u0438\u0432\u043e\u0441\u0442\u0438 \u0440\u0430\u0434\u0438 \u0441\u0442\u043e\u0438\u0442 \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u0432 D3D10+ \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u0441\u0442\u0435\u0439\u0442\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u0430 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0443 \u00ab\u043f\u0430\u0447\u043a\u0430\u043c\u0438\u00bb, \u0447\u0442\u043e \u0437\u0434\u043e\u0440\u043e\u0432\u043e \u0441\u043d\u0438\u0436\u0430\u0435\u0442 \u043e\u0432\u0435\u0440\u0445\u0435\u0434 \u043e\u0434\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438. <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/post_images\/62f\/87d\/852\/62f87d852e9db63d60d3544be69491bf.png\" alt=\"image\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/62f\/87d\/852\/62f87d852e9db63d60d3544be69491bf.png\"\/><\/div>\n<p>  \u0414\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0441\u043f\u0440\u0430\u0439\u0442\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u0432 Android \u0434\u0435\u043a\u043e\u0434\u0435\u0440 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439. \u041e\u043d \u0443\u043c\u0435\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0440\u0435\u0436\u0438\u043c\u0430\u0445 (ARGB\/RGB565 \u0438.\u0442.\u043f), \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u0443\u0447\u0443 \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u0432 \u2014 \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0438 jpeg, \u0447\u0442\u043e \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043d\u0430 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u043c \u0440\u0430\u0437\u043c\u0435\u0440\u0435 \u0438\u0433\u0440\u044b.<\/p>\n<pre><code class=\"java\">public void upload(ByteBuffer data, int width, int height, int format) {         if(data != null) {             int len = data.capacity();              GLES10.glEnable(GLES10.GL_TEXTURE_2D);             GLES10.glBindTexture(GLES10.GL_TEXTURE_2D, TextureId);             GLES10.glTexImage2D(GLES10.GL_TEXTURE_2D, 0, GLES10.GL_RGBA, width, height, 0, GLES10.GL_RGBA, GLES10.GL_UNSIGNED_BYTE, data);             GLES11.glTexParameteri(GLES10.GL_TEXTURE_2D, GLES10.GL_TEXTURE_MIN_FILTER, GLES10.GL_NEAREST);             GLES11.glTexParameteri(GLES10.GL_TEXTURE_2D, GLES10.GL_TEXTURE_MAG_FILTER, GLES10.GL_NEAREST);              Width = width;             Height = height;         }     }      public static Sprite load(String fileName) {         InputStream is = null;         try {             is = Engine.Current.MainActivity.getAssets().open(\"sprites\/\" + fileName);              BitmapFactory.Options opts = new BitmapFactory.Options();             opts.inPreferredConfig = Bitmap.Config.ARGB_8888;              Bitmap bmp = BitmapFactory.decodeStream(is, null, opts);             ByteBuffer buf = ByteBuffer.allocateDirect(bmp.getRowBytes() * bmp.getHeight());             bmp.copyPixelsToBuffer(buf);             buf.rewind();              Sprite ret = new Sprite();             ret.upload(buf, bmp.getWidth(), bmp.getHeight(), FORMAT_RGBA);              return ret;         } catch (IOException e) {             Engine.log(\"Failed to load sprite %s\", fileName);              throw new RuntimeException(e);         }     }<\/code><\/pre>\n<p>  \u041d\u0430 \u044d\u0442\u043e\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440\u0430 \u0437\u0430\u043a\u043e\u043d\u0447\u0435\u043d\u0430. \u0414\u0430, \u0432\u0441\u0435 \u0432\u043e\u0442 \u0442\u0430\u043a \u043f\u0440\u043e\u0441\u0442\u043e \ud83d\ude42<br \/>  \u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0434\u0432\u0443\u043c \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u043c \u043c\u043e\u0434\u0443\u043b\u044f\u043c \u2014 \u0437\u0432\u0443\u043a \u0438 \u0432\u0432\u043e\u0434.<\/p>\n<h2><font color=\"#1c22be\">\u276f<\/font> <font color=\"#454cee\">\u0417\u0432\u0443\u043a \u0438 \u0432\u0432\u043e\u0434<\/font><\/h2>\n<p>  \u041a\u0430\u043a \u044f \u0443\u0436\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u043b, \u0437\u0432\u0443\u043a \u044f \u0440\u0435\u0448\u0438\u0442\u043b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u0431\u0430\u0437\u0435 \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u0437\u0432\u0443\u043a\u043e\u0432\u043e\u0439 \u043f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c\u044b Android. \u041d\u0438\u0447\u0435\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e \u0432 \u0435\u0451 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0440 \u043d\u0435\u0442, \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u043d\u0430\u043c \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u043b\u0438\u0448\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043e\u0431\u0451\u0440\u0442\u043a\u0443, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0443\u044e \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b. \u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0437\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a wav-\u0444\u0430\u0439\u043b\u043e\u0432 \u0438 \u0445\u043e\u0442\u0435\u043b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c AudioTrack \u2014 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0432\u043e\u0441\u043f\u0440\u043e\u0437\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f PCM-\u0437\u0432\u0443\u043a\u0430 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e, \u043d\u043e \u043c\u043d\u0435 \u043d\u0435 \u043f\u043e\u043d\u0440\u0430\u0432\u0438\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u0432 \u043d\u0451\u043c \u043d\u0435\u0442 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043d\u0430 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0438 \u0437\u0432\u0443\u043a\u0430 \u0438 \u0431\u0443\u0444\u0435\u0440\u044b, \u0438\u0437-\u0437\u0430 \u0447\u0435\u0433\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0432\u044b\u043d\u0443\u0436\u0434\u0435\u043d \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c\u0441\u044f \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c PCM-\u043f\u043e\u0442\u043e\u043a\u0430 \u0432 \u043d\u043e\u0432\u044b\u0439 \u0438 \u043d\u043e\u0432\u044b\u0439 \u0431\u0443\u0444\u0435\u0440\u2026<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/post_images\/bb5\/8b1\/a10\/bb58b1a1022db8320e74fd0025cb1638.png\" alt=\"image\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/bb5\/8b1\/a10\/bb58b1a1022db8320e74fd0025cb1638.png\"\/><\/div>\n<p>  \u041f\u043e\u043b\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0437\u0432\u0443\u043a\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a. \u0418 \u0434\u0430, \u0441 SoundPool \u043d\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u043d\u0438\u044f \u0437\u0432\u0443\u043a\u0430 \u0438\u043b\u0438 \u0443\u0437\u043d\u0430\u0442\u044c, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u043d\u0438\u0435 \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u043e\u0441\u044c. \u0423\u0432\u044b.<\/p>\n<pre><code class=\"java\">public static class Instance {         private AudioStream parent;         private int id;          Instance(AudioStream parent) {             this.parent = parent;         }          public void play() {             id = sharedPool.play(parent.streamId, Audio.MasterAudioLevel, Audio.MasterAudioLevel, 0, 0, 1.0f);         }          public void stop() {             sharedPool.stop(id);         }     }      private static SoundPool sharedPool;     private int streamId;      static {         Engine.log(\"Allocating SoundPool\");         sharedPool = new SoundPool(255, AudioManager.STREAM_MUSIC, 0);     }      public AudioStream(int streamId) {         this.streamId = streamId;     }      @Override     protected void finalize() throws Throwable {         sharedPool.unload(streamId);         super.finalize();     }      public static AudioStream load(String fileName) {         AssetManager assets = Engine.Current.MainActivity.getAssets();          try {             AssetFileDescriptor afd = assets.openFd(\"sounds\/\" + fileName);             int streamId = sharedPool.load(afd, 0);              return new AudioStream(streamId);         } catch (IOException e) {             Engine.log(\"Failed to load audio stream %s\", fileName);              return null;         }     } <\/code><\/pre>\n<p>  \u041d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u043c \u0438 \u043f\u0440\u043e \u043c\u0443\u0437\u044b\u043a\u0443:<\/p>\n<pre><code class=\"java\">private MediaPlayer mediaPlayer;     private boolean ready;      public MusicStream(MediaPlayer player) {         mediaPlayer = player;     }      public void forceRelease() {         if(mediaPlayer.isPlaying())             mediaPlayer.stop();          mediaPlayer.release();     }      public void play() {         if(!mediaPlayer.isPlaying())             mediaPlayer.start();     }      public void pause() {         if(mediaPlayer.isPlaying())             mediaPlayer.pause();     }      public void stop() {         if(!mediaPlayer.isPlaying())             mediaPlayer.stop();     }      public boolean isPlaying() {         return mediaPlayer.isPlaying();     }      public void setLoop(boolean isLooping) {         mediaPlayer.setLooping(isLooping);     }      public static MusicStream load(String fileName) {         AssetManager assets = Engine.Current.MainActivity.getAssets();          try {             AssetFileDescriptor afd = assets.openFd(\"music\/\" + fileName);             MediaPlayer player = new MediaPlayer();             player.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());             player.setVolume(0.3f, 0.3f); \/\/ TODO: Move volume settings to Audio             player.prepare();              return new MusicStream(player);         } catch (IOException e) {             Engine.log(\"Failed to load audio stream %s\", fileName);              return null;         }     } <\/code><\/pre>\n<p>  \u0414\u0430 \u0431\u0443\u0434\u0435\u0442 \u0437\u0432\u0443\u043a! \u041d\u0443 \u0438 \u043f\u0440\u043e \u0432\u0432\u043e\u0434 \u043d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u043c:<\/p>\n<pre><code class=\"java\">public static final int TOUCH_IDLE = 0;     public static final int TOUCH_PRESSED = 1;     public static final int TOUCH_RELEASED = 2;      public interface TextCallback {         void onEnteredText(String str);     }      public static class TouchState {         public boolean State;         public int Id;         public float X, Y;     }      public static int GAMEPAD_A = 0;     public static int GAMEPAD_B = 1;     public static int GAMEPAD_Y = 2;     public static int GAMEPAD_X = 3;     public static int GAMEPAD_LT = 4;     public static int GAMEPAD_RT = 5;     public static int GAMEPAD_DPAD_LEFT = 6;     public static int GAMEPAD_DPAD_RIGHT = 7;     public static int GAMEPAD_DPAD_UP = 8;     public static int GAMEPAD_DPAD_DOWN = 9;     public static int GAMEPAD_BUTTON_COUNT = 10;      public static class GamepadState {         public float AnalogX, AnalogY;         public boolean[] Buttons;          GamepadState() {             Buttons = new boolean[GAMEPAD_BUTTON_COUNT];         }     }      class TouchListener implements View.OnTouchListener {          @Override         public boolean onTouch(View view, MotionEvent motionEvent) {             for(int i = 0; i &lt; motionEvent.getPointerCount(); i++) {                 Touches[i].Id = motionEvent.getPointerId(i);                  \/\/ Convert from device-space to view-space.                 float xVal = motionEvent.getX() \/ Engine.Current.Graphics.DeviceWidth;                 float yVal = motionEvent.getY() \/ Engine.Current.Graphics.DeviceHeight;                 Touches[i].X = xVal * Engine.Current.Graphics.ViewWidth;                 Touches[i].Y = yVal * Engine.Current.Graphics.ViewHeight;                  if(motionEvent.getAction() == MotionEvent.ACTION_DOWN)                     Touches[i].State = true;                  if(motionEvent.getAction() == MotionEvent.ACTION_UP)                     Touches[i].State = false;             }              return true;         }     }      public TouchState[] Touches;     public GamepadState Gamepad;     \/\/ Format - first int is KEYCODE mapped on Android, second is gamepad button     private final int[] gamePadMapping =             {                     KeyEvent.KEYCODE_DPAD_CENTER, GAMEPAD_A,                     KeyEvent.KEYCODE_BACK, GAMEPAD_B,                     KeyEvent.KEYCODE_BUTTON_Y, GAMEPAD_Y,                     KeyEvent.KEYCODE_BUTTON_X, GAMEPAD_X,                     KeyEvent.KEYCODE_DPAD_UP, GAMEPAD_DPAD_UP,                     KeyEvent.KEYCODE_DPAD_RIGHT, GAMEPAD_DPAD_RIGHT,                     KeyEvent.KEYCODE_DPAD_LEFT, GAMEPAD_DPAD_LEFT,                     KeyEvent.KEYCODE_DPAD_UP, GAMEPAD_DPAD_UP,                     KeyEvent.KEYCODE_DPAD_DOWN, GAMEPAD_DPAD_DOWN             };      public Input() {         Touches = new TouchState[5];          for(int i = 0; i &lt; Touches.length; i++)             Touches[i] = new TouchState();          Gamepad = new GamepadState();          Engine.log(\"Initializing input subsystem...\");         Engine.Current.Graphics.GLView.setOnTouchListener(new TouchListener());     }      public int isTouchingZone(float x, float y, float w, float h) {         boolean touching = false;          for(int i = 0; i &lt; Touches.length; i++) {             touching = Touches[i].X > x &amp;&amp; Touches[i].Y > y &amp;&amp; Touches[i].X &lt; x + w &amp;&amp; Touches[i].Y &lt; y + h;              if(touching &amp;&amp; Touches[i].State)                 return i;         }          return -1;     }      public boolean isAnyFingerInZone(float x, float y, float w, float h) {         boolean touching = false;          for(int i = 0; i &lt; Touches.length; i++) {             touching = Touches[i].X > x &amp;&amp; Touches[i].Y > y &amp;&amp; Touches[i].X &lt; x + w &amp;&amp; Touches[i].Y &lt; y + h;              if(touching &amp;&amp; Touches[i].State)                 return true;         }          return false;     }      public void requestTextInput(String title, String target, TextCallback callback) {         AlertDialog.Builder dlgBuilder = new AlertDialog.Builder(Engine.Current.MainActivity);          TextView text = new TextView(Engine.Current.MainActivity);         EditText editor = new EditText(Engine.Current.MainActivity);          text.setText(target + \":\");         editor.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));         dlgBuilder.setTitle(title);          LinearLayout layout = new LinearLayout(Engine.Current.MainActivity);         layout.addView(text);         layout.addView(editor);         layout.setOrientation(LinearLayout.VERTICAL);         layout.setPadding(5, 5, 5, 5);         dlgBuilder.setView(layout);         dlgBuilder.setPositiveButton(\"OK\", new DialogInterface.OnClickListener() {             @Override             public void onClick(DialogInterface dialogInterface, int i) {                 callback.onEnteredText(editor.getText().toString());             }         });          Engine.Current.MainActivity.runOnUiThread(new Runnable() {             @Override             public void run() {                 dlgBuilder.show();             }         });     } <\/code><\/pre>\n<p>  \u0421\u0430\u043c\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u0436\u043e\u0439\u0441\u0442\u0438\u043a\u0430 \u043a\u0440\u0430\u0439\u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u2014 \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b, \u043a\u0443\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043b \u043f\u0430\u043b\u0435\u0446 \u0438 \u0437\u0430\u0442\u0435\u043c \u0441\u0447\u0438\u0442\u0430\u0435\u043c \u0434\u0438\u0441\u0442\u0430\u043d\u0446\u0438\u044e \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u0430\u043b\u044c\u0446\u0430 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438, \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u044f \u0438\u0445 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u0438\u0441\u0442\u0430\u043d\u0446\u0438\u0438:<\/p>\n<pre><code class=\"java\">public class Joystick {     private Sprite joySprite;      public float VelocityX;     public float VelocityY;      public float OriginX, OriginY;     private float fingerX, fingerY;     private int joyFinger;      public Joystick() {         joySprite = Sprite.load(\"ui_button.png\");          OriginX = -999;         OriginY = -999;     }      private float clamp(float a, float min, float max) {         return a &lt; min ? min : (a > max ? max : a);     }      public void update() {         int finger = 0;          if((finger = Engine.Current.Input.isTouchingZone(0, 0, Engine.Current.Graphics.ViewWidth, Engine.Current.Graphics.ViewHeight)) != -1) {             if(OriginX == -999) {                 OriginX = Engine.Current.Input.Touches[finger].X;                 OriginY = Engine.Current.Input.Touches[finger].Y;             }              float xdiff = (Engine.Current.Input.Touches[finger].X - OriginX) \/ Engine.Current.Graphics.ViewWidth;             float ydiff = (Engine.Current.Input.Touches[finger].Y - OriginY) \/ Engine.Current.Graphics.ViewHeight;              VelocityX = clamp(xdiff \/ 0.2f, -1, 1);             VelocityY = clamp(ydiff \/ 0.2f, -1, 1);         } else {             OriginX = -999;             OriginY = -999;         }     }      public void draw() {         VelocityX = 0;         VelocityY = 0;     } }<\/code><\/pre>\n<p>  \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u044f \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u0432\u044b\u0437\u043e\u0432\u0430 \u0434\u0438\u0430\u043b\u043e\u0433\u0430 \u0432\u0432\u043e\u0434\u0430 \u0442\u0435\u043a\u0441\u0442\u0430 \u2014 \u044d\u0442\u043e \u0434\u043b\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0440\u0435\u043a\u043e\u0440\u0434\u043e\u0432 \u0438 \u043f\u0440\u043e\u0447\u0438\u0445 \u0444\u0438\u0448\u0435\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u0432\u0432\u043e\u0434\u0430 \u0442\u0435\u043a\u0441\u0442\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c. \u041d\u0443 \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0436\u0435 \u043c\u044b \u0441\u0430\u043c\u0438 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0443 \u043a\u043e\u0441\u0442\u044b\u043b\u0438\u0442\u044c!<\/p>\n<p>  \u041e\u0441\u043d\u043e\u0432\u0430 \u0434\u043b\u044f \u0438\u0433\u0440\u044b \u0435\u0441\u0442\u044c, \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0435\u0451 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438!<\/p>\n<h2><font color=\"#1c22be\">\u276f<\/font> <font color=\"#454cee\">\u041f\u0438\u0448\u0435\u043c \u0438\u0433\u0440\u0443<\/font><\/h2>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/post_images\/bc5\/91b\/e5e\/bc591be5eb718231bba056028021898c.png\" alt=\"image\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/bc5\/91b\/e5e\/bc591be5eb718231bba056028021898c.png\"\/><\/div>\n<p>  \u041f\u0438\u0441\u0430\u0442\u044c \u0438\u0433\u0440\u0443 \u044f \u043d\u0430\u0447\u0430\u043b \u0441 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a\u0430 \u0443\u0440\u043e\u0432\u043d\u0435\u0439. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430, \u044f \u0432\u044b\u0431\u0440\u0430\u043b \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0439 \u0438 \u0448\u0438\u0440\u043e\u043a\u043e-\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439 <i>TilEd<\/i> \u2014 \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u0441 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0430 \u043a\u0430\u0440\u0442 \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437\u043d\u044b\u0445 \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u0432. \u042f \u043b\u0438\u0447\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u043b Json, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0432 Android \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u044d\u0442\u0438\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u043c \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<pre><code class=\"java\">private void parseJson(String json) {         try {             JSONObject obj = new JSONObject(json);              width = obj.getInt(\"width\");             height = obj.getInt(\"height\");              JSONArray jtileSet = obj.getJSONArray(\"tilesets\").getJSONObject(0).getJSONArray(\"tiles\");             for(int i = 0; i &lt; jtileSet.length(); i++) {                 JSONObject tile = jtileSet.getJSONObject(i);                  String name = tile.getString(\"image\");                 name = name.substring(name.lastIndexOf(\"\/\") + 1);                 tileSet[tile.getInt(\"id\")] = Sprite.load(name);             }              JSONArray layers = obj.getJSONArray(\"layers\");              this.tiles = new byte[width * height];             Engine.log(\"Level size %d %d\", width, height);              for(int i = 0; i &lt; layers.length(); i++) {                 JSONObject layer = layers.getJSONObject(i);                 boolean isTileData = layer.has(\"data\");                  if(isTileData) {                     JSONArray tiles = layer.getJSONArray(\"data\");                      Engine.log(\"Loading tile data\");                     for(int j = 0; j &lt; tiles.length(); j++)                         this.tiles[j] = (byte)(tiles.getInt(j) - 1);                 } else {                     JSONArray objects = layer.getJSONArray(\"objects\");                      for(int j = 0; j &lt; objects.length(); j++) {                         JSONObject jobj = objects.getJSONObject(j);                          Prop prop = new Prop();                         prop.Sprite = tileSet[jobj.getInt(\"gid\") - 1];                         prop.Name = jobj.getString(\"name\");                         prop.X = (float)jobj.getDouble(\"x\");                         prop.Y = (float)jobj.getDouble(\"y\");                         prop.Visible = true;                          String type = jobj.getString(\"type\");                         if(type.equals(\"invisible\"))                             prop.Visible = false;                          props.add(prop);                     }                 }             }         } catch (JSONException e) {             e.printStackTrace(); \/\/ Level loading is unrecoverable error             throw new RuntimeException(e);         }     }<\/code><\/pre>\n<p>  \u0417\u0430\u043f\u0435\u043a\u0430\u043d\u0438\u0435 \u0431\u0430\u0442\u0447\u0435\u0439:<\/p>\n<pre><code class=\"java\">private void buildBatch() {         batches = new HashMap&lt;Sprite, Graphics2D.StaticBatch>();          for(int i = 0; i &lt; width; i++) {             for(int j = 0; j &lt; height; j++) {                 Sprite tile = tileSet[tiles[j * width + i]];                  if(!batches.containsKey(tile))                     batches.put(tile, new Graphics2D.StaticBatch(tile, width * height));                  batches.get(tile).addInstance(i * 32, j * 32, Graphics2D.Color.White);             }         }          for(Sprite spr : batches.keySet()) {             batches.get(spr).prepare();         }          Engine.log(\"Generated %d batches\", batches.size());     } <\/code><\/pre>\n<p>  \u041a\u0430\u0440\u0442\u0430 \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043d\u0430 3 \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u043f\u043e\u043d\u044f\u0442\u0438\u044f: \u0442\u0430\u0439\u043b\u044b \u2014 \u0444\u043e\u043d, \u0441 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c \u0442\u0440\u0430\u0432\u044b\/\u0430\u0441\u0444\u0430\u043b\u044c\u0442\u0430\/\u0437\u0435\u043c\u043b\u0438 \u0438.\u0442.\u043f, \u043f\u0440\u043e\u043f\u044b \u2014 \u0441\u0442\u0430\u0442\u0438\u0447\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043f\u043e \u0442\u0438\u043f\u0443 \u0434\u0435\u0440\u0435\u0432\u044c\u0435\u0432 \u0438 \u043a\u0443\u0441\u0442\u043e\u0432 \u0438 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u2014 \u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u0443\u0447\u0430\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0432 \u0438\u0433\u0440\u043e\u0432\u043e\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435, \u0442.\u0435 \u0438\u0433\u0440\u043e\u043a, \u0437\u043e\u043c\u0431\u0438 \u0438 \u043b\u0435\u0442\u044f\u0449\u0438\u0435 \u043f\u0443\u043b\u0438. \u0421\u0438\u0441\u0442\u0435\u043c\u0430 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430 \u0432 \u0432\u0438\u0434\u0435 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u043e\u0433\u043e \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0435\u0442 \u043b\u043e\u0433\u0438\u043a\u0443 \u0430\u043f\u0434\u0435\u0439\u0442\u043e\u0432, \u043f\u0440\u043e\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 Forward-\u0432\u0435\u043a\u0442\u043e\u0440 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0434\u0440\u0443\u0433\u0438\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438:<\/p>\n<pre><code class=\"java\">public abstract class Entity {      public float X, Y;     public float ForwardX, ForwardY; \/\/ Forward vector     public float RightX, RightY;     public float Rotation;     public boolean IsVisible;      public int DrawingOrder;      public float distanceTo(float x, float y) {         x = X - x;         y = Y - y;          return (float)Math.sqrt((x * x) + (y * y));     }      public boolean AABBTest(Entity ent, float myWidth, float myHeight, float width, float height) {         return X &lt; ent.X + width &amp;&amp; Y &lt; ent.Y + height &amp;&amp; ent.X &lt; X + myWidth &amp;&amp; ent.Y &lt; Y + myHeight;     }      public void recalculateForward() {         ForwardX = (float)Math.sin(Math.toRadians(Rotation));         ForwardY = -(float)Math.cos(Math.toRadians(Rotation));     }      public void update() {         recalculateForward();     }      public void draw() {      } }<\/code><\/pre>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e, \u044f \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043b \u043a \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438\u0433\u0440\u043e\u043a\u0430, \u043e\u0440\u0443\u0436\u0438\u044f \u0438 \u043c\u0435\u0445\u0430\u043d\u0438\u043a\u0438 \u0441\u0442\u0440\u0435\u043b\u044c\u0431\u044b. \u0412 \u0446\u0435\u043b\u043e\u043c, \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0441\u044e \u043b\u043e\u0433\u0438\u043a\u0443 \u0438\u0433\u0440\u043e\u043a\u0430 \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u0432\u0438\u0434\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 update: \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u0432\u0432\u043e\u0434 \u0438 \u0445\u043e\u0434\u044c\u0431\u0443 \u0441 \u0434\u0436\u043e\u0439\u0441\u0442\u0438\u043a\u0430, \u043f\u043e\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u0438\u0433\u0440\u043e\u043a\u0430 \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0443 \u043f\u0430\u043b\u044c\u0446\u0430 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 \u0438 \u043f\u043e\u043a\u0430 \u0437\u0430\u0436\u0430\u0442\u0430 \u043a\u0430\u043a\u0430\u044f-\u043b\u0438\u0431\u043e \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 \u043c\u044b \u0445\u043e\u0434\u0438\u043c \u0438 \u0441\u0442\u0440\u0435\u043b\u044f\u0435\u043c:<\/p>\n<pre><code class=\"java\">@Override     public void update() {         super.update();          joyInput.update();          float inpX = joyInput.VelocityX;         float inpY = joyInput.VelocityY;          if(Engine.Current.Input.Gamepad.Buttons[Input.GAMEPAD_DPAD_LEFT]) {             inpX = -1;             Rotation = 270;         }          if(Engine.Current.Input.Gamepad.Buttons[Input.GAMEPAD_DPAD_RIGHT]) {             inpX = 1;             Rotation = 90;         }          if(Engine.Current.Input.Gamepad.Buttons[Input.GAMEPAD_DPAD_DOWN]) {             inpY = 1;             Rotation = 180;         }          if(Engine.Current.Input.Gamepad.Buttons[Input.GAMEPAD_DPAD_UP]) {             inpY = -1;             Rotation = 0;         }          X += inpX * (WALK_SPEED * Engine.Current.DeltaTime);         Y += inpY * (WALK_SPEED * Engine.Current.DeltaTime);          Engine.Current.Graphics.Camera.X = X - (Engine.Current.Graphics.ViewWidth \/ 2);         Engine.Current.Graphics.Camera.Y = Y - (Engine.Current.Graphics.ViewHeight \/ 2);          int finger = 0;         if((finger = Engine.Current.Input.isTouchingZone(0, 0, Engine.Current.Graphics.ViewWidth, Engine.Current.Graphics.ViewHeight)) != -1) {             Input.TouchState state = Engine.Current.Input.Touches[finger];              aimX = state.X;             aimY = state.Y;              \/\/ Convert player position from world-space, to screen-space             float ptfX = (X - Engine.Current.Graphics.Camera.X) - state.X;             float ptfY = (Y - Engine.Current.Graphics.Camera.Y) - state.Y;              Rotation = (float)Math.toDegrees(Math.atan2(-ptfX, ptfY));             recalculateForward();              if(nextAttack &lt; 0) {                 GunItem currGun = Guns.get(EquippedGun);                 currGun.Gun.FireEffect.createInstance().play();                 nextAttack = currGun.Gun.Speed;                  Bullet bullet = new Bullet();                 bullet.Speed = 15;                 bullet.LifeTime = 3.0f;                 bullet.Rotation = Rotation;                 bullet.Damage = currGun.Gun.Damage;                  float bullX = sprites[currGun.Gun.Sprite].Width \/ 2;                 float bullY = sprites[currGun.Gun.Sprite].Height \/ 2;                 float fwXFactor = ForwardX * 19;                 float fwYFactor = ForwardY * 19;                  bullet.X = X + bullX - (Bullet.Drawable.Width \/ 2) + fwXFactor;                 bullet.Y = Y + bullY - (Bullet.Drawable.Height \/ 2) + fwYFactor;                  Game.current.World.spawn(bullet);             }         }         nextAttack -= Engine.Current.DeltaTime;     }<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/post_images\/237\/18a\/dbd\/23718adbd3923379ca83ee20c540b7e1.png\" alt=\"image\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/237\/18a\/dbd\/23718adbd3923379ca83ee20c540b7e1.png\"\/><\/div>\n<p>  \u0421\u043f\u0438\u0441\u043e\u043a \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0441\u0442\u0432\u043e\u043b\u043e\u0432 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0435 GunDescription:<\/p>\n<pre><code class=\"java\">public static Gun[] GunDescription = {             new Gun(\"Glock-18\", Player.SPRITE_HANDGUN, 20.0f, 0.4f, 20, 90, \"glock18.wav\", \"pistol.png\", 1500),             new Gun(\"UZI\", Player.SPRITE_HANDGUN, 20.0f, 0.15f, 20, 90, \"uzi.wav\", \"pistol.png\", 1500),             new Gun(\"Deagle\", Player.SPRITE_HANDGUN, 100.0f, 0.7f, 20, 90, \"deagle.wav\", \"pistol.png\", 1500),             new Gun(\"TOZ-34\", Player.SPRITE_HANDGUN, 100.0f, 1.1f, 20, 90, \"shotgun.wav\", \"pistol.png\", 1500),             new Gun(\"XM1014\", Player.SPRITE_HANDGUN, 90.0f, 0.6f, 20, 90, \"shotgun.wav\", \"pistol.png\", 1500),             new Gun(\"AK47\", Player.SPRITE_HANDGUN, 40.0f, 1.1f, 20, 90, \"ak47.wav\", \"pistol.png\", 1500),             new Gun(\"M4-A1\", Player.SPRITE_HANDGUN, 90.0f, 0.6f, 20, 90, \"m4.wav\", \"pistol.png\", 1500),             new Gun(\"MiniFGun\", Player.SPRITE_HANDGUN, 30.0f, 0.15f, 20, 90, \"minigun.wav\", \"pistol.png\", 1500)     }; <\/code><\/pre>\n<p>  \u041d\u0443 \u0438 \u043d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u043c \u043f\u0440\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0437\u043e\u043c\u0431\u0438. \u041e\u043d\u0430 \u0442\u043e\u0436\u0435 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u0430\u044f: \u0435\u0441\u0442\u044c \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 Zombie, \u043e\u0442 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u044e\u0442\u0441\u044f \u0432\u0441\u0435 \u043c\u043e\u043d\u0441\u0442\u0440\u044b \u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u2014 \u043f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0443 \u0438\u0433\u0440\u043e\u043a\u0430, \u0438\u0434\u0442\u0438 \u0432\u043f\u0435\u0440\u0435\u0434 \u0438 \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435 \u0430\u0442\u0430\u043a\u0430!<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/post_images\/602\/da8\/6d8\/602da86d82d35d76d482cc55ad75e2e0.png\" alt=\"image\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/602\/da8\/6d8\/602da86d82d35d76d482cc55ad75e2e0.png\"\/><\/div>\n<pre><code class=\"java\">@Override     public void update() {         super.update();          Player player = Game.current.World.Player;         rotateTowardsEntity(player);          if(distanceTo(player.X, player.Y) > 35)             moveForward(WALK_SPEED * Engine.Current.DeltaTime);     } <\/code><\/pre>\n<p>  <\/p>\n<h2><font color=\"#1c22be\">\u276f<\/font> <font color=\"#454cee\">\u0427\u0442\u043e \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442?<\/font><\/h2>\n<p>  \u0427\u0435\u0441\u0442\u043d\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0441\u0442\u0430\u0442\u044c\u044f \u0438\u0442\u0430\u043a \u0443\u0436\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0430\u0441\u044c \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0434\u043b\u0438\u043d\u043d\u043e\u0439. \u042f \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0442\u0435\u043b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u0433\u0440\u0443, \u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043e\u0434\u043d\u043e\u0439 \u043d\u0435 \u043e\u0441\u043e\u0431\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438, \u043d\u043e \u0441 \u043c\u043e\u0438\u043c \u0441\u0442\u0438\u043b\u0435\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0442\u0435\u043a\u0441\u0442\u043e\u0432 \u0442\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435 \u0432\u044b\u0439\u0434\u0435\u0442. \u041f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u0442\u044c \u043d\u0430 \u0447\u0430\u0441\u0442\u0438!<br \/>  \u041e\u0434\u043d\u0430\u043a\u043e, \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0438 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0434\u0430\u0436\u0435 \u043f\u043e\u0438\u0433\u0440\u0430\u0442\u044c \u0432 \u0438\u0433\u0440\u0443 \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0435\u0435 \u044d\u0442\u0430\u043f\u0435!<\/p>\n<div class=\"oembed\">\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/64ff27c4962d8d30c1136612\" data-style=\"\" id=\"64ff27c4962d8d30c1136612\" width=\"\"><\/div>\n<\/div>\n<div class=\"oembed\">\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/64ff27c572e08276d79d59dd\" data-style=\"\" id=\"64ff27c572e08276d79d59dd\" width=\"\"><\/div>\n<\/div>\n<div class=\"oembed\">\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/64ff27c66f566b30a561ac6f\" data-style=\"\" id=\"64ff27c66f566b30a561ac6f\" width=\"\"><\/div>\n<\/div>\n<p>\u041a\u0430\u043a \u043c\u044b \u0432\u0438\u0434\u0438\u043c, \u0438\u0433\u0440\u0430 (\u0430 \u043f\u043e\u043a\u0430 \u0447\u0442\u043e \u2014 proof of concept) \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043d\u0435\u043f\u043b\u043e\u0445\u043e \u043d\u0430 \u0432\u0441\u0435\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u044b\u043b\u0438 \u0432\u044b\u0431\u0440\u0430\u043d\u044b \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u041e\u0434\u043d\u0430\u043a\u043e \u044d\u0442\u043e \u0435\u0449\u0451 \u043d\u0435 \u0432\u0441\u0451 \u2014 \u043f\u0440\u0435\u0434\u0441\u0442\u043e\u0438\u0442 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u043d\u0435\u0447\u043d\u0443\u044e \u0446\u0435\u043b\u044c \u0438\u0433\u0440\u044b (\u043d\u0430\u0431\u043e\u0440 \u043e\u0447\u043a\u043e\u0432), \u043c\u0430\u0433\u0430\u0437\u0438\u043d \u0441\u0442\u0432\u043e\u043b\u043e\u0432 \u0438 \u0440\u0430\u0437\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u043c\u043e\u0431\u043e\u0432. \u0411\u043b\u0430\u0433\u043e, \u044d\u0442\u043e \u0432\u0441\u0451 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0443\u0436\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u043e. \ud83d\ude42<\/p>\n<h2><font color=\"#1c22be\">\u276f<\/font> <font color=\"#454cee\">\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/font><\/h2>\n<p>  \u041d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0438\u0433\u0440\u0443\u0448\u043a\u0443 \u0441 \u043d\u0443\u043b\u044f \u0432 \u043e\u0434\u0438\u043d\u043e\u0447\u043a\u0443 \u0432\u043f\u043e\u043b\u043d\u0435 \u0440\u0435\u0430\u043b\u044c\u043d\u043e. \u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u043e\u0447\u0430\u0441\u043e\u0432, \u043e\u0434\u043d\u0430\u043a\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0441\u0432\u043e\u0451, \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u0435 \u043c\u043e\u0436\u0435\u0442 \u0438 \u0441\u0430\u043c\u043e\u043c\u0443!<\/p>\n<p>  \u041f\u0438\u0448\u0438\u0442\u0435 \u0441\u0432\u043e\u0451 \u043c\u043d\u0435\u043d\u0438\u0435 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445. \u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u0432\u0434\u0440\u0443\u0433 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430 \u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0430 \u0441\u0430\u043c\u043e\u043f\u0430\u043b\u044c\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438\u0433\u0440, \u0442\u043e \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u044e\u0441\u044c \u0432\u044b\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u043e\u0447\u0430\u0449\u0435!<\/p>\n<hr\/>\n<p>  <\/p>\n<h4><font color=\"#454cee\">\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0437\u0430\u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0438 \u044d\u0442\u043e:<\/font><\/p>\n<ul>\n<li>\u27a4 <a href=\"https:\/\/habr.com\/ru\/companies\/timeweb\/articles\/757050\/\">\u041d\u0435 \u0434\u0430\u0434\u0438\u043c Windows Phone \u0443\u043c\u0435\u0440\u0435\u0442\u044c! \u041a\u0430\u043a \u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0441\u0432\u043e\u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u044b VK, YouTube \u0434\u043b\u044f Nokia Lumia? \u0421\u0430\u043c \u0441\u0435\u0431\u0435 \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0430<\/a><\/li>\n<li>\u27a4 <a href=\"https:\/\/habr.com\/ru\/companies\/timeweb\/articles\/736438\/\">\u0421\u0430\u043c \u0441\u0435\u0431\u0435 \u0438\u0433\u0440\u043e\u0432\u0430\u044f \u043a\u043e\u043d\u0441\u043e\u043b\u044c: \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u043f\u043b\u0430\u043d\u0448\u0435\u0442 \u0441 \u043d\u0435\u0440\u0430\u0431\u043e\u0447\u0438\u043c \u0442\u0430\u0447\u0441\u043a\u0440\u0438\u043d\u043e\u043c \u0432 \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u0434\u0435\u0432\u0430\u0439\u0441 \u0438\u0437 8 \u043a\u043d\u043e\u043f\u043e\u043a \u0438 \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430<\/a><\/li>\n<li>\u27a4 <a href=\"https:\/\/habr.com\/ru\/companies\/timeweb\/articles\/760164\/\">\u0427\u0443\u0434\u043e\u0432\u0438\u0449\u043d\u043e\u0435 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 45-\u043e\u0439 \u0441\u0442\u0435\u043f\u0435\u043d\u0438, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0424\u0440\u0430\u043d\u0441\u0443\u0430 \u0412\u0438\u0435\u0442 \u0440\u0435\u0448\u0438\u043b \u0432 16 \u0432\u0435\u043a\u0435<\/a><\/li>\n<li>\u27a4 <a href=\"https:\/\/habr.com\/ru\/companies\/timeweb\/articles\/759966\/\">\u0417\u0430\u043f\u0443\u0441\u043a \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043d\u0430 .NET \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0436\u0431\u044b \u043d\u0430 Linux-\u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0441 systemd<\/a><\/li>\n<li>\u27a4 <a href=\"https:\/\/habr.com\/ru\/companies\/timeweb\/articles\/757726\/\">\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u043b\u044f Palm OS: \u0447\u0442\u043e \u0436\u0435 \u0442\u0430\u043c \u0441\u0430\u043c\u043e\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0435?<\/a><\/li>\n<\/ul>\n<p>  <a href=\"https:\/\/timeweb.cloud\/vds-vps?utm_source=habr&amp;utm_medium=banner&amp;utm_campaign\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/b5\/pj\/of\/b5pjofdoxth14ro-rjsrn7sbmiy.png\" data-src=\"https:\/\/habrastorage.org\/webt\/b5\/pj\/of\/b5pjofdoxth14ro-rjsrn7sbmiy.png\"\/><\/a><\/h4>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/754588\/\"> https:\/\/habr.com\/ru\/articles\/754588\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/webt\/0y\/os\/et\/0yosetjj6dw8s5ycicghsmeqhf0.jpeg\" alt=\"image\" data-src=\"https:\/\/habrastorage.org\/webt\/0y\/os\/et\/0yosetjj6dw8s5ycicghsmeqhf0.jpeg\" data-blurred=\"true\"\/><\/p>\n<p>  \u041c\u043d\u043e\u0433\u0438\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u044b \u0442\u0430\u043a \u0438\u043b\u0438 \u0438\u043d\u0430\u0447\u0435 \u0438\u043c\u0435\u044e\u0442 \u0442\u044f\u0433\u0443 \u0438 \u0438\u043d\u0442\u0435\u0440\u0435\u0441 \u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0438\u0433\u0440. \u041d\u0435\u043c\u0430\u043b\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u043f\u0435\u0446\u043e\u0432 \u0431\u044b\u043b\u043e \u0437\u0430\u043c\u0435\u0447\u0435\u043d\u043e \u0437\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0445 \u0438 \u043c\u0438\u043b\u0435\u043d\u044c\u043a\u0438\u0445 \u0438\u0433\u0440\u0443\u0448\u0435\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u044b\u043b\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u044b \u0437\u0430 \u043a\u043e\u0440\u043e\u0442\u043a\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u00abjust for fun\u00bb. \u0411\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0437\u0430 \u0441\u0447\u0430\u0441\u0442\u044c\u0435 \u0432\u0437\u044f\u0442\u044c \u0433\u043e\u0442\u043e\u0432\u044b\u0439 \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u0434\u0432\u0438\u0436\u043e\u043a \u043f\u043e \u0442\u0438\u043f\u0443 Unity\/UE \u0438 \u043f\u043e\u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0441\u0432\u043e\u0451 \u0441 \u0438\u0445 \u043f\u043e\u043c\u043e\u0449\u044c\u044e, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0443\u043f\u043e\u0440\u043d\u044b\u0435 \u0438\u0437\u0443\u0447\u0430\u044e\u0442 \u0438 \u043f\u044b\u0442\u0430\u044e\u0442\u0441\u044f \u0447\u0442\u043e-\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432 \u044d\u043a\u0437\u043e\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0434\u0432\u0438\u0436\u043a\u0430\u0445 \u0442\u0438\u043f\u0430 Godot\/Urho, \u0430 \u0441\u043e\u0432\u0441\u0435\u043c \u043f\u0440\u043e\u0436\u0436\u0451\u043d\u043d\u044b\u0435 \u0440\u0435\u0431\u044f\u0442\u0430 \u043b\u044e\u0431\u044f\u0442 \u043f\u0438\u0441\u0430\u0442\u044c \u0438\u0433\u0440\u0443\u0448\u043a\u0438\u2026 \u0441 \u043d\u0443\u043b\u044f. \u0422\u0430\u043a\u043e\u0432\u044b\u043c \u043b\u044e\u0431\u0438\u0442\u0435\u043b\u0435\u043c \u043f\u0438\u0441\u0430\u0442\u044c \u0432\u0441\u0435 \u0441\u0430\u043c \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u0438 \u044f. \u0418 \u0432 \u043e\u0434\u0438\u043d \u0434\u0435\u043d\u044c \u043c\u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u043f\u0440\u0438\u043a\u043e\u043b\u044c\u043d\u043e\u0435, \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u0435 \u0438 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u2014 \u0434\u0432\u0430\u0434\u044d\u0448\u043d\u043e\u0435! \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0432\u044b \u0443\u0437\u043d\u0430\u0435\u0442\u0435 \u043f\u0440\u043e: \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e 2D-\u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440\u0430 \u0441 \u043d\u0443\u043b\u044f \u043d\u0430 \u0431\u0430\u0437\u0435 OpenGL ES, \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u00ab\u0441\u044b\u0440\u043e\u0433\u043e\u00bb \u0432\u0432\u043e\u0434\u0430 \u0432 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0445 \u0438\u0433\u0440\u0430\u0445, \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u0438 \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u0438 \u0438 \u0430\u0434\u0430\u043f\u0442\u0430\u0446\u0438\u044f \u0438\u0433\u0440\u044b \u043f\u043e\u0434 \u043b\u044e\u0431\u044b\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430. \u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e? \u0422\u043e\u0433\u0434\u0430 \u0436\u0434\u0443 \u0432\u0430\u0441 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435!<\/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-352160","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/352160","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=352160"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/352160\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=352160"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=352160"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=352160"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}