Canvas動畫 位圖緩存提高效率和對應的內存問題

對一個矢量圖動畫,開啟位圖緩存能大大提高運行效率。所謂開啟位圖緩存,其實要自己動手,先創建一個臨時canvas,然后把矢量圖繪制到這個canvas上,到了實際繪制時,直接把這個臨時canvas拷貝到真正canvas上。而位圖拷貝的速度是非常快的,比重新繪制矢量圖要快很多。

三部曲:

1、建立臨時canvas(位圖緩存)

    p.cache = function(x, y, width, height, scale) {// draw to canvas.scale = scale||1;if (!this.cacheCanvas) { this.cacheCanvas = document.createElement("canvas");}this._cacheWidth = width;this._cacheHeight = height;this._cacheOffsetX = x;this._cacheOffsetY = y;this._cacheScale = scale;this.updateCache();}

2、繪制到臨時canvas

    p.updateCache = function(compositeOperation) {var cacheCanvas = this.cacheCanvas, scale = this._cacheScale, offX = this._cacheOffsetX*scale, offY = this._cacheOffsetY*scale;var w = this._cacheWidth, h = this._cacheHeight, fBounds;if (!cacheCanvas) return;var ctx = cacheCanvas.getContext("2d");w = Math.ceil(w*scale);h = Math.ceil(h*scale);if (w != cacheCanvas.width || h != cacheCanvas.height) {cacheCanvas.width = w;cacheCanvas.height = h;} else if (!compositeOperation) {ctx.clearRect(0, 0, w+1, h+1);}ctx.save();ctx.globalCompositeOperation = compositeOperation;ctx.setTransform(scale, 0, 0, scale, -offX, -offY);this.draw(ctx, true);this._applyFilters();ctx.restore();};

3、copy到真正canvas

    p.drawFromCache = function(ctx) {var cacheCanvas = this.cacheCanvas;if (!cacheCanvas) { return false; }var scale = this._cacheScale, offX = this._cacheOffsetX, offY = this._cacheOffsetY, fBounds;if (fBounds = this._applyFilterBounds(offX, offY, 0, 0)) {offX = fBounds.x;offY = fBounds.y;}ctx.drawImage(cacheCanvas, offX, offY, cacheCanvas.width/scale, cacheCanvas.height/scale);return true;};

?

但是,這樣會引起問題。在Android上運行,可以發現webview native層的內存占用飛漲,關鍵因素就是這個位圖緩存。
雖然矢量圖可能在舞臺上被移除了,但由于JS層和DOM層兩個關聯,導致垃圾回收機制沒有正常發揮。
需要注意的是,在矢量圖被移除的時候,必須在JS側顯式地把臨時canvas置為null

轉載于:https://www.cnblogs.com/kenkofox/p/4624362.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/375790.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/375790.shtml
英文地址,請注明出處:http://en.pswp.cn/news/375790.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ASP.NET MVC 學習第一天

今天開始第一天學習asp.net mvc,寫的不是很好,高手不要噴,希望大家能一起進步學習。 好了,開始學習 新建項目,選擇mvc 4應用程序 接下來選擇基本,視圖引擎當然要選擇Razor,如果在選擇aspx那我們…

python提取字符串中的數字

字符串存儲在string.txt中&#xff0c;將字符串中的數字提取出來&#xff0c;組成心得字符串&#xff0c;并打印輸出。 #!/usr/bin/env python3 fileopen(/home/user/string.txt) file_contextfile.read() i0 string while i < len(file_context):if file_context[i].isdig…

計算機顯示發送報告,Word文檔打不開提示發送錯誤報告的解決方法

經常使用word文檔的人員都會碰到過這種發送錯誤報告情況&#xff0c;既然有這個問題就要查個究竟什么原因造成&#xff0c;才能完美解決&#xff0c;那么今天小編就在這里講解word文檔發送錯誤報告的方法。根本原因是&#xff1a;打開word出現提示word發送錯誤報告的故障其主要…

asp.net mvc 如何在View中獲取Url參數的值

如果url是 /home/index?id3 直接Request就ok。 但是如果路由設定為&#xff1a;{controller}/{action}/{id} url是 /home/index/3 這時想在頁面View中獲取參數id的值&#xff0c;該怎么獲取&#xff1f; 查了下資料好多人都利用Action獲取到參數值后&#xff0c;用Viewdata…

js 控制

js 制動控制 代碼 是 :setInterval(function(){$(".egg").click();},1000); 使用方法&#xff1a;調出瀏覽器放控制臺(console)&#xff0c;一般是按F12&#xff0c;將上述代碼粘貼后回車就可以自動運行了。轉載于:https://www.cnblogs.com/Look_Sun/p/3798903.htm…

python讀取文本文件的三種方法

參考鏈接 python讀取文本文件的內容&#xff0c;有三種方法。 read()、readline()、readlines() read() read()是最簡單的一種方法&#xff0c;一次性讀取文件的所有內容放在一個大字符串中&#xff0c;即內存中。 fileopen(test.txt) try:file_contextfile.read() #file…

圖靈計算機模型意義,圖靈機有什么意義_學習圖靈機模型中遇到的問題

圖靈機意義圖靈提出圖靈機的模型并不是為了同時給出計算機的設計&#xff0c;它的意義我認為有如下幾點&#xff1a;1、它證明了通用計算理論&#xff0c;肯定了計算機實現的可能性&#xff0c;同時它給出了計算機應有的主要架構&#xff1b;2、圖靈機模型引入了讀寫與算法與程…

使用MVVM-Sidekick開發Universal App(一)

終于要邁進Universal的大坑了&#xff0c;還有點小激動呢。 CurrencyExchanger 掌中匯率是我前幾年發布在Windows Phone商店中的一個應用&#xff0c;當時是WP7版本&#xff0c;下載鏈接&#xff1a;http://www.windowsphone.com/zh-cn/store/app/%E6%8E%8C%E4%B8%AD%E6%B1%87%…

NewCode----給定兩個數R和n,輸出R的n次方

參考鏈接 輸入描述: 多組測試用例&#xff0c;請參考例題的輸入處理 輸入每行一個浮點數 R 其中0.0 < R <99.999&#xff0c; 一個整數 n 其中0 < n <25 輸出描述: 輸出R的n次方 輸入例子1: 95.123 12 0.1 1 輸出例子1: 548815620517731830194541.89902534…

如何檢測本計算機耗電量,如何查看電腦耗電量?魯大師查看電腦使用功率的方法...

【www.xinr41319.cn--電腦網絡】查看自己電腦的電源功率有兩大好處&#xff0c;第一知道給臺式電腦配置多大的電源&#xff0c;第二可以精確的算出&#xff0c;一臺電腦&#xff0c;一天一般消耗多少電&#xff0c;那么小編教大家來查看一下自己電腦的功率是多少。我們可以要借…

【轉載】COM小結

原文&#xff1a;http://blog.csdn.net/byxdaz/article/details/6595210 一、Com概念 所謂COM&#xff08;Componet Object Model&#xff0c;組件對象模型&#xff09;&#xff0c;是一種說明如何建立可動態互變組件的規范&#xff0c;此規范提供了為保證能夠互操作&#xff0…

解決Dropbox無法連接的問題

同步共享服務Dropbox從6月18日開始再次遭到封鎖&#xff0c;原因是DNS污染。Dropbox上次在2010年5月曾遭到IP封鎖和網址關鍵字過 濾&#xff0c;2012年5月除文件外鏈功能外其它功能可正常訪問&#xff1b;2014年2月全部功能都可以正常訪問。中國正展開凈網行動&#xff0c;文件…

求任意數的階乘

這是筆試的第二題&#xff0c;求任意數的階乘其實實質也就是大數相乘&#xff0c;很可惜沒有在規定時間內完成這道題&#xff0c;估計這次筆試涼涼。 #include<iostream> using namespace std;int result[200] { 0 }; int N; void fun(int n) {int temp;int i;int carr…

RDLC報表系列一

1、報表項目搭建&#xff1a; 配置好后&#xff0c;單擊Web服務URL:http://lg-20151517ryre/ReportServer 如果電腦系統打開的時候沒有設置密碼的話&#xff0c;此時打開有可能會出現需要登錄名和密碼。如出現此種情況可給Administrator設置密碼。然后刷新當前頁面就可以看大上…

.net 服務器自動執行,自動檢測服務器使用流量并執行命令腳本

#codingutf-8limit_total0# limit_total 上傳下載的流量限制&#xff0c;單位GB&#xff0c;如果不限制就是0&#xff0c;如果限制1T就是1024limit_in0# limit_in 下載的流量限制&#xff0c;單位GB&#xff0c;如果不限制就是0&#xff0c;如果限制1T就是1024limit_out0# limi…

Android APK是否需要預解壓

今天在逛論壇的時候&#xff0c;發現有一個朋友問的問題。其主要目的&#xff0c;是想實現 玩家首次進入游戲的時候&#xff0c;或者新安裝了版本的時候&#xff0c;對APK進行解壓&#xff0c;寫入SD卡。這樣游戲運行過程中&#xff0c;將不會再從APK中讀取資源。 以提高效率。…

C++開發秋招筆試題

第一題&#xff1a; 記得不太清了&#xff0c;湊合看吧&#xff01; 輸入&#xff1a; 第一行&#xff1a;T 表示有T個測試用例 以下N行&#xff1a; 輸入的T個測試用例 測試用例&#xff1a; 每個輸入包含四個輸入&#xff0c;a&#xff0c;b&#xff0c;c&#xff…

ADS-B顯示終端5.9

更改日志 1 更新背景地圖。增加了全國范圍內的VOR電臺、DME、NDB導航臺信息&#xff0c;包含有坐標信息、代碼信息、頻率等內容。 VOR電臺、DME、NDB導航臺信息來自中國民航局公布的航行情況資料匯編。VOR、DME、NDB分別採用不同的圖形繪制&#xff0c;目標均採用淡綠色畫筆…

域名自動跳轉不搭建服務器,寶塔搭建的服務器WEB系統環境如果做域名301跳轉

寶塔搭建的服務器WEB系統環境如果做域名301跳轉今天老蔣遇到一個網友&#xff0c;服務器WEB系統環境是用寶塔搭建的&#xff0c;搭建的網站綁定過WWW域名和不帶WWW域名&#xff0c;他是希望能全部統一到WWW的域名&#xff0c;這里應該是他程序沒有自帶301跳轉&#xff0c;如果是…

求兩個字符串的最長公共子串

給出兩個字符串&#xff0c;求出兩個字符串的最長公共子串 #include<iostream> #include<string> using namespace std; int main() {string a, b;while (cin >> a >> b){if (a.size() > b.size())swap(a, b);string str_m;//存儲最長公共子串for …