Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Android 手写延迟优化(一):利用前缓冲快速上屏

Android 手写延迟优化(一):利用前缓冲快速上屏

原创
作者头像
Kkkiro
修改于 2023-01-02 16:06:20
修改于 2023-01-02 16:06:20
2.4K0
举报
文章被收录于专栏:爬坑之路爬坑之路

背景

虽然 Android 的大屏生态和 iPadOS 相比不怎样,但随着移动互联网进入下半场,卷无可卷之下,各厂商纷纷在大屏生态方面各显神通,在 Android Pad、折叠屏等产品领域推陈出新。

这些设备往往打着生产力工具的卖点,和 iPad 一样配备了手写笔。但这些设备的书写体验却往往差强人意,往往是自家应用能做到及格线以上,第三方 APP 却很难实现像 iPadOS 上顺滑跟手的效果。

为了改善这种情况,Android 开发团队决定亲自上场,为开发者打个样,从两个方面辅助开发者解决这个让人头疼的延迟问题:

  1. 优化视觉反馈延迟
  2. 书写轨迹预测

本篇文章主要介绍视觉反馈延迟优化相关技术。

视觉反馈延迟优化原理

Low latency graphic,直译过来就是低延迟图形,这是 Android 团队提供的辅助开发者快速将用户输入的轨迹绘制到屏幕上的工具库,降低从手写输入到渲染上屏幕这个过程的耗时。

常规的手写笔迹绘制流程,从「获取到输入」到「绘制上屏」,在系统层面需要经过多个步骤的处理。我们知道,Android 采用多缓冲的方式进行渲染,同一时间内一般存在两个缓冲:

  1. 显示缓冲(Display Buffer):这块缓冲里面包含了用户在屏幕上看到图像数据
  2. 渲染缓冲(Rendering Buffer):程序的所有绘制操作并不会直接操作显示缓冲,程序的绘制最终修改的都是渲染缓冲,等整个画面都绘制完,再把渲染缓冲和显示缓冲进行交换,整体上屏。
双缓冲渲染机制
双缓冲渲染机制

这种机制能够有效协调每一帧画面的绘制,保证有流畅的用户体验,也能有效避免因渲染直接上屏导致出现画面出现撕裂的问题。关于渲染的双缓冲机制可以参考官方的 Project Butter

但天底下没有免费的午餐,双缓冲机制的引入带来了延迟:从用户输入到最终绘制上屏至少有一帧的延迟,考虑到过程中的其他操作引入的耗时,实际延迟会更加严重。

前缓冲渲染:直接上屏

https://source.android.com/docs/core/graphics

为了优化双缓冲带来的延迟,低延迟视觉库引入了前缓冲技术,这个技术在双缓冲的基础上,增加了一个前缓冲图层(front buffer layer)。这个前缓冲图层盖在双缓冲图层的前面,它是透明的,且只会显示很短的一段时间。

前缓冲图层和双缓冲图层运作机制
前缓冲图层和双缓冲图层运作机制

应用通过将用户的输入直接绘制到前缓冲上,实现快速上屏,在最短的时间内给到用户视觉上的反馈。由于前缓冲只会显示很短的一段时间,所以实际的操作结果还需要通过原来的方式,固化到双缓冲的图层上,替换前缓冲。

可能有人会问:既然前缓冲能快速上屏,直接用前缓冲图层绘制就行,为什么还需要用双缓冲图层?

答案很简单:前缓冲图层之所以能够快速上屏,是因为它抛弃了双缓冲变成了单缓冲,单缓冲的最大问题在于:进行大范围的画面更新时,会有画面撕裂的问题。

也就是说,低延迟视觉库快速实现上屏这种优化方法生效的前提是:只修改屏幕上很小的一块区域,比如很小的一块区域内的笔画变化。

当用户在进行手写输入时,小块的修改通过前缓冲反馈到屏幕上;而当用户抬起手写笔时,这些输入将汇总交给原有的双缓冲渲染机制,实现固化。

应用

低延迟视觉库提供的前缓冲绘制能力,适用于手写、画画、素描这类修改一小块区域的场景,但不适用于平移、缩放这些修改很大块区域的场景。

在接入低延时视觉库前,需要仔细评估下应用中哪些内容可以渲染到前缓冲图层(常见的就是笔画),哪些内容需要维持在双缓冲图层处理(如大面积的内容更新、平移、缩放)。

接入过程也简单,继承 GLFrontBufferedRenderer.Callback 接口,分别实现绘制前缓冲的操作和绘制双缓冲的操作,即可。

