Page Flipping 在《Double Buffer》介紹了雙重緩衝的高速繪圖技巧,雖然對 2D 遊戲來說已經盡善盡美,但如果要進一步苛求的話,那就是 Back buffer 複製到 Primary surface 的這個動作也算增加電腦的工作量。於是有人想說,為何不跳過這個動作?Back buffer 畫好直接顯示出來當 Primary surface,再把原本的 Primary surface 隱藏起來當 Back buffer,如此反覆進行不也是一樣效果嗎? 這就是本章節要介紹的 Page Flipping 技巧! 原始碼 // 全域變數 let count = 0; let position = 0; let displaypointer = 0; // 載入背景圖片 let background = new Image(); background.src = 'background.png'; // 載入前景圖片 let sprite = new Image(); sprite.src = 'sprite.png'; // 建立畫布 let surface = [document.createElement('canvas'), document.createElement('canvas')]; for (let n in surface) { document.body.appendChild(surface[n]); surface[n].width = 600; surface[n].height = 300; surface[n].style.position = 'absolute'; surface[n].style.left = '2'; surface[n].style.top = '2'; surface[n].style.visibility = 'hidden'; } // 將圖片描繪到畫布 function draw() { displaypointer = 1 - displaypointer; let context = surface[displaypointer].getContext('2d'); context.drawImage(background, 0, 0); switch (count) { case 0: context.drawImage(sprite, 0, 0, 96, 141, 272, position, 96, 141); count++; break; case 1: context.drawImage(sprite, 96, 0, 96, 141, 272, position += 9, 96, 141); count++; break; case 2: context.drawImage(sprite, 0, 0, 96, 141, 272, position, 96, 141); count++; break; case 3: count = 0; context.drawImage(sprite, 288, 0, 96, 141, 272, position += 9, 96, 141); } surface[1 - displaypointer].style.visibility = 'visible'; surface[displaypointer].style.visibility = 'hidden'; } // 每 0.25 秒執行 draw() setInterval(draw, 250); 範例下載 19690601A.7z