「Canvas是介面形成的基礎,其實所有的UI元件裡面都只是包裝了一連串屬於自己的「如何在Canvas上繪圖」的辦法而已。」
但有些事情是上面這樣的描述無法涵蓋的。
例如「為什麼即使使用了硬體加速,我的Canvas繪製的介面效能很差、很不靈敏、動畫很拖延?」(假設真的有神人挑戰自己用Canvas設計自己的UI元件。)
因為「在Canvas上繪製」和「將Canvas送給render pipeline」這兩個動作是在同一個線程上進行的。
繪製必須要完成,才能進行render,而render也必須要完成,才能再次進行繪製。
所以「繪製」階段越複雜越耗時,「render」的次數頻率就越少,結果就是直觀的畫面會卡、頓、慢。
所以需有兩張Canvas。
一張Canvas(0)用來繪製,一張Canvas(1)用來「render」。
Canvas(0)繪製完後,會Canvas(1)來說,它只需進行「一項繪製動作」,就是「把Canvas(0)覆蓋到Canvas(1)」即可,這會大幅提升效率,以影片播放來說,流暢度通常都會有四倍的差距,如果是遊戲則會更多。
但是,第一張Canvas(1)通常是由系統提供,第二張Canvas(0)則要自己生成,取得Canvas(0)在不同的程式語言上,會有不同的難度。
以Android Native來說,那難度其實並不高。
但在Flutter上來說,那複雜度高到讓人想罵髒話。
所以,Flame遊戲引擎最大的價值就是穩定的簡化了這個步驟,讓使用者可以保證得到一個流暢的畫面輸出。
中秋節快樂。
今天就這樣。