當前位置:首頁 » 安卓系統 » 雙緩沖android

雙緩沖android

發布時間: 2022-08-20 15:11:04

① 在android中怎樣用雙緩沖機制實現背景圖片的循環移動

不斷的重繪z這一zhang張背景圖.X的坐標不斷減去一個偏移量 如果背景的x坐標小於0的時候在dang'qian當前背景的weightde的地方繪制新de的背景 ha還是原來的bei'ji背景.新bei'j背景的X坐標為原背景的kua寬度

② 對android中的surfaceview的困惑,雙緩沖區該怎麼理解

  1. 最近開發一款小游戲,需要用到surfaceView,出於效率的考慮,需要使用臟矩形刷新技術。一開始怎麼都不成功,到網上搜了很多有關臟矩形的使用的文章,但總是不懂。後來就只能到google上去搜索英文的相關文章,但是也收獲甚微。後來,直接看Android
    Developers上面的解釋,也是一懂半懂的。

  2. canvas
    = holder.lockCanvas(Rect
    dirty);中定義臟矩形刷新。我的理解是,給定dirty之後,系統會自動把前一個畫布中dirty矩形外的部分拷貝過來,然後把dirty矩形內部留給現在的canvas來繪制。但是在項目的運行中,我發現根本不是這樣的,系統好像不會自動拷貝dirty之外的部分過來,因為我的背景圖片在繪制了一次之後,直接被黑色背景覆蓋了。我查了一下AndroidDevelopers上面有關這個臟矩形的講解,上面這樣介紹:Just
    likelockCanvas()but allows
    specification of a dirty rectangle. Every pixel within that
    rectangle must be written; however pixels outside the dirty
    rectangle will be preserved by the next call to
    lockCanvas()。意思就是說:在矩形內的每一個像素必須都要被寫入,然後dirty矩形外的像素將在下次調用的時候保留。我在想,這個dirty臟矩形是不是為下次的繪圖而准備的?

  3. 後來又仔細想了一會,結合網上的有關surfaceView的雙緩沖實現,我覺得可能問題是這樣的:第一次畫背景是畫在前景幀上,緩沖幀沒有。而第二次畫時,系統把緩沖幀與前景幀調換了,這樣由於之前的緩沖幀裡面沒有畫背景,就導致第二次繪畫中背景沒有畫出來。而第二次繪畫又是使用的臟矩形繪制,將在下一次繪制的時候保留臟矩形之外的部分,導致第三次繪畫時,雖然調出了最開始畫了背景的那一幀,但是臟矩形機制填充了臟矩形之外的部分,導致背景再次被覆蓋。自此,背景徹底從緩沖的兩幀中消失了。

  4. 找到了原因所在,解決就比較好辦了。直接在一開始的時候,調用兩遍繪制背景的函數,這樣保證緩沖的兩幀上面都有背景,那麼之後再用臟矩形,就沒有問題了。

  5. 當然,明白了這些,就不難解釋網上那些閃爍的問題的根源了。只需要在一開始把背景繪制兩遍即可。

  6. 在解決這個問題的過程中,通過所查的資料,以及我單步跟蹤調試,也發現了一個android的隱藏操作:就是在每次定製好臟矩形之後,android系統會自動重置臟矩形的大小尺寸(一般重置為當前整個畫布的大小),所以,為了能夠在下次循環的時候能夠繼續調用之前的臟矩形對象,就需要重置一下臟矩形的大小;或者還有一個辦法,就是直接寫一個函數,這個函數返回一個臟矩形的拷貝給canvas,這樣canvas就只能更改這個拷貝,而不能更改臟矩形對象本身了。

③ android,scrollview顯示多張圖片,滑動緩慢,怎麼解決啊

其實就是一個預先載入的過程,你不要一口氣都載入,當你畫面靜止的時候,偷偷預先載入5-10個view的數據,之所以慢就是因為臨時載入數據多了。理念類似雙緩沖。

④ 我在使用android Rotate3dAnimation的時候旋轉的時候為什麼會出現豎線

可能是有緩沖,android動畫是雙緩沖機制,你可以去掉,試試