代码语言:text
AI代码解释
复制
val callbacks = object : GLFrontBufferedRenderer.Callback<DATA_TYPE> {
    override fun onDrawFrontBufferedLayer(
        eglManager: EGLManager,
        bufferWidth: Int,
        bufferHeight: Int,
        transform: FloatArray,
        param: DATA_TYPE
    ) {
        // 前缓冲绘制代码
    }

    override fun onDrawDoubleBufferedLayer(
        eglManager: EGLManager,
        bufferWidth: Int,
        bufferHeight: Int,
        transform: FloatArray,
        params: Collection<DATA_TYPE>
    ) {
        // 双缓冲绘制代码
    }
}

val frontBufferRenderer = GLFrontBufferedRenderer(mySurfaceView, callbacks)

// 添加触摸监听,获取动作输入,并将输入转为动作数据交给 frontBufferRenderer
mySurfaceView.setOnTouchListener { v, event ->
            // 需要自行处理 MotionEvent 转换成图形数据的逻辑
            val dataPoint = event.toDATA_TYPE()
                
            when (event.action) {
                MotionEvent.ACTION_DOWN -> {
                    // 直接绘制新的数据到前缓冲层
                    frontBufferRenderer.renderFrontBufferedLayer(dataPoint)
                }

                MotionEvent.ACTION_MOVE -> {
                    // 直接绘制新的数据到前缓冲层
                    frontBufferRenderer.renderFrontBufferedLayer(dataPoint)
                }

                MotionEvent.ACTION_UP -> {
                    // 用户操作完毕,笔画绘制完成,这个时候把过程中所有的数据提交给双缓冲层处理
                    frontBufferRenderer.commit()
                }
                else -> Unit
            }
            true
        }

