旋轉屏幕優化

1.問題背景

從google原生算法,可以知道其有2個比較大的缺陷:
1) 通過重力傳感器傳來的x,y,z軸的加速度合成之后只有一個垂直往下的加速度,如果此時用戶在別的方向上有加速度,那么通過反余弦、反正切等計算的角度就會不準確,原始的角度計算有問題,就談不上識別正確的方向了。而google在旋轉角度上,并未用代碼進行修正。
2) google拿到方向信息之后,去干擾采取的措施是延遲300-500ms,等徹底沒有干擾的時候再進行方向改變,這個方案很保守。由于普通用戶正常轉屏都會觸發抖動和加速(70%左右都會觸發),這樣就會導致,就算是旋轉角度計算沒有任何問題,也會由于算法導致300-500ms的延遲。

2.優化措施

1.1采集數據時,提高采樣靈敏度

? ? ? ? ?private final float?FILTER_TIME_CONSTANT_MS?= tcl.Features.has("PERF_ROTATION") ? 70.0f : 200.0f;

? ? ? ? ? ? ? ? ? ? //兩次事件間隔,單位是ms,一般默認SENSOR_DELAY_NORMAL時,gsensor上報數據是66.666ms左右

? ? ? ? ? ? ? ? ? ? final?float?timeDeltaMS = (now - then) *?0.000001f;

? ? ? ? ? ? ? ? ? ? final float alpha = timeDeltaMS / (FILTER_TIME_CONSTANT_MS?+ timeDeltaMS);
? ? ? ? ? ? ? ? ? ? x = alpha * (x - mLastFilteredX) + mLastFilteredX;
? ? ? ? ? ? ? ? ? ? y = alpha * (y - mLastFilteredY) + mLastFilteredY;
? ? ? ? ? ? ? ? ? ? z = alpha * (z - mLastFilteredZ) + mLastFilteredZ;

原生FILTER_TIME_CONSTANT_MS為200ms,alpha約為0.25,即xyz的漸變速率是0.25。TCL的漸變速率約為0.49。即TCL計算得到的角度更大,猜測會會導致方向預測更加靈敏。

1.2獲取預測角度時,提高更新頻率

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? tclWindowOrientation.updateTimestamp(orientationAngle, tiltAngle, nearestRotation, mCurrentRotation,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? PROPOSAL_MIN_TIME_SINCE_SWING_ENDED_NANOS, PROPOSAL_MIN_TIME_SINCE_ACCELERATION_ENDED_NANOS,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? now, mSwingTimestampNanos, mAccelerationTimestampNanos, mPredictedRotation,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? mPredictedRotationTimestampNanos);
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? mSwingTimestampNanos = tclWindowOrientation.getSwingTimestampNanos();
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? mAccelerationTimestampNanos = tclWindowOrientation.getAccelerationTimestampNanos();

原生:擺動的更新頻率是300ms,加速度的更新頻率是500ms
?private static final long PROPOSAL_MIN_TIME_SINCE_SWING_ENDED_NANOS = 300 * NANOS_PER_MS;
? ? ? ? ? ? if (now < mSwingTimestampNanos + PROPOSAL_MIN_TIME_SINCE_SWING_ENDED_NANOS) {
? ? ? ? ? ? ? ? return false;
? ? ? ? ? ? }
?private static final long PROPOSAL_MIN_TIME_SINCE_ACCELERATION_ENDED_NANOS =? ?500 * NANOS_PER_MS;

? ? ? ? ? ? if (now < mAccelerationTimestampNanos? ?+ PROPOSAL_MIN_TIME_SINCE_ACCELERATION_ENDED_NANOS) {
? ? ? ? ? ? ? ? return false;
? ? ? ? ? ? }

TCL:擺動的更新頻率是200ms,加速度的更新頻率是400ms,減少了100ms的延遲
?long PROPOSAL_MIN_TIME_ENDED_NANOS = 100 * NANOS_PER_MS;
//簡化后
if (now < mSwingTimestampNanos + PROPOSAL_MIN_TIME_SINCE_SWING_ENDED_NANOS-PROPOSAL_MIN_TIME_ENDED_NANOS) {
? ? ? ? ? ? ? ? ? ? swingNanos = now - minTimeSinceSwing + PROPOSAL_MIN_TIME_ENDED_NANOS;
? ? ? ? ? ? ? ? ? ? accelerationNanos = now - minTimeSinceAcceleration + PROPOSAL_MIN_TIME_ENDED_NANOS;
? ? ? ? ? ? ? ? isSwingTimeChange = false;
? ? ? ? ? ? ? ? isAccelerationTimeChange = false;

1.3預測角度歸一時,提高采樣范圍

? ? ? ? private final int ADJACENT_ORIENTATION_ANGLE_GAP = tcl.Features.has("PERF_ROTATION") ? 30 : 45;

以逆時針相鄰為例??
//0-360度減去22.5度,即(0,1,2,3)-->(-22.5,67.5,157.5,247.5)
int lowerBound = rotation * 90 - 45 + ADJACENT_ORIENTATION_ANGLE_GAP / 2;
//0(豎直向上):(315,360)縮短(337.5,360)
?if (rotation == 0) { if (orientationAngle >= 315 && orientationAngle < lowerBound + 360) { return false; } }
//其他范圍邊際縮小22.5度 ,
else?{?if?(orientationAngle < lowerBound) {?return?false; } }

原生:
//0-360度減去22.5度,即(0,1,2,3)-->(-22.5,67.5,157.5,247.5)
0-->(0,45)&(337.5,360),1-->(67.5,135),2-->(157.5,225),3→(247.5,315)

TCL:多減去7.5度,擴大了采樣范圍
//0-360度減去30度,即(0,1,2,3)-->(30,60,150,250)
0→(0,45)&(330,360),1→(60,135),2→(150,225),3→(240,315)

1.4通知監聽更新時,增加加速度判斷

原生:通過重力傳感器傳來的x,y,z軸的加速度合成之后只有一個垂直往下的加速度,如果此時用戶在別的方向上有加速度,那么通過反余弦、反正切等計算的角度就會不準確,導致最終計算的方向不準。

TCL:

?final float?magnitudeData?= (float) Math.sqrt(x * x + y * y + z * z);

if (isTiltAngleAcceptableLocked(nearestRotation, tiltAngle)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? && (isOrientationAngleAcceptableLocked(nearestRotation, orientationAngle) || (tclWindowOrientation != null && tclWindowOrientation.isRotating()))
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? && (tclWindowOrientation == null ||?magnitudeData < MAX_ACCELERATION_MAGNITUDE) ?//判斷計算的加速度小于可容忍的最大加速度
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?)?

3.方案介紹

3.1流程圖

參考原生屏幕旋轉算法(AccelSensor) - 終端OS部 - Confluence (tclking.com)?中的流程圖

3.2代碼提交

topic:JIRA-SOC15MT6835-19536 | sz.gerrit Code Review (tclcom.com)

4.調試自測

1)查看sensor類型

Goldfinch_TMO:/ # dumpsys ?window|grep Sensor
? ? ? AccelSensorJudge

2)自測用例

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/90229.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/90229.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/90229.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java---day2

七、IDEA開發工具 &#x1f4e6; 一、下載 IntelliJ IDEA 官網地址&#xff1a; &#x1f517; IntelliJ IDEA – the IDE for Pro Java and Kotlin Development 版本選擇&#xff1a; 版本說明Community Edition (CE)免費開源版本&#xff0c;適合 Java、Kotlin、Android…

RAL-2025 | 清華大學數字孿生驅動的機器人視覺導航!VR-Robo:面向視覺機器人導航與運動的現實-模擬-現實框架

作者&#xff1a; Shaoting Zhu, Linzhan Mou, Derun Li, Baijun Ye, Runhan Huang, Hang Zhao單位&#xff1a;清華大學交叉信息研究院&#xff0c;上海期智研究院&#xff0c;Galaxea AI&#xff0c;上海交通大學電子信息與電氣工程學院論文標題&#xff1a;VR-Robo: A Real-…

碰一碰發視頻 + 矩陣系統聚合平臺源碼搭建,支持OEM

隨著短視頻生態與多平臺運營需求的融合&#xff0c;“碰一碰發視頻 矩陣系統” 聚合平臺成為內容創作者與企業營銷的新基建。這類系統需實現近場交互觸發、多平臺內容分發、數據聚合分析的全流程閉環&#xff0c;其源碼搭建與定制開發需突破硬件交互與軟件矩陣的技術壁壘。核心…

緩存雪崩、緩存穿透、緩存預熱、緩存更新、緩存降級

1. 緩存雪崩&#xff08;Cache Avalanche&#xff09;定義&#xff1a;緩存雪崩是指大量緩存中的數據在同一時間過期&#xff0c;導致大量請求同時訪問數據庫&#xff0c;造成數據庫壓力驟增&#xff0c;甚至可能導致數據庫崩潰。原因&#xff1a;多個緩存的 key 在同一時間過期…

【unity實戰】Unity手搓腳本工具實現合并網格功能

注意:考慮到實戰的內容比較多,我將該內容分開,并全部整合放在【unity實戰】專欄里,感興趣的小伙伴可以前往逐一查看學習。 文章目錄 前言實戰1、簡單的合并網格實現2、設置統一的材質3、設置不同的多種材質4、多材質網格合并方案專欄推薦完結前言 有許多單獨的網格對象會影…

ThreadPoolTaskExecutor 的使用案例

ThreadPoolTaskExecutor 的使用案例 1. 依賴說明 <!-- Spring Retry&#xff08;用于任務重試&#xff09; --> <dependency><groupId>org.springframework.retry</groupId><artifactId>spring-retry</artifactId><version>1.3.1<…

0.3mg硝酸甘油舌下片:冠心病預防中的“消防員”

冠狀動脈疾病&#xff08;CAD&#xff09;如同一顆定時炸彈&#xff0c;即使在成功進行血運重建或藥物治療后&#xff0c;心絞痛急性發作的風險依然如影隨形。在冠心病管理的漫長戰役中&#xff0c;二級預防的核心目標不僅僅是延緩疾病進展&#xff0c;更是預防致命性心臟事件復…

【Spring源碼學習系列】基礎架構和環境搭建

一直以來都把精力花在中間件的研究和系統設計上&#xff0c;忽略了離我最近的spring&#xff0c;最近開始學習spring的源碼了&#xff0c;為了學習到成體系的spring知識和提高學習效率&#xff0c;想要找了一本書看&#xff0c;最終選的是郝佳的《Spring源碼深度解析&#xff0…

C++十大排序詳解(包括變種優化)

排序**基礎排序算法**1. **冒泡排序&#xff08;Bubble Sort&#xff09;**冒泡排序優化**1. 提前終止優化&#xff08;標志位優化&#xff09;****原理**&#xff1a;**實現示例**&#xff08;以C為例&#xff09;&#xff1a;**優點**&#xff1a;**2. 雙向冒泡排序&#xff…

React 性能優化實戰:用useTransition解決卡頓問題

文章目錄1. 概述2. 基本原理與語法3. 應用場景3.1 數據密集型界面的更新優化3.2 動態內容切換的平滑過渡3.3 搜索與過濾結果的實時展示4. 與其他相關Hook的對比5. 結合Suspense使用6. 注意事項1. 概述 useTransition Hook 。它允許開發者將一些非緊急的 UI 更新標記為 “過渡更…

基于Rust紅巖題材游戲、汽車控制系統、機器人運動學游戲實例

根據紅巖題材設計的關鍵游戲實例 以下是根據紅巖題材設計的關鍵游戲實例,結合Rust語言特性(如安全并發、ECS架構等)的框架性方案。所有設計均需符合Rust語法規范,實際開發需配合游戲引擎(如Bevy、Amethyst)。 核心系統模塊 // ECS架構示例(Bevy引擎) use bevy::prel…

【ZYNQ Linux開發】BRAM的幾種驅動方式

1 Vivado配置 ? BRAM 的使用方法為使用 AXI BRAM 控制器來控制 BRAM 生成器&#xff0c;Block Design 連接如下&#xff1a; 我這里配置的是真雙端口 RAM&#xff0c;通過 PL 的邏輯對 BRAM 生成器的端口 B 進行寫操作&#xff0c;在 PS 端對端口 A 進行讀。 BRAM 控制…

Flink ClickHouse 連接器數據寫入源碼深度解析

一、引言 在大數據處理的實際應用場景中&#xff0c;數據的高效存儲與處理至關重要。Flink 作為一款強大的流式計算框架&#xff0c;能夠對海量數據進行實時處理&#xff1b;而 ClickHouse 作為高性能的列式數據庫&#xff0c;擅長處理大規模數據分析任務。Flink ClickHouse 連…

OpenCV 人臉分析------面部關鍵點檢測類cv::face::FacemarkLBF

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 使用 Local Binary Features (LBF) 算法進行面部關鍵點檢測&#xff08;facial landmark detection&#xff09;。該算法通過級聯回歸樹預測人臉的…

Netstat高級分析工具:Windows與Linux雙系統兼容的精準篩查利器

Netstat高級分析工具&#xff1a;Windows與Linux雙系統兼容的精準篩查利器在網絡安全運維中&#xff0c;快速識別可疑連接是防御入侵的關鍵一步。本文將介紹一款我本人開發的原創高效的雙系統兼容Netstat信息分析工具&#xff0c;大幅提升惡意連接篩查效率。一、Netstat分析在安…

Bright Data MCP+Trae :快速構建電商導購助手垂直智能體

聲明&#xff1a;本測試報告系作者基于個人興趣及使用場景開展的非專業測評&#xff0c;測試過程中所涉及的方法、數據及結論均為個人觀點&#xff0c;不代表任何官方立場或行業標準。 文章目錄 一、引言1.1 當前AI智能體的趨勢1.2 構建智能體面臨的最大挑戰&#xff1a;數據來…

plantuml用法總結

時序圖 參考 https://blog.csdn.net/vitaviva/article/details/120735745用PlantUML簡化復雜時序圖的秘訣 startuml skin rose actor User as user participant "Component A" as A participant "Component B" as Buser -> A: Request data activate …

基于自研心電芯片國產化手持單導/6導/12導心電解決方案

蘇州唯理作為國內心電芯片國產化廠商&#xff0c;面向家用場景&#xff0c;推出了國產化的手持單導/6導/12導心電儀技術解決方案&#xff0c;可以讓家用心電圖儀成本可控&#xff0c;信號鏈路質量更佳穩定。該方案已在多家客戶中實現批量出貨。唯理科技同樣提供了醫療級的心電圖…

Sass詳解:功能特性、常用方法與最佳實踐

Sass詳解&#xff1a;功能特性、常用方法與最佳實踐 Sass&#xff08;Syntactically Awesome Style Sheets&#xff09;作為CSS預處理器領域的先驅&#xff0c;自2006年由Hampton Catlin創建以來&#xff0c;已成為現代前端開發中不可或缺的工具。它通過引入變量、嵌套、混合宏…

vulnhub靶機滲透:PWNLAB: INIT

一、信息收集1、主機發現2、端口掃描PORT STATE SERVICE VERSION 80/tcp open http Apache httpd 2.4.10 ((Debian))111/tcp open rpcbind 2-4 (RPC #100000)3306/tcp open mysql MySQL 5.5.47-0deb8u151649/tcp open status 1 (RPC #100024)3、目錄掃描&…