我完全理解“過早的優化是萬惡之源”。但是,我已經到了一個地步,我認為我想做的優化不能再被認為是“過早的”。我正在編寫一個 Android 應用程序,除其他外,它從 USB 設備流式傳輸實時圖像提要,使用 OpenCV 執行一些圖像處理,將幀轉換為位圖,然后將該位圖實時渲染到 SurfaceView。我讓一切正常,(實時提要正確呈現到 SurfaceView)并且 Android Studio 的“Profiler”工具表明我已經很好地完成了內存管理(請注意,垃圾收集器不會在下面顯示的 10 秒內運行一次) :但是,因為我流式傳輸的圖像分辨率較低 (320x180),當我將它直接渲染到 SurfaceView 時,它實際上最終在設備屏幕上非常小。因此,我決定在將位圖渲染到屏幕之前將位圖縮放到適合 SurfaceView 的最大尺寸。然而,在這樣做之后,我驚恐地發現內存使用圖現在看起來很可怕?。ɡ占髅棵脒\行不止一次!)以下是相關的代碼片段:在縮放位圖之前(清理內存圖):canvas = getHolder().lockCanvas();openCvMat = frameQueue.take();Utils.matToBitmap(openCvMat, bitmapFromMat);mat.release();canvas.drawColor(Color.BLACK);canvas.drawBitmap(bitmapFromMat, 0, 0, null);getHolder().unlockCanvasAndPost(canvas);縮放位圖后(可怕的內存圖):canvas = getHolder().lockCanvas();openCvMat = frameQueue.take();Utils.matToBitmap(openCvMat, bitmapFromMat);mat.release();canvas.drawColor(Color.BLACK);Bitmap scaled = scaleBitmapToViewport(bitmapFromMat);canvas.drawBitmap(scaled, 0, 0, null);scaled.recycle();getHolder().unlockCanvasAndPost(canvas);scaleBitmapToViewport()方法:private Bitmap scaleBitmapToViewport(Bitmap bitmap){ //Landscape if((canvas.getHeight() * aspectRatio) < canvas.getWidth()) { return Bitmap.createScaledBitmap(bitmap, (int) Math.round(canvas.getHeight() * aspectRatio), canvas.getHeight(), true); } else //Portrait { return Bitmap.createScaledBitmap(bitmap, canvas.getWidth(), (int) Math.round(canvas.getWidth() / aspectRatio), true); }}所以這似乎Bitmap.createScaledBitmap()是罪魁禍首。有誰知道另一種方法來完成同樣的事情,而不是讓垃圾收集器賺錢?
1 回答

千萬里不及你
TA貢獻1784條經驗 獲得超9個贊
而不是像你正在做的那樣縮放位圖本身 - 你不能在繪圖時縮放嗎?
我正在查看canvas.drawBitmap(位圖位圖、Rect src、Rect dst、Paint paint)——請注意,它采用源矩形和目標矩形。
您需要將源設置為您的(?。﹫D像尺寸,將目標設置為表面尺寸。
添加回答
舉報
0/150
提交
取消