[英]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更有效 。 這樣可以避免格式變化明顯變慢。
其他提示包括:
在2.1設備上,我能夠以50 fps的速度在屏幕上繪制至少300個位圖。
我遇到了和你一樣的問題,當你發現一些新的東西時請告訴我。
這是我到目前為止創立的:
在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.