為了使使用者達到更好的體驗,做動畫的時候都知道用requestanimationframe了,但是他也是有極限的,當繪製的東西足夠多或者複雜的時候,頻繁的刪除與重繪降低了很多效能。
在canvas中粒子系統應該算是比較常見的一種了,現在建立乙個canvas畫布,並繪製100個粒子在整個畫布上由上至下做勻速往返直線運動。
class scene}
/*上面初始化scene類是呼叫的繪製乙個粒子
* ctx —— canvas上下文
* x —— 圓心x座標
* y —— 圓心y座標
* r —— 圓半徑 */
drawparticle(ctx, x, y, r)
this.init()
。
init() );this.drawparticle(this.ctx, rx, ry, this
.radius);
}//動畫
this
.animate();
}
animate()從上面最終展示的效果來看100個還是很流暢的,我試著增加數量到1000,發現依然沒問題,fps很穩定在60左右,如下圖:} else
}//重繪
this.drawparticle(this.ctx, particle.x, particle.y, this
.radius);
}let self = this
; requestanimationframe(() =>);
}
1000個粒子
接著增加數量到4000,發現fps已經開始變化了,穩定在50左右,數量越多越明顯,如下圖。
4000個粒子
正如上文所說,當粒子量級達到一定數量的時候,效能開始降低,幀率開始下降,這是我們不想看到的,因為這很影響使用者體驗。
離屏渲染到底是什麼?在mozilla文件上有簡單介紹,大概意思就是說再建立乙個新的canvas,然後將要繪製的圖形,先在新的canvas中繪製,然後使用drawimage()將新的canvas畫到當前的canvas上。網上看了一些也沒有講的特別清楚,也動手實踐了一下。
class particle//建立粒子
create()
//移動粒子
move(ctx, x, y)
}
//init方法中的for迴圈
for (let i = 0; i < this.amount; i++) );
}
animate()
drawparticle()
//this.drawparticle(this.ctx, particle.x, particle.y, this.radius);
//↓↓
particle.instance.move(this.ctx, particle.x, particle.y);
//通過上面的操作,發現離屏渲染雖然可以優化動畫的效能,但是從上面可以看出頻繁的建立和銷毀大量canvas也會很影響效能的,所以這中間要有乙個取捨。另外,凡事都有乙個限度,離屏渲染也不是萬能的,有興趣的可以試試,在這個例子中,如果粒子數量達到7000、8000或者9000乃至更多其實還是有很明顯的卡頓。只建立乙個例項
let particle = new particle(this
.radius);
for (let i = 0; i < this.amount; i++) );
}
當然,canvas的一些api也是消耗效能的,所以最後發現,要做好效能優化,首先**肯定是要優化,另外就是使用像離屏渲染之類的方法。
**:
iOS效能優化中的離屏渲染
gpu螢幕渲染有以下兩種方式 特殊的離屏渲染 如果將不在gpu的當前螢幕緩衝區中進行的渲染都稱為離屏渲染,那麼就還有另一種特殊的 離屏渲染 方式 cpu渲染。完成,渲染得到的bitmap最後再交由gpu用於顯示。cpu渲染 gpu顯示 什麼時候會喚起離屏渲染 當使用圓角,陰影,遮罩的時候,圖層屬性的...
iOS離屏渲染之優化分析
在進行ios的應用開發過程中,有時候會出現卡頓的問題,雖然ios裝置的效能越來越高,但是卡頓的問題還是有可能會出現,而離屏渲染是造成卡頓的原因之一。因此,本文主要分析一下離屏渲染產生的原因及避免的方法,最後介紹一下xcode自帶的分析離屏渲染的工具instruments的使用。calayer繼承自n...
離屏渲染學習筆記
opengl中,gpu螢幕渲染有以下兩種方式 意為當前螢幕渲染,指的是gpu的渲染操作是在當前用於顯示的螢幕緩衝區中進行。意為離屏渲染,指的是gpu在當前螢幕緩衝區以外新開闢乙個緩衝區進行渲染操作。相比於當前螢幕渲染,離屏渲染的代價是很高的,主要體現在兩個方面 要想進行離屏渲染,首先要建立乙個新的緩...