在我的應用程序中,我需要繪製一個大型網絡(基本上是用線連接的小盒子),用戶將能夠縮放和平移它。直接在畫布上繪製位圖vs在畫布上
我的第一個選擇是將網絡直接繪製到畫布上,但我認爲效率不是很高,因爲每次發生平移事件時,繪製過程都會重新開始。
所以我嘗試使用一個大的可變位圖並且只畫一次我的整個網絡(或者至少在發生縮放時),並將必要的區域提交到畫布。
我的問題是,由於網絡是相當大的,我得到OOM異常創建位圖時...
我該怎麼辦?直接畫到畫布上?使用幾個較小的位圖?
感謝, Direz
在我的應用程序中,我需要繪製一個大型網絡(基本上是用線連接的小盒子),用戶將能夠縮放和平移它。直接在畫布上繪製位圖vs在畫布上
我的第一個選擇是將網絡直接繪製到畫布上,但我認爲效率不是很高,因爲每次發生平移事件時,繪製過程都會重新開始。
所以我嘗試使用一個大的可變位圖並且只畫一次我的整個網絡(或者至少在發生縮放時),並將必要的區域提交到畫布。
我的問題是,由於網絡是相當大的,我得到OOM異常創建位圖時...
我該怎麼辦?直接畫到畫布上?使用幾個較小的位圖?
感謝, Direz
你可能不會喜歡這個,但如果你所做的只是畫框和線條,畫布的效率會很高。你得到UI滯後還是什麼?
我弄糊塗的一件事是繪製子組件的集合,它們不會變化太大或根本不變成位圖,然後在畫布上渲染(如果在正確的級別上執行縮放/移動並不是那麼昂貴)可以幫助效率。過去我曾嘗試創建一個框架來呈現現有較大圖像的類似瓦片的子集,但沒有取得太大的成功。我做了一些工作,但代碼變得很難看。
哦,也是一個快速測試,看看你正在渲染的組件是否在屏幕創建的矩形內可以爲您節省大量的處理器時間。
謝謝你的幫助 – Direz
我的第一個問題,你是多少精靈你去一次?到目前爲止,屏幕上有許多精靈的最快機制是使用OpenGL,因爲硬件加速。在Android上,我發現這樣做的方式就是使用Google項目上提供的Cocos2d android(不要與ios版本混淆)。你將不得不使用IOS文檔來了解它,但是有一些體面的教程可以開始在線..特別是,這裏有你好的世界模板...... www.wwchchina.com.cn/Blog/p?= 8。它與最新的IOS cocos2d相比已經過時了,但那是可以預料的。我發現,在我的實驗中沒有連接到活動的調試器會話時,程序運行得更快。
如果您想堅持使用您當前的方法,或者上面的方法仍然不夠快,您將不得不試圖挑選任何未在屏幕上顯示的圖形,這意味着形式的一般功能「如果精靈的x和y值超出了可見區域的範圍,不會畫出「這基本上是大多數瓷磚基礎遊戲處理問題的方式。
這聽起來像你正在做手動繪圖,如果你正在做小方塊。我認爲繼續前進並在畫布上繪製更具建議性,但要小心處理精靈數量並避免在可能的情況下發生在幀更新循環上的重迭循環迭代。用繪圖操作最大限度地減少你的小手機是相當容易的。
另一種選擇是將整個位圖一次繪製到內存中,然後使用複製矩形操作將圖像傳輸到屏幕,而不繪製已創建的完整位圖。我認爲copy rect應該是一個快速的操作,但是如果你使用它來畫整個屏幕,看起來好像是過度殺傷,可能也不會工作。
感謝您的意見。關於你最後的消化,我不能在內存中繪製整個位圖,因爲我得到了帶有createbitmap函數的OOM ... – Direz
你可以將網絡分成幾個較小的位圖,但你不能同時擁有網絡的所有部分。只有當用戶平移到該區域時,纔可以創建屏幕外片段。 – Ronnie