
HTML5- рд╕рдВрдЧрдд рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдФрд░ рд╡рд┐рдВрдбреЛрдЬ 8 рдореЗрдЯреНрд░реЛ рдХреЗ рд▓рд┐рдП HTML5 рдордВрдЪ рдЕрдм рдЖрдзреБрдирд┐рдХ рдЦреЗрд▓реЛрдВ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рдЧрдВрднреАрд░ рдЙрдореНрдореАрджрд╡рд╛рд░ рд╣реИрдВред
рдХреИрдирд╡рд╕ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░-рддреНрд╡рд░рд┐рдд рд╕рддрд╣ рддрдХ рдкрд╣реБрдВрдЪ рд╣реИ, рдЬрд┐рд╕ рдкрд░ рдЖрдк рдЕрдкрдиреЗ рдЧреЗрдо рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХреБрдЫ рдЯреНрд░рд┐рдХреНрд╕ рдФрд░ рдЯреНрд░рд┐рдХреНрд╕ рд╕реЗ рдЖрдк рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб 60 рдлреНрд░реЗрдо рддрдХ рдХрд╛ рдЙрддреНрдХреГрд╖реНрдЯ рдкреНрд░рддрд┐рдкрд╛рджрди рдкреНрд░рджрд░реНрд╢рди рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЦреЗрд▓реЛрдВ рдореЗрдВ рдпрд╣ рдирд┐рд░рдВрддрд░рддрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЦреЗрд▓ (рдПрдиреАрдореЗрд╢рди) рдХреЛ рдЪрд┐рдХрдирд╛ рдХрд░рдирд╛, рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЛ рдмреЗрд╣рддрд░ рд▓рдЧрддрд╛ рд╣реИред
рдЗрд╕ рд▓реЗрдЦ рдХрд╛ рд▓рдХреНрд╖реНрдп рдЖрдкрдХреЛ рдХреБрдЫ рд╕реБрдЭрд╛рд╡ рджреЗрдирд╛ рд╣реИ рдХрд┐ рдЖрдк рдЕрдкрдиреЗ HTML5 рдХреИрдирд╡рд╕ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВред рд▓реЗрдЦ рдореЗрдВ рджреЛ рдореБрдЦреНрдп рднрд╛рдЧ рд╣реЛрддреЗ рд╣реИрдВ [рдЖрдк рдкрд╣рд▓реЗ рдкрдврд╝реЗрдВ]ред
рдбреЗрд╡рд┐рдб рд░рд╛рдЙрд╕реЗрдЯ рдЬрд▓реНрдж рд╣реА рджреВрд╕рд░реЗ рднрд╛рдЧ рдХреЛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░реЗрдВрдЧреЗред
рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рдПрдХ рд╣реА рдЙрджрд╛рд╣рд░рдг рдкрд░ рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ - рдпрд╣ 2D рд╕реБрд░рдВрдЧ рдХрд╛ рдкреНрд░рднрд╛рд╡ рд╣реИ рдЬреЛ рдореИрдВрдиреЗ рдлреНрд░рд╛рдВрд╕ рдореЗрдВ TechDays 2012 рдореЗрдВ
Coding4Fun рд╕рддреНрд░ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрд╛ рдерд╛ред
рдореБрдЭреЗ рдХрдореЛрдбреЛрд░ рдПрдПрдордЖрдИрдЬреАрдП рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдХреЛрдб рджреНрд╡рд╛рд░рд╛ рдЗрд╕ рдЖрд╢рдп рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ рдореИрдВрдиреЗ рддрдм рд▓рд┐рдЦрд╛ рдерд╛ рдЬрдм рдореИрдВ 80 рдХреЗ рджрд╢рдХ рдореЗрдВ рдбрд┐рдореЛрд╕реНрдХреЗрдВрдЬреЛрдВ рдХрд╛ рдПрдХ рдпреБрд╡рд╛ рд▓реЗрдЦрдХ рдерд╛ :)ред рдЖрдЬ рдпрд╣ рдХреЗрд╡рд▓
рдХреИрдирд╡рд╛рд╕ рдФрд░
рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛
рд╣реИ , рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореВрд▓ рдХреЛрдб рдХреЗрд╡рд▓ 68000 рдХреЛрдбрд╛рдВрддрд░рдХ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдерд╛:
JSFiddle рдЙрджрд╛рд╣рд░рдг (рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдмрдирд╛рд╡рдЯ рдХреЛ рдХреЛрдб рдореЗрдВ рд╕реАрд╡рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред
рдкреВрд░рд╛ рдХреЛрдб рдпрд╣рд╛рдВ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИ:
http://www.catuhe.com/msdn/canvas/tunnel.zip (
Y. Narod рдкрд░ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ )ред
рдЗрд╕ рд▓реЗрдЦ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдпрд╣ рдмрддрд╛рдирд╛ рд╣реИ рдХрд┐ рд╕реБрд░рдВрдЧ рдХреЛ рдХреИрд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдореМрдЬреВрджрд╛ рдХреЛрдб рдХреИрд╕реЗ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдмреЗрд╣рддрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдкреНрд░рджрд░реНрд╢рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЫрд╡рд┐ рдбреЗрдЯрд╛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЫрд┐рдкреЗ рд╣реБрдП рдХреИрдирд╡рд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдореИрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдЫрд╡рд┐ рдбреЗрдЯрд╛ рдХреЗ рдкрдврд╝рдиреЗ рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреИрдирд╡рд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд▓рдЧрднрдЧ рд╣рд░ рдЦреЗрд▓ рдореЗрдВ рдЖрдкрдХреЛ рд╕реНрдкреНрд░рд╛рдЗрдЯреНрд╕ рдпрд╛ рдкреГрд╖реНрдарднреВрдорд┐ рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдХреИрдирд╡рд╕ рдореЗрдВ рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╣реБрдд рд╣реА рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХрд╛ рд╣реИ:
drawImage ред рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рдХреИрдирд╡рд╛рд╕ рддрддреНрд╡ рдХреЛ рд╕реНрдкреНрд░рд╛рдЗрдЯ рдХреЗ рдЙрддреНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдкреНрд░рддрд┐рдкрд╛рджрди рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдФрд░ рдЧрдВрддрд╡реНрдп рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд▓реЗрдХрд┐рди рдХрднреА-рдХрднреА рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рдЖрдк рдореВрд▓ рдЫрд╡рд┐ рдкрд░ рдХреБрдЫ рдкреНрд░рднрд╛рд╡ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдпрд╛ рдЬрдм рдореВрд▓ рдЫрд╡рд┐ рдХреЗрд╡рд▓ рдПрдХ рддрд╕реНрд╡реАрд░ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЗ рдЦреЗрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╕рдВрд╕рд╛рдзрди (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдорд╛рдирдЪрд┐рддреНрд░ рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдЖрдкрдХреЛ рдбреЗрдЯрд╛ рдкрдврд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ)ред
рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЖрдкрдХреЛ рдЖрдВрддрд░рд┐рдХ рдЫрд╡рд┐ рдбреЗрдЯрд╛ рддрдХ рдкрд╣реБрдВрдЪ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд▓реЗрдХрд┐рди
рдЫрд╡рд┐ рдЯреИрдЧ рд╕рд╛рдордЧреНрд░реА рдХреЛ рдкрдврд╝рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдФрд░ рдпрд╣рд╛рдБ рдХреИрдирд╡рд╛рд╕ рдмрдЪрд╛рд╡ рдХреЗ рд▓рд┐рдП рдЖрддрд╛ рд╣реИ!
рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рд╣рд░ рдмрд╛рд░ рдЬрдм рдЖрдкрдХреЛ рдХрд┐рд╕реА рдЫрд╡рд┐ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдкрдврд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рдЖрдк рдПрдХ рдЕрджреГрд╢реНрдп (рдкреНрд░рджрд░реНрд╢рд┐рдд рдирд╣реАрдВ) рдХреИрдирд╡рд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░ рдПрдХ рдЫрд╡рд┐ рдЕрдкрд▓реЛрдб рдХрд░рдирд╛ рд╣реИ, рдФрд░ рдЬрдм рдЗрд╕реЗ рдЕрдкрд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдЗрддрдирд╛ рдХрд░рдирд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдПрдХ рдХреИрдирд╡рд╛рд╕ рддрддреНрд╡ рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдбреЛрдо рдореЗрдВ рдбрд╛рд▓рд╛ рдирд╣реАрдВ рдЬрд╛рддрд╛ рд╣реИред рдЕрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕рдВрдмрдВрдзрд┐рдд рдХреИрдирд╡рд╛рд╕ рдкрд┐рдХреНрд╕рд▓ (рдЬреЛ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрд░реЛрдд рдЫрд╡рд┐ рдХреЗ [рдХреЙрдкреА рдХрд┐рдП рдЧрдП] рдкрд┐рдХреНрд╕рд▓ рддрдХ рдкрд╣реБрдВрдЪ рд╣реИред
рдЗрд╕ рддрдХрдиреАрдХ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ (рд╕реБрд░рдВрдЧ рдХреА рдмрдирд╛рд╡рдЯ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП 2 рдбреА рд╕реБрд░рдВрдЧ рдкреНрд░рднрд╛рд╡ рдореЗрдВ рдкреНрд░рдпреБрдХреНрдд):
var loadTexture = function (name, then) { var texture = new Image(); var textureData; var textureWidth; var textureHeight; var result = {}; // on load texture.addEventListener('load', function () { var textureCanvas = document.createElement('canvas'); // off-screen canvas // Setting the canvas to right size textureCanvas.width = this.width; // <-- "this" is the image textureCanvas.height = this.height; result.width = this.width; result.height = this.height; var textureContext = textureCanvas.getContext('2d'); textureContext.drawImage(this, 0, 0); result.data = textureContext.getImageData(0, 0, this.width, this.height).data; then(); }, false); // Loading texture.src = name; return result; };
рдЗрд╕ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рдмрдирд╛рд╡рдЯ рд▓реЛрдбрд┐рдВрдЧ рдЕрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд░реВрдк рд╕реЗ рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдХреЛрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП
рддрддреНрдХрд╛рд▓реАрди рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
// Texture var texture = loadTexture("soft.png", function () { // Launching the render QueueNewFrame(); });
рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
рдЖрдзреБрдирд┐рдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдФрд░ рд╡рд┐рдВрдбреЛрдЬ 8 рдХреИрдирд╡рд╛рд╕
рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рддреНрд╡рд░рдг рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВред рдпрд╣, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЖрдк рдХреИрдирд╡рд╛рд╕ рдХреЛ рд╕рд╛рдордЧреНрд░реА рдореЗрдВ рдкреИрдорд╛рдиреЗ рдкрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
GPU рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
2 рдбреА рд╕реБрд░рдВрдЧ рдкреНрд░рднрд╛рд╡ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рдХреИрдирд╡рд╛рд╕ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 1024x768 рдЖрдХрд╛рд░ рдХреЗ рдПрдХ рдХреИрдирд╡рд╛рд╕ рдХреЗ рд▓рд┐рдП, 786432 рдкрд┐рдХреНрд╕рд▓ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдкреНрд░рджрд░реНрд╢рди рдХреА рдирд┐рд░рдВрддрд░рддрд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб 60 рдмрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб
47185920 рдкрд┐рдХреНрд╕реЗрд▓ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИ!
рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдХреЛрдИ рднреА рд╕рдорд╛рдзрд╛рди рдЬреЛ рдЖрдкрдХреЛ рдкрд┐рдХреНрд╕реЗрд▓
рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ
рдХрдо рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ, рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ
рд╕реБрдзрд╛рд░ рд▓рд╛рдПрдЧрд╛ ред
рдореИрдВ рджреЛрд╣рд░рд╛рддрд╛ рд╣реВрдВ, рдХреИрдирд╡рд╛рд╕ рдПрдХ рдРрд╕рд╛ рдЙрдкрдХрд░рдг рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ! рдирд┐рдореНрди рдХреЛрдб рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдЖрдВрддрд░рд┐рдХ рдХреИрдирд╡рд╛рд╕ рдмрдлрд░ рдХреЛ DOM рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдмрд╛рд╣рд░реА рдЖрдХрд╛рд░ рдореЗрдВ рд╕реНрдХреЗрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рддреНрд╡рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ:
// Setting hardware scaling canvas.width = 300; canvas.style.width = window.innerWidth + 'px'; canvas.height = 200; canvas.style.height = window.innerHeight + 'px';
DOM рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдЖрдХрд╛рд░ (
рдХреИрдирд╡рд╕.рд╕реНрдЯрд╛рдЗрд▓.рд╡рд╛рдпреБ рдФрд░
рдХреИрдирд╡рд╕.рд╕реНрдЯрд╛рдЗрд▓.рд╣рд╛рдЗрдЯ ) рдФрд░ рдХреИрдирд╡рд╕ рдХреИрдирд╡рд╕
рдмрдлрд╝рд░ рдХреЗ рдЖрдХрд╛рд░ (
рдХреИрдирд╡рд╕.рд╡реНрдпреВрд╕ рдФрд░
рдХреИрдирд╡рд╕.рд╣рд╛рдЗрдЯ ) рдХреЗ рдЕрдВрддрд░ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВред
рдпрджрд┐ рдЗрди рджреЛ рдЖрдХрд╛рд░реЛрдВ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рд╣реИ, рддреЛ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд╛рд░реНрдп рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдмрдлрд░ рдХреЛ рд╕реНрдХреЗрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рд╢рд╛рдирджрд╛рд░ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ: рд╣рдо рдХрдо рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдкрд░ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЬреАрдкреАрдпреВ рдХреЛ рдбреЛрдо рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рднрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдгрд╛рдо рджреЗрддреЗ рд╣реИрдВ (рдкрд░рд┐рдгрд╛рдо рдХреЛ рд╕реБрдЪрд╛рд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрджреНрднреБрдд рдлреНрд░реА рдлрд┐рд▓реНрдЯрд░ рдлрд┐рд▓реНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ) )ред
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдкреНрд░рддрд┐рдкрд╛рджрди 300x200 рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЬреАрдкреАрдпреВ рдЖрдкрдХреА рдЦрд┐рдбрд╝рдХреА рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдорд╛рдкрддрд╛ рд╣реИред
рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рд╕рднреА рдЖрдзреБрдирд┐рдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рд╕рдорд░реНрдерд┐рдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдЗрд╕ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд░реЗрдВрдбрд░рд┐рдВрдЧ рдЪрдХреНрд░ рдХрд╛ рдЕрдиреБрдХреВрд▓рди
рдЬрдм рдЖрдк рдПрдХ рдЧреЗрдо рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕рдВрднрд╡рддрдГ рдПрдХ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдЪрдХреНрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕рдореЗрдВ рдЖрдк рдЧреЗрдо рдХреЗ рд╕рднреА рдШрдЯрдХреЛрдВ (рдкреГрд╖реНрдарднреВрдорд┐, рд╕реНрдкреНрд░рд╛рдЗрдЯ, рдЕрдВрдХ, рдЖрджрд┐) рдХреЛ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдЪрдХреНрд░ рдЖрдкрдХреЗ рдХреЛрдб рдореЗрдВ рдПрдХ рд╕рдВрдХреАрд░реНрдг рдЧрд░реНрджрди рд╣реИ рдФрд░ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЖрдкрдХрд╛ рдЦреЗрд▓ рддреЗрдЬ рдФрд░ рдЪрд┐рдХрдирд╛ рд╣реЛред
RequestAnimationFrame
HTML5 рдХреЗ рд╕рд╛рде рдЖрдиреЗ рд╡рд╛рд▓реА рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ
window.requestAnimationFrame рдлрд╝рдВрдХреНрд╢рдиред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп
Window.setInterval рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЯрд╛рдЗрдорд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛ рдЖрдкрдХреЗ рдбреНрд░рд╛рдЗрдВрдЧ рдЪрдХреНрд░ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ (1000/16) рдорд┐рд▓реАрд╕реЗрдХрдВрдб (рдкреЛрд╖рд┐рдд 60fps рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП), рдЖрдк
requestAnimationFrame рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рдпрд╣ рдЬрд┐рдореНрдореЗрджрд╛рд░реА рд╕реМрдВрдк рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЙрд▓ рдХрд╣рддреА рд╣реИ рдХрд┐ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЖрдкрдХреЗ рдХреЛрдб рдХреЛ рдЬрд▓реНрдж рд╕реЗ рдЬрд▓реНрдж рдХреЙрд▓ рдХрд░реЗ, рддрд╛рдХрд┐ рдЧреНрд░рд╛рдлрд┐рдХрд▓ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдЕрдкрдбреЗрдЯ рд╣реЛ рд╕рдХреЗред
рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЖрдкрдХреЗ рд░реЗрдВрдбрд░рд┐рдВрдЧ рд╢реЗрдбреНрдпреВрд▓ рдХреЗ рдЕрдВрджрд░ рдЖрдкрдХреЗ рдЕрдиреБрд░реЛрдз рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдЧрд╛ рдФрд░ рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдФрд░ рдПрдиреАрдореЗрд╢рди рдХреЛрдб (CSS, рдмрджрд▓рд╛рд╡ рдЖрджрд┐) рдХреЗ рд╕рд╛рде рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝ рдХрд░реЗрдЧрд╛ред рдпрд╣ рд╕рдорд╛рдзрд╛рди рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рднреА рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдХрд┐ рдЬрдм рдЦрд┐рдбрд╝рдХреА рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗ рд░рд╣реА рд╣реИ рддреЛ рдЖрдкрдХрд╛ рдХреЛрдб рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ (рдХрдо рд╕реЗ рдХрдо, рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд╡рд░реБрджреНрдз, рдЖрджрд┐)ред
рдпрд╣ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд╕рд╛рде рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕рдорд╛рдирд╛рдВрддрд░ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдХрд░ рд╕рдХрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдкрдХрд╛ рд░реЗрдВрдбрд░ рдЪрдХреНрд░ рдмрд╣реБрдд рдзреАрдорд╛ рд╣реИ) рдФрд░ рдлрд┐рд░ рднреА рдЪрд┐рдХрдиреА рдПрдирд┐рдореЗрд╢рди рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рддрд╛ рд╣реИред
рдХреЛрдб рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рд╣реИ (рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЙрдкрд╕рд░реНрдЧреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ):
var intervalID = -1; var QueueNewFrame = function () { if (window.requestAnimationFrame) window.requestAnimationFrame(renderingLoop); else if (window.msRequestAnimationFrame) window.msRequestAnimationFrame(renderingLoop); else if (window.webkitRequestAnimationFrame) window.webkitRequestAnimationFrame(renderingLoop); else if (window.mozRequestAnimationFrame) window.mozRequestAnimationFrame(renderingLoop); else if (window.oRequestAnimationFrame) window.oRequestAnimationFrame(renderingLoop); else { QueueNewFrame = function () { }; intervalID = window.setInterval(renderingLoop, 16.7); } };
рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдмрд╕ рдЕрдЧрд▓реЗ рдлреНрд░реЗрдо рдХреА рд╕рджрд╕реНрдпрддрд╛ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдЪрдХреНрд░ рдХреЗ рдЕрдВрдд рдореЗрдВ рдЗрд╕реЗ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
var renderingLoop = function () { ... QueueNewFrame(); };
DOM (рдбреЙрдХреНрдпреВрдореЗрдВрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЙрдбрд▓) рддрдХ рдкрд╣реБрдВрдЪ
рдЕрдкрдиреЗ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдЪрдХреНрд░ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХрдо рд╕реЗ рдХрдо рдПрдХ рд╕реНрд╡рд░реНрдгрд┐рдо рдирд┐рдпрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП: DOM рдХреЛ TURN рди рдХрд░реЗрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐ рдЗрд╕ рд╕реНрдерд╛рди рдкрд░ рдЖрдзреБрдирд┐рдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдХреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдбреЛрдо рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдЧреБрдгреЛрдВ рдХреЛ рдкрдврд╝рдирд╛ рдЕрднреА рднреА рдПрдХ рддреЗрдЬреА рд╕реЗ рдкреНрд░рддрд┐рдкрд╛рджрди рдЪрдХреНрд░ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдзреАрдорд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореЗрд░реЗ рдХреЛрдб рдореЗрдВ, рдореИрдВрдиреЗ рдЗрдВрдЯрд░рдиреЗрдЯ рдПрдХреНрд╕рдкреНрд▓реЛрд░рд░ 10 рдкреНрд░реЛрдлрд╛рдЗрд▓рд░ (
F12 рдбреЗрд╡рд▓рдкрд░ рдЯреВрд▓ рдореЗрдВ рдЙрдкрд▓рдмреНрдз ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдФрд░ рдкрд░рд┐рдгрд╛рдо рд╕реНрдкрд╖реНрдЯ рд╣реИрдВ:

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдХреИрдирд╡рд╛рд╕ рдХреА рдЪреМрдбрд╝рд╛рдИ рдФрд░ рдКрдБрдЪрд╛рдИ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдореЗрдВ рд░реЗрдВрдбрд░ рд▓реВрдк рдореЗрдВ рдмрд╣реБрдд рд╕рдордп рд▓рдЧрддрд╛ рд╣реИ!
рдореВрд▓ рдХреЛрдб рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
var renderingLoop = function () { for (var y = -canvas.height / 2; y < canvas.height / 2; y++) { for (var x = -canvas.width / 2; x < canvas.width / 2; x++) { ... } } };
рдЖрдк рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рджреЛ рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рдХреЗ рд╕рд╛рде рдХреИрдирд╡рд╕ рдХреЗ рдЧреБрдгреЛрдВ рдФрд░ рдХреИрдирд╡рд╕ рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред
var renderingLoop = function () { var index = 0; for (var y = -<b>canvasHeight</b> / 2; y < <b>canvasHeight</b> / 2; y++) { for (var x = -<b>canvasWidth</b> / 2; x < <b>canvasWidth</b> / 2; x++) { ... } } };
рд╕рд░рд▓, рд╕рд╣реА? рдпрд╣ рд╕рдордЭрдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдХрд░реЛ, рдпрд╣ рдПрдХ рдХреЛрд╢рд┐рд╢ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ!
рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЧрдгрдирд╛
рдкреНрд░реЛрдлрд╛рдЗрд▓рд░ рдХреЗ рдЕрдиреБрд╕рд╛рд░,
Math.atan2 рдлрд╝рдВрдХреНрд╢рди рдХреБрдЫ рдзреАрдорд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдСрдкрд░реЗрд╢рди рд╕реАрдкреАрдпреВ рдХреЗ рдЕрдВрджрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкрд░рд┐рдгрд╛рдо рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд░рдирдЯрд╛рдЗрдо рдХреЛ рдХреБрдЫ рд╕рдВрдЪрд╛рд▓рди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
[рдЕрдиреБрд╡рд╛рдж: рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрдХ рддрдХрдиреАрдХреА рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдпрд╣ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЬреЗрдПрд╕-рд░рдирдЯрд╛рдЗрдо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдлрд╝рд┐рдкреНрдЯрди рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдирд┐рд░реНрджреЗрд╢ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдХреЛрдИ рднреА рдЗрд╕реЗ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдирд╣реАрдВ рджреЗ рд╕рдХрддрд╛ рд╣реИред рдЧрдгрд┐рддреАрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП ECMAScript5 рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рд╡реЗ (рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ) рд╕рдиреНрдирд┐рдХрдЯрди рд╣реИрдВ рдФрд░ рд╕рди рдорд╛рдЗрдХреНрд░реЛрд╕рд┐рд╕реНрдЯрдореНрд╕ рдЧрдгрд┐рддреАрдп рдкреБрд╕реНрддрдХрд╛рд▓рдп рдПрд▓реНрдЧреЛрд░рд┐рджрдо (http://www.netlib.org/fdlibm) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддреЗ рд╣реИрдВред рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдПрдЯреИрди 2 рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди, рдЬреЛ рдЗрд╕реЗ рдкреНрд░рд╛рдердорд┐рдХ рдФрд░ рддреЗрдЬ рдирд╣реАрдВ рдмрдирд╛рддрд╛ рд╣реИред]
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрджрд┐ рдЖрдк рдХреБрдЫ рд▓рдВрдмреЗ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдб рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЧрдгрдирд╛ рдХреА рд╡реНрдпрд╡рд╕реНрдерд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╣рдореЗрд╢рд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИред рдпрд╣рд╛рдБ, рдЕрдкрдирд╛ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдЪрдХреНрд░ рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ
Math.atan2 рдХреЗ рдорд╛рдиреЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реВрдБ:
// precompute arctangent var atans = []; var index = 0; for (var y = -canvasHeight / 2; y < canvasHeight / 2; y++) { for (var x = -canvasWidth / 2; x < canvasWidth / 2; x++) { atans[index++] = Math.atan2(y, x) / Math.PI; } }
Atans рдРрд░реЗ
рдХреЛ рддрдм рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░реЗрдВрдбрд░ рд▓реВрдк рдХреЗ рдЕрдВрджрд░ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
Math.round, Math.floor рдФрд░ parseInt рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдмрдЪреЗрдВ
ParseInt рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ:

рдЬрдм рдЖрдк рдХреИрдирд╡рд╛рд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреВрд░реНрдгрд╛рдВрдХ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ (x рдФрд░ y) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЖрдкрдХреА рд╕рднреА рдЧрдгрдирд╛ рдлрд╝реНрд▓реЛрдЯрд┐рдВрдЧ рдкреЙрдЗрдВрдЯ рдирдВрдмрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреА рдЬрд╛рддреА рд╣реИ рдФрд░ рдЬрд▓реНрдж рд╣реА рдпрд╛ рдмрд╛рдж рдореЗрдВ рдЖрдкрдХреЛ рдЙрдиреНрд╣реЗрдВ рдкреВрд░реНрдгрд╛рдВрдХ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рдкреВрд░реНрдгрд╛рдВрдХ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП
Math.round ,
Math.floor, рдпрд╛
parseInt рдХреЛ рднреА рдХрд╛рд░реНрдп рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпреЗ рдлрд╝рдВрдХреНрд╢рди рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рд░реЗрдВрдЬ рдХреА рдЬрд╛рдВрдЪ рдпрд╛ рдпрд╣ рдЬрд╛рдВрдЪрдирд╛ рдХрд┐ рдорд╛рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдВрдЦреНрдпрд╛рдПрдВ рд╣реИрдВ; parseInt рдЖрдо рддреМрд░ рдкрд░ рдЕрдкрдиреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ!)ред рдЗрд╕рд▓рд┐рдП, рдореЗрд░реЗ рд░реЗрдВрдбрд░ рдЪрдХреНрд░ рдХреЗ рдЕрдВрджрд░, рдореБрдЭреЗ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреЗрдЬрд╝ рддрд░реАрдХрд╛ рдЪрд╛рд╣рд┐рдПред
рдЕрдкрдиреЗ рдкреБрд░рд╛рдиреЗ рдЕрд╕реЗрдВрдмрд▓рд░ рдХреЛрдб рдХреЛ рдпрд╛рдж рдХрд░рддреЗ рд╣реБрдП, рдореИрдВрдиреЗ рдереЛрдбрд╝рд╛ рдЯреНрд░рд┐рдХ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛:
рдкрд╛рд░реНрд╕рдЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдмрд╕ рдирдВрдмрд░ рдХреЛ рджрд╛рдИрдВ рдУрд░ рд╢рд┐рдлреНрдЯ рдХрд░реЗрдВред рд░рдирдЯрд╛рдЗрдо рд╕рдВрдмрдВрдзрд┐рдд рд░рдЬрд┐рд╕реНрдЯрд░ рд╕реЗ рдлреНрд▓реЛрдЯрд┐рдВрдЧ-рдкреЙрдЗрдВрдЯ рдирдВрдмрд░ рдХреЛ рдкреВрд░реНрдгрд╛рдВрдХ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдЧрд╛ рдФрд░ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рд░реВрдкрд╛рдВрддрд░рдг рд▓рд╛рдЧреВ рдХрд░реЗрдЧрд╛ред рдирдВрдмрд░ рдХреЛ рджрд╛рдИрдВ рдУрд░ 0 рд╕реЗ рд╢рд┐рдлреНрдЯ рдХрд░рдиреЗ рд╕реЗ рдирдВрдмрд░ рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд░рд╣реЗрдЧрд╛ рдФрд░ рдкреВрд░реНрдгрд╛рдВрдХ рдорд╛рди рд╡рд╛рдкрд╕ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЖ рдЬрд╛рдПрдЧрд╛ред
рд╕реНрд░реЛрдд рдХреЛрдб рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдерд╛:
u = parseInt((u < 0) ? texture.width + (u % texture.width) : (u >= texture.width) ? u % texture.width : u)
рдирдпрд╛ рдХреЛрдб рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
u = ((u < 0) ? texture.width + (u % texture.width) : (u >= texture.width) ? u % texture.width : u) >> 0
рдмреЗрд╢рдХ, рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рд╕рдВрдЪрд░рд┐рдд рд╕рдВрдЦреНрдпрд╛ рдХреА рд╢реБрджреНрдзрддрд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ :)
рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо
рд╕рднреА рд╡рд░реНрдгрд┐рдд рдЕрдиреБрдХреВрд▓рди рдХрд╛ рдЖрд╡реЗрджрди рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд░рд┐рдкреЛрд░реНрдЯ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ:

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрдм рдХреЛрдб рдХреЗрд╡рд▓ рдкреНрд░рдореБрдЦ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рджрд┐рдЦрддрд╛ рд╣реИред
рд╣рдордиреЗ рдЗрд╕ рдореВрд▓ рдЧреИрд░-рдЕрдиреБрдХреВрд▓рд┐рдд рд╕реБрд░рдВрдЧ рдХреЗ рд╕рд╛рде рд╢реБрд░реБрдЖрдд рдХреА:
JSFiddle рдЙрджрд╛рд╣рд░рдгрдФрд░ рд╣рдо рдЕрдиреБрдХреВрд▓рди рдХреЗ рдмрд╛рдж рдЗрд╕ рдкрд░рд┐рдгрд╛рдо рдкрд░ рдЖрдП:
JSFiddle рдЙрджрд╛рд╣рд░рдг[рдЕрдиреБрд╡рд╛рджред: рдпреЗ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдПрдХ рдЕрдиреБрд╡рд╛рджрдХ рдХреЗ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рд▓рд┐рдП рдЧрдП рдереЗ, рдЬрд┐рд╕ рдкрд░ рдПрдлрдкреАрдПрд╕ рдкреНрд░рддрд┐рд╖реНрдард┐рдд 60 рдПрдлрдкреАрдПрд╕ рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЗрд╕рдХреЗ рдмрд╣реБрдд рдХрд░реАрдм рдШреВрдорддрд╛ рд╣реИ - IE10 рдореЗрдВ рд▓рдЧрднрдЧ 50 рдПрдлрдкреАрдПрд╕ред]рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдЖрд░реЗрдЦ рдХреЗ рдпреЛрдЧрджрд╛рди рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдирд┐рдореНрди рдЖрд░реЗрдЦ рдХреЗ рд╕рд╛рде рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдореЗрд░реЗ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдлреНрд░реЗрдо рджрд░ рджрд┐рдЦрд╛ рд░рд╣рд╛ рд╣реИ:

рдЪрд▓ рд░рд╣рд╛ рд╣реИ
рдЗрди рдореБрдЦреНрдп рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП, рдЖрдк рдЕрдм рдЖрдзреБрдирд┐рдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдФрд░ рд╡рд┐рдВрдбреЛрдЬ 8 рдХреЗ рд▓рд┐рдП рддреЗрдЬ рдФрд░ рд╕реБрдЧрдо рдЦреЗрд▓ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВ!