<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12
      代碼改變世界

      你必須知道的10個提高Canvas性能技巧

      2011-11-29 17:07  【當耐特】  閱讀(24305)  評論(24)    收藏  舉報

      你還在抱怨自己寫的canvas demo徘徊在10幀以下嗎?你還在煩惱打開自己寫的應用就聽見CUP風扇轉嗎?你正在寫一個javascript Canvas庫嗎?那么下面九點就是你必須知道的!

      一.預渲染

      錯誤代碼:

            var canvas = document.getElementById("myCanvas");
            var context = this.canvas.getContext('2d');
            var drawAsync = eval(Jscex.compile("async", function () {
                while (true) {
                    drawMario(context);
                    $await(Jscex.Async.sleep(1000));
                }
            }))
            drawAsync().start();
      

      正確代碼:

            var canvas = document.getElementById("myCanvas");
            var context = this.canvas.getContext('2d');
            var m_canvas = document.createElement('canvas');
            m_canvas.width = 64;
            m_canvas.height = 64;
            var m_context = m_canvas.getContext('2d');
            drawMario(m_context);
            var drawAsync = eval(Jscex.compile("async", function () {
                while (true) {
                    context.drawImage(m_canvas, 0, 0);
                    $await(Jscex.Async.sleep(1000));
                }
            }))
            drawAsync().start();
      

      這里m_canvas的寬度和高度控制得越小越好。

      二.盡量少調用canvasAPI

      錯誤代碼:

         
          for (var i = 0; i < points.length - 1; i++) {
                var p1 = points[i];
                var p2 = points[i + 1];
                context.beginPath();
                context.moveTo(p1.x, p1.y);
                context.lineTo(p2.x, p2.y);
                context.stroke();
            } 
      

      正確代碼:

            context.beginPath();
            for (var i = 0; i < points.length - 1; i++) {
                var p1 = points[i];
                var p2 = points[i + 1];
                context.moveTo(p1.x, p1.y);
                context.lineTo(p2.x, p2.y);
            }
            context.stroke();
      

      三.盡量少改變CANVAS狀態

      錯誤代碼:

            for (var i = 0; i < STRIPES; i++) {
                context.fillStyle = (i % 2 ? COLOR1 : COLOR2);
                context.fillRect(i * GAP, 0, GAP, 480);
            } 
      

      正確代碼:

            context.fillStyle = COLOR1;
            for (var i = 0; i < STRIPES / 2; i++) {
                context.fillRect((i * 2) * GAP, 0, GAP, 480);
            }
            context.fillStyle = COLOR2;
            for (var i = 0; i < STRIPES / 2; i++) {
                context.fillRect((i * 2 + 1) * GAP, 0, GAP, 480);
            }
      

      四.重新渲染的范圍盡量小

      錯誤代碼:

        context.fillRect(0, 0, canvas.width, canvas.height); 
      

      正確代碼:

            context.fillRect(20, 20, 100, 100);
      

      五.復雜場景使用多層畫布

       <canvas  width="600" height="400" style="position: absolute; z-index: 0">
      </canvas>
      <canvas  width="600" height="400" style="position: absolute; z-index: 1">
      </canvas>
      

      六.不要使用陰影

            context.shadowOffsetX = 5;
            context.shadowOffsetY = 5;
            context.shadowBlur = 4;
            context.shadowColor = 'rgba(255, 0, 0, 0.5)';
            context.fillRect(20, 20, 150, 100);
      

      七.清除畫布

      詳細性能差別:
      http://simonsarris.com/blog/346-how-you-clear-your-canvas-matters
      一般情況下:clearRect的性能優于fillRect優于canvas.width = canvas.width;

      八.像素級別操作盡量用整數

      幾種取整數的方法:

            rounded = (0.5 + somenum) | 0;
            rounded = ~ ~(0.5 + somenum);
            rounded = (0.5 + somenum) << 0;
      

      九.使用requestAnimationFrame制作游戲或動畫

              (function () {
                  var lastTime = 0;
                  var vendors = ['ms', 'moz', 'webkit', 'o'];
                  for (var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
                      window.requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame'];
                      window.cancelAnimationFrame =
                window[vendors[x] + 'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];
                  }

                  if (!window.requestAnimationFrame)
                      window.requestAnimationFrame = function (callback, element) {
                          var currTime = new Date().getTime();
                          var timeToCall = Math.max(0, 16 - (currTime - lastTime));
                          var id = window.setTimeout(function () { callback(currTime + timeToCall); },
                    timeToCall);
                          lastTime = currTime + timeToCall;
                          return id;
                      };

                  if (!window.cancelAnimationFrame)
                      window.cancelAnimationFrame = function (id) {
                          clearTimeout(id);
                      };
              } ());

      十.其他

      與渲染無關的計算交給worker

      復雜的計算交給引擎(自己寫,或者用開源的),比如3D、物理

      緩存load好的圖片,canvas上畫canvas,而不是畫image

      同步

      本文已同步更新至:

      HTML5實驗室【目錄】:   http://www.rzrgm.cn/iamzhanglei/archive/2011/11/06/2237870.html

      主站蜘蛛池模板: 国产av无码专区亚洲av软件| 婷婷综合亚洲| 国产女同一区二区在线| 欧美性xxxxx极品| 日本黄页网站免费观看| 国产精品99精品久久免费| 国产亚洲精品第一综合麻豆| 亚洲免费观看视频| 久热久热久热久热久热久热| av中文字幕在线二区| 国产精品高清一区二区三区| 岛国岛国免费v片在线观看| 亚洲国产精品综合久久2007| 久章草这里只有精品| 欧美老熟妇乱子伦牲交视频| 国产成人精品亚洲高清在线| 欧产日产国产精品精品| 日本一区二区久久人妻高清| 久久人与动人物a级毛片| 国产狂喷潮在线观看| 久热这里只有精品在线观看| 午夜福利国产精品视频| 伊人蕉影院久亚洲高清| 18禁黄网站禁片免费观看| 粗壮挺进邻居人妻无码| 四虎女优在线视频免费看| 亚洲激情一区二区三区视频| 欧洲无码一区二区三区在线观看 | 国产精品乱码久久久久久小说| 极品人妻少妇一区二区| 国产成人高清精品亚洲| 曰韩无码二三区中文字幕| 女人扒开的小泬高潮喷小| 色九月亚洲综合网| 亚洲AV永久无码嘿嘿嘿嘿| 久久99精品久久水蜜桃| 日本一区三区高清视频| 亚洲另类无码一区二区三区| 亚洲在av极品无码天堂| 天堂在/线中文在线资源 官网| 精品国产乱来一区二区三区|