⑤ 對android中的surfaceview的困惑,雙緩沖區該怎麼理解

  1. 雙緩沖主要是為了解決 反復局部刷屏帶來的閃爍。把要畫的東西先畫到一個內存區域里,然後整體的一次性畫出來,游戲通常會採用此方式一般游戲里說的雙緩沖防止畫面閃爍,只是每一幀先繪制到bitmap再繪制到SurfaceView的canvas。

  2. .而框架中的Surface的雙緩沖是另一個概念。 事實上不管是View還是SurfaceView都會使用到Surface雙緩沖技術,在4.1以後更是引入了三緩沖。

  3. 部分看到的畫面實際上就是Surface的三緩沖造成的。使用SurfaceView每次lockCanvas獲取到的畫布都是1,2,3個畫布輪流切換。

  4. Surface的多緩沖是系統可以指定的, 4.1以前默認是2個,4.2以後默認是3個,廠商可以修改,最多可以使用32個緩沖區。


⑥ android中的View如何不使用雙緩沖

怪不得沒有人回答,分是少了點,我來說吧
一般使用雙緩沖區的時候,大致都是為了保存什麼,或者隱式的在某些時候顯示什麼東西(比如Invalidate的時候顯示某個圖片)而不影響對此View做其他的什麼事情。換句話說,要想顯示的東西一直在上面,我怎麼刷新也不會丟,或者在上面畫什麼東西,它都能保存,就像有一個隱藏的緩沖區在為我們保存數據,這就是雙緩沖區
知道了它的用處,來解決問題也就不是很難了。比如,你想畫上去一張BMP,當然首先你得有它,然後你不用內存緩沖區來bitblt,你可以直接用cdc.SelectObject 然後直接畫一遍,其他手繪的東西,用一個動態的結構體數組來紀錄保存,然後當OnDraw的時候,把結構體數組裡面的東西全部重繪。當然了,這個結構體數組裡面保存的並不是畫的東西,而是手繪過程中的每一步所作的事情。

⑦ android中對view的更新有幾種方式 多線程和雙緩沖的使用情況

Android中對View的更新有很多種方式,使用時要區分不同的應用場合。最要緊的是分清:多線程和雙緩沖的使用情況。
現在可以嘗試理解下面的模擬場景:

兩個人:一對夫妻,老公上班,老婆在家,現在他們都要吃飯。
「不使用多線程和雙緩沖」的情況是:老公在公司吃,老婆在家吃,互不幹擾,吃就是了。
「使用多線程和不使用雙緩沖」的情況是:老婆做好飯,另外讓人送一份到公司,老公收到飯就可以吃了。
「使用多線程和使用雙緩沖」的情況是:老婆做好飯,等老公回家一起吃。

1.不使用多線程和雙緩沖
這種情況最簡單了,一般只是希望在View發生改變時對UI進行重繪。你只需在Activity中顯式地調用View對象中的invalidate()方法即可。系統會自動調用 View的onDraw()方法。

2.使用多線程和不使用雙緩沖
這種情況需要開啟新的線程,新開的線程就不好訪問View對象了。強行訪問的話會報:android.view.ViewRoot$:Only the original thread that created a view hierarchy can touch its views.
這時候你需要創建一個繼承了android.os.Handler的子類,並重寫handleMessage(Message msg)方法。android.os.Handler是能發送和處理消息的,你需要在Activity中發出更新UI的消息,然後再你的Handler(可以使用匿名內部類)中處理消息(因為匿名內部類可以訪問父類變數, 你可以直接調用View對象中的invalidate()方法 )。也就是說:在新線程創建並發送一個Message,然後再主線程中捕獲、處理該消息。

3.使用多線程和雙緩沖
Android中SurfaceView是View的子類,她同時也實現了雙緩沖。你可以定義一個她的子類並實現SurfaceHolder.Callback介面。由於實現SurfaceHolder.Callback介面,新線程就不需要android.os.Handler幫忙了。SurfaceHolder中lockCanvas()方法可以鎖定畫布,繪制玩新的圖像後調用unlockCanvasAndPost(canvas)解鎖(顯示),還是比較方便得。

熱點內容
五區布魯是什麼伺服器 發布:2025-01-16 06:35:13 瀏覽:864
androidhandler更新ui 發布:2025-01-16 06:21:28 瀏覽:170
java與mvc 發布:2025-01-16 06:20:40 瀏覽:332
lol最新刷金幣腳本 發布:2025-01-16 05:56:22 瀏覽:563
電腦登陸加密 發布:2025-01-16 05:21:57 瀏覽:153
安卓怎麼修復閃退 發布:2025-01-16 05:21:54 瀏覽:554
易盾加密 發布:2025-01-16 05:20:51 瀏覽:895
html上傳圖片的代碼 發布:2025-01-16 05:16:55 瀏覽:601
搭建伺服器租用電信的怎麼樣 發布:2025-01-16 05:12:32 瀏覽:50
phpmysql源碼下載 發布:2025-01-16 05:12:31 瀏覽:212