[description]
總有些專案的記憶體優化落到camera頭上,從hal1到hal3,永不停歇...以下適用於hal3(android p).
眾所周知,記憶體與performance在某些條件下,是無法調和的矛盾,請大家根據各專案狀態酌情選用.
[solution]
記憶體用量概要:adb shell dumpsys meminfo camerahalserver
記憶體用量大頭(graphics部分)分解:adb shell cat /sys/kernel/debug/ion/ion_mm_heap > ion_1
檢視優化效果,對比優化前後meminfo中的total即可.
那麼會有哪些省記憶體辦法呢?請看下文.
1.拍照後buffer立即釋放
優點:拍照過程中產生的buffer使用完畢後即釋放,不影響拍照後的記憶體用量;
缺點:記憶體存量不高的情況下,拍照速度會受影響;
優化量:與拍照實際feature有關,拍照feature越多占用記憶體越大,優化量越大;
/vendor/mediatek/proprietary/hardware/mtkcam3/feature/core/featurepipe/capture/buffer/capturebufferpool.cpp
mptuningbufferpool->setautofree(0); //拍照後release tuning buffer
pimagepool->setautofree(0);//拍照後release image buffer
【重要提醒】如果使用此優化,務必保證yuvnode.cpp中有如下修改,如無,請申請patch alps04338041.
mtkcam3\feature\core\featurepipe\capture\nodes\yuvnode.cpp
1090: pplgrequest->mibufferfull = (ibufferfullhandle == null) ? pluginhelper::createbuffer(pnodereq, tid_man_full_yuv, input) : std::move(ibufferfullhandle);
1091: pplgrequest->mibufferclean = pluginhelper::createbuffer(pnodereq, tid_man_full_pure_yuv, input);
1092: pplgrequest->mibufferdepth = pluginhelper::createbuffer(pnodereq, tid_man_depth, input);
1093: pplgrequest->mobufferfull = (obufferfullhandle == null) ? pluginhelper::createbuffer(pnodereq, tid_man_full_yuv, output) : std::move(obufferfullhandle);
2.減少zsl buffer number
優點:優化整個camera使用期間的記憶體用量
缺點:如果設定值過小,過載時會影響preview幀率.
優化量:實際減少的buffer資料有關,也與sensor大小有關.
/vendor/mediatek/proprietary/hardware/mtkcam3/pipeline/model/zsl/hbc/historybuffercontainerimp.cpp
3.修改p1node buffer格式(需滿足條件)
使用條件:raw格式在一次configure後不會發生改變. 舉例,4-cell功能以及raw hdr功能均會在使用期間切換raw格式.則不可使用此優化;
優點:p1node輸出buffer格式由blob改為bayer10;
缺點:無法實時做格式轉換;
優化量:與sensor實際大小有關.
/vendor/mediatek/proprietary/hardware/mtkcam3/pipeline/policy/config/p1hwsettingpolicy.cpp
bool islowmem = ::property_get_bool("ro.config.low_ram", false); //強制將islowmem置為true.
如果平台支援ufo,也可使用ufo格式,p1輸出可以有多種格式,格式選擇的邏輯判斷均在p1hwsettingpolicy.cpp中,而各值的對應列表可查閱:
/vendor/mediatek/proprietary/hardware/mtkcam/include/mtkcam/def/imageformat.h
4.提高mfnr的門限,盡量避免使用mfnr,減少mfnr張數
優點:極大的改善記憶體以及cpu 資源的消耗,提公升拍照速度,提公升系統流暢度;
缺點:高光感下的影象噪點略高,影響質量,有些可以通過tuning 其他nr引數彌補回來;
/vendor/mediatek/proprietary/custom/mt***x/hal/inc/camera_custom_nvram.h
muint16 mfll_iso_th // tunning 引數 各家不同 ,預設800;
muint8 capture_frame_number; //mfnr張數,最低3張,預設4張;
對應的引數tunning的同事會較清楚,或者在/vendor/mediatek/proprietary/custom/mt***x/hal/imgsensor/ver1/sensorname 下全搜mfll_iso_th即可.
5.關閉zsl
優點:拍照的buffer不再受preview處理效率的影響,同時節省buffer;
缺點:與hal1上關閉zsd不同的是,關閉zsl僅拍照瞬間畫面略有停頓.而hal1上關閉zsd是整個拍照未完成期間均停頓.
優化量:節省zsl buffer pool的大小,一般會達到100m以上.
control.capture.default.zsl.mode 設為off
control.capture.zsl.mode configure和request時,均需設定為off,否則會出現re-configuresesion的問題,影響啟動時間;
6.拍照相關限制以上是通用法則.還有些可能會用得上的優化點:
8.streaming場景的優化
a)確認p1node輸出的size,等於preview size值. 如若不是,請檢視p1node輸出的size**.邏輯判斷**
/vendor/mediatek/proprietary/hardware/mtkcam3/pipeline/policy/config/p1hwsettingpolicy.cpp
需要注意的是:p1node輸出size大於preview size有助於減輕鋸齒問題,客戶需自行斟酌是否優化此項;
b )確認streaming的三方演算法要求的size<=preview size. 三方演算法所需size可通過下述api設定:
if( musesize ) sel.mibuffermain1.setspecifiedsize(msize)
此修改,除了可優化記憶體外,同樣可提公升三方演算法處理效率,但是需要看三方是否都支援;
總的來說,記憶體相關的優化,與手機狀態強相關,所有的引數均需實驗後方可得出,即使同乙個hw,但不同的os系統,不同的feature,都無法使用同一套優化引數,以上僅僅是提供優化思路與相關引數,具體的數值,請大家多多實驗,在效能與記憶體之前找到專案的平衡點,做到最優.
good luck!
Camera實現差值及cts效能優化
camera如何實現插值 camera cts效能優化 camera是移動裝置非常重要的feature,google對於camera的cts測試中有一些比較嚴格的效能測試,以保證camera程式的使用者使用友好度。camera cts測試中效能相關的有很多很多,基本上所有基本功能都有包含效能超時的驗...
camera驅動電源配置 camera驅動
在手機中,我們常將camera直接稱為sensor。一 sensor的種類 其實這個對於驅動來說基本略知就可以了,處於那種說出來要知道是在說sensor的專業名次這種程度就ok了!一般來說,sensor有兩大類,cmos和ccd。一般來說,ccd的功耗高,拍攝質量高,造價高,他更適合在數位相機或dv...
kvm記憶體優化 記憶體氣球
一 記憶體氣球技術 使用virtio balloon 1 balloon簡介 通常來說,要改變客戶機占用的宿主機記憶體,是要先關閉客戶機,修改啟動時的記憶體配置,然後重啟客戶機才能實現。而記憶體的ballooning 氣球 技術可以在客戶機執行時動態地調整它所占用的宿主機記憶體資源,而不需要關閉客戶...