畫布只是一個圖像,從我的經驗來看,使用畫布或圖像在性能方面沒有區別。
離線或在畫布上沒有什麼不同,他們都會盡可能利用GPU。
使用context.getImageData()
,context.createImageData()
和context.putImageData()
應避免實時渲染,它並不需要GPU和你做它將在主內存的Javascript進行任何處理的優勢。雖然數據存儲在一個類型數組Uint8ClampedArray
中,並且可以轉換爲任何類型的類型數組,例如Uint32Array
,允許您使用一個變量處理單個像素,而不是4.還有許多用於類型化數組的原生函數,提供比標準Javascript數組更快的數組操作。
圖像的限制因素(包括畫布作爲圖像)是可用GPU RAM的數量,當超過可用RAM的數量時,瀏覽器將根據需要開始將圖像交換到GPU RAM中,阻礙了GPU的渲染能力,與正常的RAM訪問相比,從主RAM到GPU RAM的傳輸速度較慢。發生這種情況時,您將立即看到幀速率的損失。由於瀏覽器可以運行的平臺種類繁多,並且無法瞭解機器功能,所以在發佈實時應用程序時應該小心。
如果您已經爲高端桌面機器編寫了高分辨率圖像的遊戲,它在平板電腦和低端筆記本電腦上表現不佳。爲了緩解這個問題,下載圖像以匹配屏幕分辨率。在1/8分辨率的設備上使用招聘背景圖片會給硬件帶來不適當的壓力。設備是用來處理屏幕的分辨率的,經過這個分辨率會產生很大的不必要的性能影響。這是您可以使用屏幕外畫布以設備原始分辨率呈現圖像,然後轉儲原始人員圖像的位置。質量不會有任何損失,但性能會有很大的提高,從而將無法播放的東西變成可播放的東西。這適用於所有圖形資源。切勿以高於所用設備的分辨率存儲和使用圖像。
由於您可以使用畫布進行多種操作,因此找出最佳運行方式的最佳方法就是進行實驗。監視幀速率並嘗試不同的方法解決問題。如果幀速率提高,你已經找到了一個更好的做事方式,如果幀速率下降,那麼你使用了錯誤的方法。
所以你說的是,如果我製作類似RPG和一些不同的瓷磚,我應該將它們全部渲染到屏幕外的畫布上,然後從該畫布獲取數據並將它們放到可見區域? –
是的:)畫布上放置的每個圖塊都有一個小的開銷,因此當您在屏幕外緩衝區上繪圖時,它更快,因爲它不需要繪製到內存和屏幕上,它只是將其存儲到內存中。 –
多個畫布會對遊戲開發更有益嗎?一個用於瓷磚,一個用於我的主要角色,例如? –