完整的实例代码可以参考官方仓库中的测试工程,入口界面 FrontBufferedRendererTestActivity

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
7000 字 | 20 图 | 一文带你搭建一套 ELK Stack 日志平台
最近在折腾 ELK 日志平台,它是 Elastic 公司推出的一整套日志收集、分析和展示的解决方案。
悟空聊架构
2022/05/13
9850
7000 字 | 20 图 | 一文带你搭建一套 ELK Stack 日志平台
Docker 入门到实战教程(十二)ELK+Filebeat搭建日志分析系统
一般我们需要进行日志分析场景:直接在日志文件中 grep、awk 就可以获得自己想要的信息。但在规模较大的场景中,此方法效率低下,面临问题包括日志量太大如何归档、文本搜索太慢怎么办、如何多维度查询。需要集中化的日志管理,所有服务器上的日志收集汇总。常见解决思路是建立集中式日志收集系统,将所有节点上的日志统一收集,管理,访问。
小东啊
2020/07/23
4.9K1
Docker 入门到实战教程(十二)ELK+Filebeat搭建日志分析系统
一文轻松搞定ELK日志实时采集分析平台
ELK是三个开源软件的缩写,分别表示:Elasticsearch , Logstash, Kibana , 它们都是开源软件。
一行Java
2022/04/07
3.7K0
一文轻松搞定ELK日志实时采集分析平台
Kubernetes中部署ELK Stack日志收集平台
ELK是Elasticsearch、Logstash、Kibana三大开源框架首字母大写简称。市面上也被称为Elastic Stack。其中Elasticsearch是一个基于Lucene、分布式、通过Restful方式进行交互的近实时搜索平台框架。像类似百度、谷歌这种大数据全文搜索引擎的场景都可以使用Elasticsearch作为底层支持框架,可见Elasticsearch提供的搜索能力确实强大,市面上很多时候我们简称Elasticsearch为es。Logstash是ELK的中央数据流引擎,用于从不同目标(文件/数据存储/MQ)收集的不同格式数据,经过过滤后支持输出到不同目的地(文件/MQ/redis/elasticsearch/kafka等)。Kibana可以将elasticsearch的数据通过友好的页面展示出来,提供实时分析的功能。
没有故事的陈师傅
2021/07/21
1.9K6
Linux安装ELK日志平台(7.5.1)
一般我们需要进行日志分析场景:直接在日志文件中 grep、awk 就可以获得自己想要的信息。但在规模较大也就是日志量多而复杂的场景中,此方法效率低下,面临问题包括日志量太大如何归档、文本搜索太慢怎么办、如何多维度查询。需要集中化的日志管理,所有服务器上的日志收集汇总。常见解决思路是建立集中式日志收集系统,将所有节点上的日志统一收集,管理,访问。
子润先生
2021/07/07
1.9K1
使用Docker快速搭建ELK日志分析平台
Docker是目前非常主流的容器化的虚拟技术,这个虚拟又与VMware或者是Hyper-v搭建的虚拟机不同,虚拟机是在宿主机的内核已经操作系统系统之上在虚拟出一套操作系统,而Docker这种容器化的技术是基于操作系统的namespace直接使用宿主机的操作系统去构建需要隔离的应用,中间省去了再去虚拟化一套操作系统的过程,或许有人会担心使用如果Docker的容器挂掉了之后,数据会丢失的问题,这你大可不必的过多担心,Docker本身实现了数据卷的工程,可以将容器内部的目录挂载到宿主机之上,只要你的宿主机还健康,那么上面的数据就不会丢失.甚至是当你重新创建一个容器之后你将新容器的数据目录也挂载到了之前容器的目录上,数据都可以复用,但我不建议你这样哦~
姜同学
2022/10/27
2.2K0
使用Docker快速搭建ELK日志分析平台
ELK Stack日志中心搭建
本文主要目的是简化搭建ELK环境的步骤,使用Docker Compose部署ELK 7.1.1分布式集群的日志框架,只需要执行一个init.sh脚本即可搭建好一个ELK Stack日志中心。
茶半香初
2021/11/26
6070
ELK Stack日志中心搭建
搭建ELK日志分析平台(上)—— ELK介绍及搭建 Elasticsearch 分布式集群
笔记内容:搭建ELK日志分析平台(上)—— ELK介绍及搭建 Elasticsearch 分布式集群 笔记日期:2018-03-02
端碗吹水
2020/09/23
2.5K0
搭建ELK日志分析平台(上)—— ELK介绍及搭建 Elasticsearch 分布式集群
ELK是什么?
Elastic Stack 是 原 ELK Stack 在 5.0 版本加入 Beats 套件后的新称呼。 Elastic Stack 在最近两年迅速崛起,成为机器数据分析,或者说实时日志处理领域,开源界的第一选择。和传统的日志处理方案相比,Elastic Stack 具有如下几个优点: 处理方式灵活。Elasticsearch 是实时全文索引,不需要像 storm 那样预先编程才能使用; 配置简易上手。Elasticsearch 全部采用 JSON 接口,Logstash 是 Ruby DSL 设计,都是目前业界最通用的配置语法设计; 检索性能高效。虽然每次查询都是实时计算,但是优秀的设计和实现基本可以达到全天数据查询的秒级响应; 集群线性扩展。不管是 Elasticsearch 集群还是 Logstash 集群都是可以线性扩展的; 前端操作炫丽。Kibana 界面上,只需要点击鼠标,就可以完成搜索、聚合功能,生成炫丽的仪表板。
陈不成i
2021/07/05
3960
基于Kafka+ELK搭建海量日志平台
早在传统的单体应用时代,查看日志大都通过SSH客户端登服务器去看,使用较多的命令就是 less 或者 tail。如果服务部署了好几台,就要分别登录到这几台机器上看,等到了分布式和微服务架构流行时代,一个从APP或H5发起的请求除了需要登陆服务器去排查日志,往往还会经过MQ和RPC调用远程到了别的主机继续处理,开发人员定位问题可能还需要根据TraceID或者业务唯一主键去跟踪服务的链路日志,基于传统SSH方式登陆主机查看日志的方式就像图中排查线路的工人一样困难,线上服务器几十上百之多,出了问题难以快速响应,因此需要高效、实时的日志存储和检索平台,ELK就提供这样一套解决方案。
王知无-import_bigdata
2019/07/29
9.3K0
基于Kafka+ELK搭建海量日志平台
ELK日志监控分析系统的探索与实践(一):利用Filebeat监控Springboot日志
由于公司项目较多,所部署服务产生的日志也较多,以往查看服务器日志只能通过xshell、putty等SSH工具分别连接每台服务器,然后进入到各个服务器,执行Linux命令查看日志,这样可能会带来以下问题:
大刚测试开发实战
2022/11/14
3.1K1
ELK日志监控分析系统的探索与实践(一):利用Filebeat监控Springboot日志
分布式日志系统 EFK 的应用实践(一)
在早期的项目中,如果想要在生产环境中通过日志定位业务服务的Bug 或者性能问题,则需要运维人员使用命令挨个服务实例去查询日志文件,这样导致的结果就是排查问题的效率非常低。
aoho求索
2021/09/24
2.1K0
面对成百上千台服务器产生的日志,试试这款轻量级日志搬运神器!
Filebeat是一款轻量级日志采集器,可用于转发和汇总日志与文件。Filebeat内置有多种模块(Nginx、MySQL、Redis、Elasticsearch、Logstash等),可针对常见格式的日志大大简化收集、解析和可视化过程,只需一条命令即可。
macrozheng
2020/08/27
6680
面对成百上千台服务器产生的日志,试试这款轻量级日志搬运神器!
【微服务优化】ELK日志聚合与查询性能提升实战指南
在微服务架构中,由于服务众多、日志格式不统一以及数据量庞大,日志聚合与查询的效率成为了一个巨大的挑战。本文将深入探讨如何通过优化ELK(Elasticsearch、Logstash、Kibana)日志聚合方案,提高日志收集、存储和查询效率,从而提升微服务诊断效率。我们将涵盖日志采集策略、存储优化和查询性能提升,并提供相关的代码示例,帮助开发者在高并发、高频次的微服务环境中高效地进行日志分析和故障排查。
Swift社区
2025/02/22
2201
【微服务优化】ELK日志聚合与查询性能提升实战指南
Kubernetes实战之部署ELK Stack收集平台日志
ELK是Elasticsearch、Logstash、Kibana三大开源框架首字母大写简称。市面上也被成为Elastic Stack。其中Elasticsearch是一个基于Lucene、分布式、通过Restful方式进行交互的近实时搜索平台框架。像类似百度、谷歌这种大数据全文搜索引擎的场景都可以使用Elasticsearch作为底层支持框架,可见Elasticsearch提供的搜索能力确实强大,市面上很多时候我们简称Elasticsearch为es。Logstash是ELK的中央数据流引擎,用于从不同目标(文件/数据存储/MQ)收集的不同格式数据,经过过滤后支持输出到不同目的地(文件/MQ/redis/elasticsearch/kafka等)。Kibana可以将elasticsearch的数据通过友好的页面展示出来,提供实时分析的功能。
没有故事的陈师傅
2019/12/11
5.8K0
基于Elastic Stack的海量日志分析平台实践
随着58集团业务的飞速发展,日志数量也呈现指数级增长。传统的日志处理方案,已不再适用,此时急需一套功能强大、稳定可靠的日志处理系统。
Spark学习技巧
2019/10/24
1.4K0
基于Elastic Stack的海量日志分析平台实践
搭建ELK日志分析平台并收集Nginx日志
一般我们需要进行日志分析场景:直接在日志文件中 grep、awk 就可以获得自己想要的信息。但在规模较大也就是日志量多而复杂的场景中,此方法效率低下,面临问题包括日志量太大如何归档、文本搜索太慢怎么办、如何多维度查询。需要集中化的日志管理,所有服务器上的日志收集汇总。常见解决思路是建立集中式日志收集系统,将所有节点上的日志统一收集,管理,访问。
子润先生
2021/07/08
1K0
一文读懂开源日志管理方案 ELK 和 EFK 的区别
主流的 ELK (Elasticsearch, Logstash, Kibana) 目前已经转变为 EFK (Elasticsearch, Filebeat or Fluentd, Kibana) 比较重,对于容器云的日志方案业内也普遍推荐采用 Fluentd,我们一起来看下从 ELK 到 EFK 发生了哪些变化,与此同时我也推荐大家了解下 Grafana Loki
iMike
2021/01/08
12.5K0
集群日志收集架构ELK
ELK 是elastic公司提供的一套完整的日志收集以及展示的解决方案,是三个产品的首字母缩写,分别是ElasticSearch、Logstash 和 Kibana。
用户7353950
2023/02/23
9000
集群日志收集架构ELK
使用 Docker Compose V2 快速搭建日志分析平台 ELK (Elasticsearch、Logstash 和 Kibana)
ELK的架构有多种,本篇分享使用的架构如图所示: Beats(Filebeat) -> -> Elasticsearch -> Kibana,目前生产环境一天几千万的日志,内存占用大概 10G 左右
易墨
2024/01/21
4.2K1
使用 Docker Compose V2 快速搭建日志分析平台 ELK (Elasticsearch、Logstash 和 Kibana)
推荐阅读
相关推荐
7000 字 | 20 图 | 一文带你搭建一套 ELK Stack 日志平台
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档