掃碼慢?QRCode4cj之setHints與decodeWithState完整優(yōu)化指南)
連續(xù)掃碼慢QRCode4cj之setHints與decodeWithState完整優(yōu)化指南【免費(fèi)下載鏈接】qrcode4cj一維碼/二維碼掃描庫(kù)。項(xiàng)目地址: https://gitcode.com/Cangjie-TPC/qrcode4cjQRCode4cj是一個(gè)用倉(cāng)頡語(yǔ)言實(shí)現(xiàn)的開(kāi)源一維碼/二維碼掃描庫(kù)支持 QR、Data Matrix、PDF417、Aztec、EAN/UPC 等十余種條碼的生成與解析。很多開(kāi)發(fā)者在做相機(jī)連續(xù)掃碼時(shí)發(fā)現(xiàn)幀率上不去罪魁禍?zhǔn)淄敲看谓獯a都重復(fù)構(gòu)建解碼器。本文帶你用setHintsdecodeWithState組合拳快速把連續(xù)掃碼性能拉滿(mǎn)。為什么連續(xù)掃碼會(huì)慢MultiFormatReader是掃碼庫(kù)的主入口。如果每幀都調(diào)用不帶狀態(tài)的decode(image)源碼注釋直言不諱這樣做repeatedly 調(diào)用并不高效multi_format_reader.cj——因?yàn)樗看味紩?huì)執(zhí)行一次setHints(空hints)意味著重建解碼器列表重新實(shí)例化 QR、DataMatrix、Aztec、PDF417、一維碼等多個(gè) Reader重復(fù)內(nèi)存分配解碼器內(nèi)部的狀態(tài)對(duì)象反復(fù)分配與釋放GC 壓力增大白白浪費(fèi) CPU連續(xù)掃碼場(chǎng)景下解碼器配置根本不會(huì)變重復(fù)構(gòu)建純屬浪費(fèi)。setHints 做了什么setHints(hints)只調(diào)用一次它會(huì)解析你的 hints 配置按格式精確裝配好解碼器列表并緩存到內(nèi)部狀態(tài)中setHints 實(shí)現(xiàn)提示項(xiàng)DecodeHintType作用性能影響POSSIBLE_FORMATS限定只解碼指定格式??? 大幅減少參與試錯(cuò)的解碼器TRY_HARDER花更多時(shí)間換取更高準(zhǔn)確率解碼更慢但更穩(wěn)ALSO_INVERTED正片失敗后再反色重試一次增加一倍開(kāi)銷(xiāo)救回反色碼CHARACTER_SET指定字符編碼影響解碼正確性PURE_BARCODE純條碼圖像快速通道??? 跳過(guò)檢測(cè)直接提取極快枚舉定義見(jiàn) decode_hint_type.cj。 只掃 QR 碼的場(chǎng)景把POSSIBLE_FORMATS限定為QR_CODE默認(rèn)全格式掃描時(shí)的 6 個(gè)解碼器就能被裁剪到 1 個(gè)。decodeWithState 連續(xù)掃碼最佳姿勢(shì)正確姿勢(shì)是「一次 setHints循環(huán) decodeWithState」var reader: MultiFormatReader MultiFormatReader() var hints: HashMapDecodeHintType, Any HashMapDecodeHintType, Any() hints.put(DecodeHintType.POSSIBLE_FORMATS, Array(BarcodeFormat.QR_CODE)) reader.setHints(hints) // 只做一次 while (frame : camera.nextFrame()) { let bitmap toBinaryBitmap(frame) try { let result reader.decodeWithState(bitmap) // 每幀調(diào)用 showResult(result) } catch (e: Qrcoder4cjNotFoundException) { // 本幀無(wú)碼繼續(xù) } }decodeWithState直接復(fù)用setHints構(gòu)建好的解碼器列表不再重新分配內(nèi)存decodeWithState 實(shí)現(xiàn)。源碼注釋也明確寫(xiě)道連續(xù)掃碼客戶(hù)端使用它相比decode()能獲得large speed increase巨大的速度提升。三個(gè)細(xì)節(jié)別踩坑首次調(diào)用是安全的若readers為空decodeWithState會(huì)自動(dòng)補(bǔ)一次默認(rèn)setHints不會(huì)崩潰改配置要重新 setHintshints 變了就再調(diào)一次setHints解碼器列表會(huì)按新配置重建跨碼切換記得 reset連續(xù)掃不同條碼時(shí)調(diào)用 reset()它會(huì)級(jí)聯(lián)重置每個(gè) Reader 的內(nèi)部狀態(tài)避免上一枚碼殘留的狀態(tài)干擾下一枚。進(jìn)階PURE_BARCODE 極速通道如果圖像已經(jīng)是裁剪好的純條碼例如從預(yù)覽框里摳出來(lái)的區(qū)域QRCodeReader檢測(cè)到PURE_BARCODE提示后會(huì)走extractPureBits快速路徑跳過(guò)耗時(shí)的圖形檢測(cè)qr_code_reader.cj。裁剪預(yù)覽框 該提示是掃碼類(lèi) App 里性?xún)r(jià)比最高的一招。優(yōu)化效果速查清單場(chǎng)景做法收益每幀調(diào)用decode()不帶狀態(tài)改為setHints一次 decodeWithState循環(huán)消除重復(fù)構(gòu)建開(kāi)銷(xiāo)幀率顯著提升只掃單一格式配置POSSIBLE_FORMATS解碼器列表從 6 個(gè)減到 1~2 個(gè)掃描失敗率可接受不要默認(rèn)開(kāi)TRY_HARDER保速度反色條碼按需開(kāi)ALSO_INVERTED以雙倍開(kāi)銷(xiāo)換魯棒性已裁剪的純條碼圖加PURE_BARCODE跳過(guò)檢測(cè)解碼飛快相關(guān)源碼路徑多格式讀者核心src/common/reader/multi_format_reader.cj解碼提示枚舉src/common/decode_hint_type.cjReader 接口定義src/common/reader.cj官方 API 文檔MultiFormatReader 部分doc/feature_api.md一句話(huà)總結(jié)連續(xù)掃碼性能慢多半是解碼器在每幀重建。用setHints配置一次、decodeWithState復(fù)用狀態(tài)再配合POSSIBLE_FORMATS裁剪解碼器就能讓 QRCode4cj 的連續(xù)掃碼又穩(wěn)又快?!久赓M(fèi)下載鏈接】qrcode4cj一維碼/二維碼掃描庫(kù)。項(xiàng)目地址: https://gitcode.com/Cangjie-TPC/qrcode4cj創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考