簡體   English   中英

Android,繪制位圖到畫布的最快方法

[英]Android, fastest way to draw a bitmap to canvas

只是想知道將位圖繪制到畫布的最快方法是什么?

目前我有一個位圖(和繪圖畫布),我用它來緩沖繪圖調用,然后當我繪制到畫布時通過應用1px畫布翻譯有滾動效果。 僅此一項就可以將幀速率從60+ FPS降低到~40,非常受歡迎。 我現在不使用surfaceView(或GLSurfaceView),但只是想知道我是否遺漏任何會提高速度的東西。 onDraw()代碼如下

@Override
    public void onDraw(Canvas canvas)
    {
        //update fps text
        mFpsTracker.frameTouch();

        if(mBufferedBitmap == null)
        {
            mBufferedBitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_4444);
            mBufferedCanvas = new Canvas(mBufferedBitmap);
        }

        paint.setColor(Color.BLUE);
        mBufferedCanvas.drawLine(0, getHeight(), getWidth(), getHeight(), paint);
        mBufferedCanvas.translate(0, -1);


    canvas.drawBitmap(mBufferedBitmap, 0, 0, null); 

    //draw fps
    mTextPaint.setColor(Color.WHITE);
    canvas.drawText(mFpsTracker.getFPSString(), 40, 40, mTextPaint);


    invalidate();       
}

請參閱Romain Guy撰寫的這篇博客文章。

此處提供視頻版本。

不要再使用ARGB_4444了。 它已被棄用。 每個像素僅為每個通道分配4位(因此名稱)。 ARBG_8888提供16,777,216種顏色而不是ARBG_4444的4,096種顏色,但每像素使用4個字節而不是2個字節。

在姜餅,機器人作出ARGB_8888為標准格式表面和每因為它處理增加的存儲器分配。

Window和(假設您使用流線型SurfaceView )SurfaceHolder的格式設置為RGBA_8888更有效 這樣可以避免格式變化明顯變慢。

其他提示包括:

  • 限制alpha合成,因為這需要來自Skia的相對昂貴的混合。
  • 請求位圖選項更喜歡ARGB_8888 配置並禁用抖動。
  • 如果可能,刪除窗口背景
  • 啟用硬件加速,但要注意不受支持的操作

在2.1設備上,我能夠以50 fps的速度在屏幕上繪制至少300個位圖。

我遇到了和你一樣的問題,當你發現一些新的東西時請告訴我。

這是我到目前為止創立的:

  1. 對於Android版本> 3最好不要使用雙緩沖區,因為你正在獲得硬件加速(需要在清單中設置為true)
  2. 設置paint.setDither(true)它會在任何具有不同顏色的設備上更好地工作,然后ARGB_4444,這是大多數設備。 查看此信息以獲取更多信息

在onSizeChange中你可以根據畫布大小調整大小或創建位圖,然后框架繪圖會快60fps左右,但是在無限循環中使用自定義視圖會減慢一些並在某些Android設備上變得跳躍因此我不推薦它。 相反,最好使用SurfaceView。

檢查此示例: 如何在畫布中使用動畫框架?

我認為你可以從畫布中獲得良好的性能..但它需要做很多工作..

如果你從一個性能良好的圖形庫開始,那么即使你遇到很多錯誤,你可能仍然會有很好的表現:) lol

有最快的繪圖庫競爭... libgdx目前正在贏得...

http://code.google.com/p/libgdx/wiki/SimpleApp#Project_Setup

你需要在某處創建你的位圖(例如onCreate或其他地方(構造函數會很好))因為當你做滾動效果時你會一次又一次地創建新的位圖。 所以只需要在構造函數中創建而不是使用此位圖。

當我遇到類似問題時,這對我來說是個很好的解決方案。 嘗試創建這個mBufferedBitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_4444); 在其他沒有無效的地方。 希望它對你有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM