旋转屏幕优化

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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、目录扫描&…