CN117909070A - 信息传输方法、电子设备、存储介质和芯片系统 - Google Patents

信息传输方法、电子设备、存储介质和芯片系统 Download PDF

Info

Publication number
CN117909070A
CN117909070A CN202410024038.6A CN202410024038A CN117909070A CN 117909070 A CN117909070 A CN 117909070A CN 202410024038 A CN202410024038 A CN 202410024038A CN 117909070 A CN117909070 A CN 117909070A
Authority
CN
China
Prior art keywords
thread
window information
sub
function
information
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
CN202410024038.6A
Other languages
English (en)
Inventor
杨祖堤
郭到鑫
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Honor Device Co Ltd
Original Assignee
Honor Device Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Honor Device Co Ltd filed Critical Honor Device Co Ltd
Priority to CN202410024038.6A priority Critical patent/CN117909070A/zh
Publication of CN117909070A publication Critical patent/CN117909070A/zh
Pending legal-status Critical Current

Links

Landscapes

  • User Interface Of Digital Computer (AREA)

Abstract

本申请公开了一种信息发送方法、电子设备和存储介质,属于计算机技术领域。该方法包括:第一进程的主线程创建第一子线程和第二子线程,第一子线程能够被主线程通过第一函数调用且不能被主线程通过除第一函数之外的其他函数调用,第二子线程能够被主线程通过除第一函数之外的第二函数调用,第一函数和第二函数中的一个用于向第二进程发送窗口信息,另一个用于指示第二进程释放缓冲空间。主线程运行第一函数以将第一目标信息传递给第一子线程。第一子线程接收到第一目标信息后向第二进程发送第一目标信息。在本申请中,第一函数和第二函数中的一个函数的异常状态不会影响到另一个函数的运行,可避免因第一函数或第二函数的异常状态而造成性能问题。

Description

信息传输方法、电子设备、存储介质和芯片系统
本申请是分案申请,原申请的申请号是202310617998.9,原申请日是2023年05月29日,原申请的全部内容通过引用结合在本申请中。
技术领域
本申请涉及计算机技术领域,特别涉及一种信息发送方法、电子设备和存储介质。
背景技术
随着计算机技术的发展,诸如手机、平板电脑等电子设备已经成为人们日常生活中不可或缺的一部分。电子设备的屏幕上可以显示各种应用程序的窗口,为用户带来良好的视觉和操作体验。
目前,电子设备中不同进程之间可以通过跨进程通信来传输窗口信息。然而,当一个进程中用于向其他进程发送窗口信息的函数陷入异常状态时,会影响这个进程中其他函数的运行,造成性能问题。
发明内容
本申请提供了一种信息发送方法、电子设备和存储介质,可以避免因第一函数的异常状态而造成性能问题。所述技术方案如下:
第一方面,提供了一种信息发送方法。在该方法中,第一进程的主线程创建第一子线程和第二子线程。该主线程运行第一函数,以将第一目标信息传递给第一子线程。第一子线程接收到该主线程传递的第一目标信息后,向第二进程发送第一目标信息。
第一进程是能够获取窗口信息的进程。比如,第一进程可以为SurfaceFlinger进程,当然,第一进程也可以为其他能够获取窗口信息的进程。
第一子线程能够被该主线程通过第一函数调用,且不能被该主线程通过除第一函数之外的其他函数调用。这种情况下,第一子线程用于单独执行第一函数的发送任务。该主线程仅在运行第一函数时能够调用第一子线程来执行发送任务,该主线程在运行其他函数时不能调用第一子线程。
第二子线程能够被该主线程通过除第一函数之外的第二函数调用。这种情况下,第二子线程用于执行第二函数的发送任务。该主线程在运行第二函数时能够调用第二子线程来执行发送任务。可选地,第二子线程不能被该主线程通过除第二函数之外的其他函数调用,这种情况下,第二子线程用于单独执行第二函数的发送任务;或者,第二子线程能够被该主线程通过除第一函数和第二函数之外的其他函数调用,这种情况下,第二子线程是串行执行多个函数中每个函数的发送任务。
该主线程至少能够运行第一函数和第二函数,第一函数和第二函数中的一个用于向第二进程发送窗口信息,另一个用于指示第二进程释放缓冲空间。第二进程为除第一进程之外的进程。第一函数和第二函数对应的第二进程可以相同,也可以不同。比如,第一函数可以为updateInputFlinger函数,第二函数可以为ReleaseBuffer函数,这种情况下,第一函数对应的第二进程为需要窗口信息的进程,第二函数对应的第二进程为需要释放缓冲空间的进程;或者,第一函数可以为ReleaseBuffer函数,第二函数可以为updateInputFlinger函数,这种情况下,第一函数对应的第二进程为需要释放缓冲空间的进程,第二函数对应的第二进程为需要窗口信息的进程。示例地,需要窗口信息的进程可以为SystemServer进程,SystemServer进程包括InputDispatcher线程,InputDispatcher线程可根据窗口信息进行触摸事件的分发。
第一目标信息是第一函数需要向第二进程发送的信息。比如,若第一函数用于向第二进程发送窗口信息,则第一目标信息为目标窗口信息。或者,若第一函数用于指示第二进程释放缓冲空间,则第一目标信息为缓冲空间释放信息。其中,目标窗口信息可以是电子设备显示的部分或全部窗口的窗口信息。
在本申请中,该主线程通过运行第一函数可以调用第一子线程来执行发送任务,该主线程通过运行第二函数可以调用第二子线程来执行发送任务。第一子线程和第二子线程的运行互不影响,因而第一函数和第二函数中的一个函数的异常状态不会影响到另一个函数的运行,从而可以避免因第一函数或第二函数的异常状态而造成性能问题。
可选地,第一函数用于向第二进程发送窗口信息,第一目标信息为目标窗口信息。该主线程运行第一函数以执行如下操作:获取当前窗口信息;根据当前窗口信息确定目标窗口信息,目标窗口信息为当前窗口信息中除包含预设窗口类型的窗口信息之外的其他窗口信息;若根据当前窗口信息确定窗口发生变化,则根据目标窗口信息调用第一子线程,以将目标窗口信息传递给所述第一子线程。
示例地,预设窗口类型可以为用户在屏幕上无法直接操作的窗口的窗口类型,如预设窗口类型可以包括不可见窗口类型、非输入通道窗口类型等窗口类型中的一个或多个。
在本申请中,第一函数向第二进程发送的目标窗口信息是对当前窗口信息进行筛选得到的,经过筛选,极大的减少了需要向第二进程发送的窗口信息的数据量,从而优化了负载情况,可以在一定程度上避免出现稳定性问题。
可选地,第一函数用于向第二进程发送窗口信息,第一目标信息为目标窗口信息,第一子线程接收到主线程传递的第一目标信息后,向第二进程发送第一目标信息的操作可以为:第一子线程接收到该主线程传递的目标窗口信息后,确定接收到目标窗口信息的时刻与上一次向第二进程发送窗口信息的时刻之间的时间间隔;根据该时间间隔向第二进程发送目标窗口信息。
在本申请中,第一子线程可以根据接收到目标窗口信息的时刻与上一次向第二进程发送窗口信息的时刻之间的时间间隔向第二进程发送目标窗口信息,以期达到降低窗口信息的发送频率的目的。
其中,第一子线程根据该时间间隔向第二进程发送目标窗口信息的操作可以为:第一子线程在该时间间隔大于或等于第一时长的情况下向第二进程发送目标窗口信息;在该时间间隔小于第一时长的情况下,若在接收到目标窗口信息后的第一时长内未接收到下一条窗口信息,则向第二进程发送目标窗口信息。
第一时长大于显示屏的帧间隔时间。可选地,第一时长还可以小于或等于m倍的帧间隔时间,m大于1,如m可以为2、3等。
在本申请中,第一子线程接收到目标窗口信息后,是在接收到目标窗口信息的时刻与上一次发送窗口信息的时刻之间的时间间隔大于显示屏的帧间隔时间的情况下才向第二进程发送目标窗口信息,如此,可以实现隔帧发送窗口信息,从而降低了窗口信息的发送频率,优化了负载情况,可以避免出现稳定性问题。
需说明的是,在第一时长大于m-1倍的帧时间间隔且小于或等于m倍的帧时间间隔的情况下,第一子线程每次至少间隔m-1个图像帧向第二进程发送一次窗口信息。比如,在第一时长大于帧间隔时间且小于或等于2倍的帧间隔时间的情况下,第一子线程每次至少间隔一个图像帧向第二进程发送一次窗口信息。
进一步地,第一子线程在该时间间隔小于第一时长的情况下,若在接收到目标窗口信息后的第一时长内未接收到下一条窗口信息,则向第二进程发送目标窗口信息。这种情况下,由于第一时长大于帧间隔时间,所以第一子线程是至少间隔该帧间隔时间向第二进程发送一次窗口信息,从而降低了窗口信息的发送频率,优化了负载情况,可以避免出现稳定性问题。
可选地,第一子线程接收到目标窗口信息后,可以在接收到目标窗口信息的时刻与上一次向第二进程发送窗口信息的时刻之间的时间间隔小于第一时长的情况下,将目标窗口信息存储至任务队列,并等待第一时长。之后,第一子线程若在接收到目标窗口信息后的第一时长内未接收到下一条窗口信息,则向第二进程发送该任务队列中的目标窗口信息;第一子线程若在接收到目标窗口信息后的第一时长内接收到下一条窗口信息,则丢弃该任务队列中的目标窗口信息,并向第二进程发送该下一条窗口信息。
可以理解的,该任务队列中的窗口信息为第一子线程已接收且尚未向第二进程发送的窗口信息。这种情况下,第一子线程接收到该主线程传递的目标窗口信息后,可以先确定该任务队列中是否存在窗口信息。若该任务队列中存在窗口信息,表明目标窗口信息与上一次向第二进程发送的窗口信息之间至少间隔了该任务队列中存在的窗口信息,即表明第一子线程接收到目标窗口信息的时刻与上一次向第二进程发送窗口信息的时刻之间的时间间隔至少大于帧时间间隔,因而第一子线程可以丢弃该任务队列中的窗口信息,并向第二进程发送目标窗口信息。而若该任务队列中不存在窗口信息,则可以确定接收到目标窗口信息的时刻与上一次向第二进程发送窗口信息的时刻之间的时间间隔,根据该时间间隔向第二进程发送目标窗口信息。如此,通过该任务队列可以实现对是否可发送目标窗口信息的快速判断。
可选地,该主线程若接收到第一消息,则将目标变量设置为第一变量值,第一消息用于指示应用程序的启动退出动效开始;该主线程若接收到第二消息,则将目标变量设置为第二变量值,第二消息用于指示该启动退出动效结束。
这种情况下,第一子线程接收到该主线程传递的目标窗口信息后,若确定目标变量为第二变量值,则向第二进程发送目标窗口信息;若确定目标变量为第一变量值,则可以确定接收到目标窗口信息的时刻与上一次向第二进程发送窗口信息的时刻之间的时间间隔,根据该时间间隔向第二进程发送目标窗口信息。
在本申请中,可以在应用程序处于启动退出动效的过程中实现隔帧发送窗口信息的降负载方案,该启动退出动效是指应用程序启动或退出时的动效。由于应用程序处于启动退出动效时大概率不会出现对窗口的操作,所以这种场景下隔帧发送窗口信息不会对用户操作造成影响。
可选地,该主线程若接收到第一消息,则将目标变量设置为第一变量值的操作可以为:该主线程若接收到第一消息且确定显示屏的刷新率大于或等于预设刷新率,则将目标变量设置为第一变量值。
在本申请中,可以在应用程序处于启动退出动效且显示屏的刷新率大于或等于预设刷新率时实现隔帧发送窗口信息的降负载方案。预设刷新率可以预先进行设置,且预设刷新率可以设置的较大,比如,预设刷新率可以为90Hz、120Hz等。由于显示屏的刷新率大于或等于预设刷新率,即显示屏的刷新率较高,所以在这种场景下隔帧发送窗口信息不会造成卡顿。
可选地,该主线程在将目标变量设置为第一变量值后的第二时长内若未接收到第二消息,则将目标变量设置为第二变量值。
若该主线程在将目标变量设置为第一变量值后的第二时长内未接收到第二消息,说明降负载方案的生效时间已经达到第二时长,即该降负载方案的生效时间已经过长,这种情况下该主线程还未接收到第二消息,说明可能是出现了一些错误,因而在此情况下该主线程可以主动关闭该降负载方案,即该主线程可以将目标变量设置为第二变量值,可选地,在此情况下该主线程还可以打印日志,以便技术人员可以根据日志及时确认异常情况。
可选地,第一子线程向第二进程发送第一目标信息的操作可以为:第一子线程通过binder驱动向第二进程发送第一目标信息。
具体来讲,第一子线程可以将第一目标信息携带于binder消息中发送给binder驱动。binder驱动接收到该binder消息后,可以将该binder消息发送至第二进程的binder线程池中的binder线程进行处理,可选地,该binder线程可以将该binder消息中的第一目标信息传递给第二进程中的其他线程进行处理。比如,第一目标信息为目标窗口信息,第二进程可以为SystemServer进程,SystemServer进程包括InputDispatcher线程,SystemServer进程中的binder线程接收到binder驱动发送的binder消息后,可以将该binder消息中的目标窗口信息传递给InputDispatcher线程,InputDispatcher线程可以根据目标窗口信息进行触摸事件的分发。
第二方面,提供了一种信息发送方法。在该方法中,SurfaceFlinger进程的主线程创建第三子线程,第三子线程能够被该主线程通过updateInputFlinger函数调用。该主线程运行updateInputFlinger函数,以执行操作:获取当前窗口信息,根据当前窗口信息确定目标窗口信息,将目标窗口信息传递给第三子线程,目标窗口信息为当前窗口信息中除包含预设窗口类型的窗口信息之外的其他窗口信息。第三子线程接收到主线程传递的目标窗口信息后,向第二进程发送目标窗口信息。
示例地,第三子线程可以为上文所述的第一子线程或第二子线程。或者,第三子线程能够被该主线程通过ReleaseBuffer函数调用,也即,第三子线程能够串行执行updateInputFlinger函数和ReleaseBuffer函数的发送任务。
预设窗口类型可以预先进行设置,如可以由技术人员根据相关需求进行预先设置。示例地,预设窗口类型可以为用户在屏幕上无法直接操作的窗口的窗口类型,如预设窗口类型可以包括不可见窗口类型、非输入通道窗口类型等窗口类型中的一个或多个。
在本申请中,updateInputFlinger函数向第二进程发送的目标窗口信息是对当前窗口信息进行筛选得到的,经过筛选,极大的减少了需要向第二进程发送的窗口信息的数据量,从而优化了负载情况,可以在一定程度上避免出现稳定性问题。
可选地,该主线程运行updateInputFlinger函数时,可以在获取到目标窗口信息后直接根据目标窗口信息调用第三子线程,以将目标窗口信息传递给第三子线程。或者,该主线程运行updateInputFlinger函数时,可以在获取到目标窗口信息后,在根据当前窗口信息确定窗口发生变化的情况下再根据目标窗口信息调用第三子线程,以将目标窗口信息传递给第三子线程。也即,可以在窗口发生变化时再调用第三子线程向第二进程发送目标窗口信息,如此,可以降低窗口信息的发送频率,优化负载情况,避免出现稳定性问题。
第三方面,提供了一种电子设备,所述电子设备的结构中包括处理器和存储器,所述存储器用于存储支持电子设备执行上述第一方面或第二方面所提供的信息发送方法的程序,以及存储用于实现上述第一方面或第二方面所述的信息发送方法所涉及的数据。所述处理器被配置为用于执行所述存储器中存储的程序。所述电子设备还可以包括通信总线,所述通信总线用于在所述处理器与所述存储器之间建立连接。
第四方面,提供了一种计算机可读存储介质,所述计算机可读存储介质中存储有指令,当其在计算机上运行时,使得计算机执行上述第一方面或第二方面所述的信息发送方法。
第五方面,提供了一种包含指令的计算机程序产品,当其在计算机上运行时,使得计算机执行上述第一方面或第二方面所述的信息发送方法。
上述第三方面、第四方面、第五方面所获得的技术效果与上述第一方面或第二方面中对应的技术手段获得的技术效果近似,在这里不再赘述。
附图说明
图1是本申请实施例提供的第一种线程状态示意图;
图2是本申请实施例提供的第二种线程状态示意图;
图3是本申请实施例提供的第三种线程状态示意图和日志记录的示意图;
图4是本申请实施例提供的一种电子设备的结构示意图;
图5是本申请实施例提供的一种电子设备的软件系统的框图;
图6是本申请实施例提供的第一种信息发送方法的流程图;
图7是本申请实施例提供的第二种信息发送方法的流程图;
图8是本申请实施例提供的第四种线程状态示意图;
图9是本申请实施例提供的一种发送窗口信息的示意图;
图10是本申请实施例提供的第五种线程状态示意图;
图11是本申请实施例提供的第三种信息发送方法的流程图;
图12是本申请实施例提供的第四种信息发送方法的流程图。
具体实施方式
为使本申请的目的、技术方案和优点更加清楚,下面将结合附图对本申请的实施方式作进一步地详细描述。
应当理解的是,本申请提及的“多个”是指两个或两个以上。在本申请的描述中,除非另有说明,“/”表示或的意思,比如,A/B可以表示A或B;本文中的“和/或”仅仅是一种描述关联对象的关联关系,表示可以存在三种关系,比如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。另外,为了便于清楚描述本申请的技术方案,采用了“第一”、“第二”等字样对功能和作用基本相同的相同项或相似项进行区分。本领域技术人员可以理解“第一”、“第二”等字样并不对数量和执行次序进行限定,并且“第一”、“第二”等字样也并不限定一定不同。
在本申请中描述的“一个实施例”或“一些实施例”等语句意味着在本申请的一个或多个实施例中包括该实施例描述的特定特征、结构或特点。由此,在本申请中的不同之处出现的“在一个实施例中”、“在一些实施例中”、“在其他一些实施例中”、“在另外一些实施例中”等语句不是必然都参考相同的实施例,而是意味着“一个或多个但不是所有的实施例”,除非是以其他方式另外特别强调。此外,术语“包括”、“包含”、“具有”及它们的变形都意味着“包括但不限于”,除非是以其他方式另外特别强调。
在对本申请实施例进行详细的解释说明之前,先对本申请实施例的应用场景予以说明。
随着各种应用程序的不断普及,可以在诸如手机、平板电脑等电子设备的屏幕上显示多种应用程序的窗口,为用户带来了良好的视觉和操作体验。
目前,电子设备中运行的一些线程需要获取电子设备当前的窗口信息,以据此实现相关处理。比如,在电子设备的触摸事件(即touch事件)的处理过程中主要涉及电子设备中运行的InputReander线程和InputDispatcher线程,其中,触摸事件包括但不限于点击事件、滑动事件等。在用户触摸电子设备的屏幕后,InputReander线程可以读取触摸事件,随后通知InputDispatcher线程进行触摸事件分发。InputDispatcher线程在进行触摸事件分发时,可以先根据窗口信息和触摸事件的位置确定触摸事件对应的窗口,然后将触摸事件分发给对应的窗口。可见,在触摸事件的处理过程中,InputDispatcher线程对窗口信息的获取是非常重要的。
相关技术中,电子设备中运行有SurfaceFlinger进程,SurfaceFlinger进程中运行有updateInputFlinger函数,updateInputFlinger函数用于获取电子设备当前的窗口信息,并将窗口信息同步给InputDispatcher线程,InputDispatcher线程运行在SystemServer(系统服务)进程中。其中,SurfaceFlinger进程可以通过异步binder通信的方式来完成窗口信息的同步。具体来讲,SurfaceFlinger进程通过运行updateInputFlinger函数,可以将携带有窗口信息的binder消息通过binder驱动发送给SystemServer进程的binder线程池中的binder线程,binder线程会将窗口信息传递给InputDispatcher线程。
比如,在图1所示的线程状态示意图中,SurfaceFlinger进程中的surfaceflinger线程中运行有updateInputFlinger函数,surfaceflinger线程通过运行updateInputFlinger函数,可以将携带有窗口信息的binder消息通过binder驱动发送给SystemServer进程中的binder线程,binder线程会将窗口信息传递给InputDispatcher线程。
然而,这种方式会存在以下两方面的问题:
一方面,SurfaceFlinger进程中除了运行有updateInputFlinger函数之外还运行有其他函数,包括但不限于ReleaseBuffer函数等,ReleaseBuffer函数的主要作用是释放已经使用完的缓冲空间(即buffer)以供下一次使用。SurfaceFlinger进程中运行的所有函数会调用同一子线程来执行发送任务。比如,SurfaceFlinger进程通过运行updateInputFlinger函数可以在获取到窗口信息后调用子线程来将该窗口信息发送给InputDispatcher线程,并且,SurfaceFlinger进程通过运行ReleaseBuffer函数也可以调用该子线程来发送信息。这种情况下,若updateInputFlinger函数陷入异常状态,则会影响ReleaseBuffer函数的运行,造成性能问题。
比如,在如图2所示的线程状态示意图中,SurfaceFlinger进程在运行updateInputFlinger函数和ReleaseBuffer函数时均调用子线程“surfaceflinger2773”执行发送任务,且子线程“surfaceflinger2773”是串行执行updateInputFlinger函数的发送任务和ReleaseBuffer函数的发送任务。这种情况下,若子线程“surfaceflinger2773”在执行updateInputFlinger函数的发送任务的过程中出现异常状态,如出现了Uninterruptible sleep(D)状态,则会导致updateInputFlinger函数的发送任务的执行时间较长,从而导致ReleaseBuffer函数的发送任务延后,长时间无法执行。这会影响buffer的释放,导致buffer堆积,其他线程长时间无法拿到buffer将会造成性能问题。
另一方面,updateInputFlinger函数在同步窗口信息时是将电子设备当前的所有窗口信息,包括可见窗口的窗口信息和不可见窗口的窗口信息均进行同步,这会导致单次同步的窗口信息的数据量较大,也就导致单个binder消息的数据量较大,从而导致稳定性问题。比如,在updateInputFlinger函数需要将窗口信息同步给InputDispatcher线程的情况下,一旦某次updateInputFlinger函数的运行时间较长,将会导致binder消息的堆积。由于SystemServer进程的binder线程池的大小是有限的,而SystemServer进程本身也需要大量的通信,所以在单个binder消息的数据量较大的情况下,当大量堆积的binder消息在短时间内涌入SystemServer进程的binder线程池,会将SystemServer进程的binder线程池占满甚至直接卡死,造成稳定性问题。
比如,在如图3中的(a)图所示的线程状态示意图中,SystemServer进程的binder线程池包括binder线程“binder2798”和binder线程“binder3802”。SurfaceFlinger进程通过运行updateInputFlinger函数调用子线程“surfaceflinger2773”执行发送任务,其中,子线程“surfaceflinger2773”可以将携带有窗口信息的binder消息通过binder驱动发送给SystemServer进程中的binder线程进行处理。这种情况下,若某个binder消息的处理时间较长,则会导致binder驱动接收到的binder消息堆积,比如,如图3中的(a)图所示,子线程“surfaceflinger2773”将binder消息A发送给binder驱动,binder驱动将binder消息A发送给binder线程“binder3802”进行处理,在binder消息A的处理过程中子线程“surfaceflinger2773”将binder消息B发送给binder驱动,则在binder消息A处理结束后binder驱动可以将binder消息B继续发送给binder线程“binder3802”进行处理。而binder消息B的处理时间较长,在binder消息B的处理过程中子线程“surfaceflinger2773”将大量binder消息发送给binder驱动,导致binder消息堆积。在binder消息B处理结束后binder驱动将堆积的大量binder消息发送给binder线程“binder2798”进行处理。由于单个binder消息的数据量较大,所以当堆积的大量binder消息在短时间内涌入binder线程“binder2798”时,会将SystemServer进程的binder线程池占满甚至直接卡死,造成稳定性问题。如在图3中的(b)图所示的日志记录中,当堆积的大量binder消息在短时间内涌入SystemServer进程的binder线程池时,SurfaceFlinger进程“surfaceflinger2849”中的子线程“surfaceflinger2773”与SystemServer进程“systemserver2793”之间的binder通信失败,造成稳定性问题。
为此,本申请实施例提供了一种信息发送方法,一方面,将updateInputFlinger函数的发送任务或ReleaseBuffer函数的发送任务拆分到单独的子线程中,以避免updateInputFlinger函数的异常状态影响到ReleaseBuffer函数的运行而造成性能问题。另一方面,采用减少单次发送的窗口信息的数据量和/或降低窗口信息的发送频率的方式,优化负载情况,避免产生稳定性问题。
本申请实施例提供的信息发送方法可以由电子设备执行。电子设备中可以安装有各种应用程序,电子设备可以显示各种应用程序的窗口。示例地,电子设备可以为手机、掌上电脑、平板电脑、笔记本电脑、车载设备、超级移动个人计算机(ultra-mobile personalcomputer,UMPC)、个人数字助理(personal digital assistant,PDA)、增强现实(augmented reality,AR)设备、虚拟现实(virtual reality,VR)设备等,本申请实施例对此不作限定。
图4是本申请实施例提供的一种电子设备的结构示意图。参见图4,电子设备100可以包括处理器110,外部存储器接口120,内部存储器121,通用串行总线(universal serialbus,USB)接口130,充电管理模块140,电源管理模块141,电池142,天线1,天线2,移动通信模块150,无线通信模块160,音频模块170,扬声器170A,受话器170B,麦克风170C,耳机接口170D,传感器模块180,按键190,马达191,指示器192,摄像头193,显示屏194,以及用户标识模块(subscriber identification module,SIM)卡接口195等。其中,传感器模块180可以包括压力传感器180A,陀螺仪传感器180B,气压传感器180C,磁传感器180D,加速度传感器180E,距离传感器180F,接近光传感器180G,指纹传感器180H,温度传感器180J,触摸传感器180K,环境光传感器180L,骨传导传感器180M等。
可以理解的是,本申请实施例示意的结构并不构成对电子设备100的具体限定。在本申请另一些实施例中,电子设备100可以包括比图示更多或更少的部件,或者组合某些部件,或者拆分某些部件,或者不同的部件布置。图示的部件可以以硬件,软件,或软件和硬件的组合实现。
处理器110可以包括一个或多个处理单元,比如:处理器110可以包括应用处理器(application processor,AP),调制解调处理器,图形处理器(graphics processingunit,GPU),图像信号处理器(image signal processor,ISP),控制器,存储器,视频编解码器,数字信号处理器(digital signal processor,DSP),基带处理器,和/或神经网络处理器(neural-network processing unit,NPU)等。其中,不同的处理单元可以是独立的器件,也可以集成在一个或多个处理器中。
其中,控制器可以是电子设备100的神经中枢和指挥中心。控制器可以根据指令操作码和时序信号,产生操作控制信号,完成取指令和执行指令的控制。
处理器110中还可以设置存储器,用于存储指令和数据。在一些实施例中,处理器110中的存储器为高速缓冲存储器。该存储器可以保存处理器110刚用过或循环使用的指令或数据。如果处理器110需要再次使用该指令或数据,可从该存储器中直接调用。避免了重复存取,减少了处理器110的等待时间,因而提高了系统的效率。
外部存储器接口120可以用于连接外部存储卡,比如Micro SD卡,实现扩展电子设备100的存储能力。外部存储卡通过外部存储器接口120与处理器110通信,实现数据存储功能。比如将音乐,视频等文件保存在外部存储卡中。
内部存储器121可以用于存储计算机可执行程序代码,计算机可执行程序代码包括指令。处理器110通过运行存储在内部存储器121的指令,来执行电子设备100的各种功能应用以及数据处理。内部存储器121可以包括存储程序区和存储数据区。其中,存储程序区可存储操作系统,至少一个功能所需的应用程序(比如声音播放功能,图像播放功能等)等。存储数据区可存储电子设备100在使用过程中所创建的数据(比如音频数据,电话本等)等。此外,内部存储器121可以包括高速随机存取存储器,还可以包括非易失性存储器,比如至少一个磁盘存储器件,闪存器件,通用闪存存储器(universal flash storage,UFS)等。
USB接口130是符合USB标准规范的接口,具体可以是Mini USB接口,Micro USB接口,USB Type C接口等。USB接口130可以用于连接充电器为电子设备100充电,也可以用于电子设备100与外围设备之间传输数据。也可以用于连接耳机,通过耳机播放音频。USB接口130还可以用于连接其他设备,比如AR设备等。
充电管理模块140用于从充电器接收充电输入。其中,充电器可以是无线充电器,也可以是有线充电器。在一些有线充电的实施例中,充电管理模块140可以通过USB接口130接收有线充电器的充电输入。在一些无线充电的实施例中,充电管理模块140可以通过电子设备100的无线充电线圈接收无线充电输入。充电管理模块140为电池142充电的同时,还可以通过电源管理模块141为电子设备100供电。
电源管理模块141用于连接电池142,充电管理模块140与处理器110。电源管理模块141接收电池142和/或充电管理模块140的输入,为处理器110,内部存储器121,外部存储器,显示屏194,摄像头193和无线通信模块160等供电。电源管理模块141还可以用于监测电池容量,电池循环次数,电池健康状态(漏电,阻抗)等参数。在其他一些实施例中,电源管理模块141也可以设置于处理器110中。在另一些实施例中,电源管理模块141和充电管理模块140也可以设置于同一个器件中。
电子设备100的无线通信功能可以通过天线1,天线2,移动通信模块150,无线通信模块160,调制解调处理器以及基带处理器等实现。
天线1和天线2用于发射和接收电磁波信号。电子设备100中的每个天线可用于覆盖单个或多个通信频带。不同的天线还可以复用,以提高天线的利用率。比如:可以将天线1复用为无线局域网的分集天线。在另外一些实施例中,天线可以和调谐开关结合使用。
移动通信模块150可以提供应用在电子设备100上的包括2G/3G/4G/5G等无线通信的解决方案。移动通信模块150可以包括至少一个滤波器,开关,功率放大器,低噪声放大器(low noise amplifier,LNA)等。移动通信模块150可以由天线1接收电磁波,并对接收的电磁波进行滤波,放大等处理,传送至调制解调处理器进行解调。移动通信模块150还可以对经调制解调处理器调制后的信号放大,经天线1转为电磁波辐射出去。在一些实施例中,移动通信模块150的至少部分功能模块可以被设置于处理器110中。在一些实施例中,移动通信模块150的至少部分功能模块可以与处理器110的至少部分模块被设置在同一个器件中。
无线通信模块160可以提供应用在电子设备100上的包括无线局域网(wirelesslocal area networks,WLAN)(如无线保真(wireless fidelity,Wi-Fi)网络),蓝牙(bluetooth,BT),全球导航卫星系统(global navigation satellite system,GNSS),调频(frequency modulation,FM),近距离无线通信技术(near field communication,NFC),红外技术(infrared,IR)等无线通信的解决方案。无线通信模块160可以是集成至少一个通信处理模块的一个或多个器件。无线通信模块160经由天线2接收电磁波,将电磁波信号调频以及滤波处理,将处理后的信号发送到处理器110。无线通信模块160还可以从处理器110接收待发送的信号,对其进行调频,放大,经天线2转为电磁波辐射出去。
电子设备100通过GPU,显示屏194,以及应用处理器等实现显示功能。GPU为图像处理的微处理器,连接显示屏194和应用处理器。GPU用于执行数学和几何计算,用于图形渲染。处理器110可包括一个或多个GPU,其执行程序指令以生成或改变显示信息。
显示屏194用于显示图像,视频等。显示屏194包括显示面板。显示面板可以采用液晶显示屏(liquid crystal display,LCD),有机发光二极管(organic light-emittingdiode,OLED),有源矩阵有机发光二极体或主动矩阵有机发光二极体(active-matrixorganic light emitting diode,AMOLED),柔性发光二极管(flex light-emittingdiode,FLED),Miniled,MicroLed,Micro-oLed,量子点发光二极管(quantum dot lightemitting diodes,QLED)等。在一些实施例中,电子设备100可以包括1个或N个显示屏194,N为大于1的整数。
触摸传感器180K,也称“触控面板”。触摸传感器180K可以设置于显示屏194,由触摸传感器180K与显示屏194组成触摸屏,也称“触控屏”。触摸传感器180K用于检测作用于其上或附近的触摸操作。触摸传感器180K可以将检测到的触摸操作传递给应用处理器,以确定触摸事件类型。可以通过显示屏194提供与触摸操作相关的视觉输出。在另一些实施例中,触摸传感器180K也可以设置于电子设备100的表面,与显示屏194所处的位置不同。
电子设备100可以通过ISP,摄像头193,视频编解码器,GPU,显示屏194以及应用处理器等实现拍摄功能。
ISP用于处理摄像头193反馈的数据。比如,拍照时,打开快门,光线通过镜头被传递到摄像头感光元件上,光信号转换为电信号,摄像头感光元件将电信号传递给ISP处理,转化为肉眼可见的图像。ISP还可以对图像的噪点,亮度,肤色进行算法优化。ISP还可以对拍摄场景的曝光,色温等参数优化。在一些实施例中,ISP可以设置在摄像头193中。
摄像头193用于捕获静态图像或视频。物体通过镜头生成光学图像投射到感光元件。感光元件可以是电荷耦合器件(charge coupled device,CCD)或互补金属氧化物半导体(complementary metal-oxide-semiconductor,CMOS)光电晶体管。感光元件把光信号转换成电信号,之后将电信号传递给ISP转换成数字图像信号。ISP将数字图像信号输出到DSP加工处理。DSP将数字图像信号转换成标准的RGB,YUV等格式的图像信号。在一些实施例中,电子设备100可以包括1个或N个摄像头193,N为大于1的整数。
电子设备100可以通过音频模块170,扬声器170A,受话器170B,麦克风170C,耳机接口170D以及应用处理器等实现音频功能,比如音乐播放,录音等。
音频模块170用于将数字音频信息转换成模拟音频信号输出,也用于将模拟音频输入转换为数字音频信号。音频模块170还可以用于对音频信号编码和解码。在一些实施例中,音频模块170可以设置于处理器110中,或将音频模块170的部分功能模块设置于处理器110中。
按键190包括开机键,音量键等。按键190可以是机械按键,也可以是触摸式按键。电子设备100可以接收按键输入,产生与电子设备100的用户设置以及功能控制有关的键信号输入。
马达191可以产生振动提示。马达191可以用于来电振动提示,也可以用于触摸振动反馈。比如,作用于不同应用(比如拍照,音频播放等)的触摸操作,可以对应不同的振动反馈效果。作用于显示屏194不同区域的触摸操作,也可对应不同的振动反馈效果。不同的应用场景(比如:时间提醒,接收信息,闹钟,游戏等),也可以对应不同的振动反馈效果。触摸振动反馈效果还可以支持自定义。
指示器192可以是指示灯,可以用于指示充电状态,电量变化,也可以用于指示消息,未接来电,通知等。
SIM卡接口195用于连接SIM卡。SIM卡可以通过插入SIM卡接口195,或从SIM卡接口195拔出,实现和电子设备100的接触和分离。电子设备100可以支持1个或N个SIM卡接口,N为大于1的整数。SIM卡接口195可以支持Nano SIM卡,Micro SIM卡,SIM卡等。同一个SIM卡接口195可以同时插入多张卡。多张卡的类型可以相同,也可以不同。SIM卡接口195也可以兼容不同类型的SIM卡。SIM卡接口195也可以兼容外部存储卡。电子设备100通过SIM卡和网络交互,实现通话以及数据通信等功能。在一些实施例中,电子设备100采用eSIM,即:嵌入式SIM卡。eSIM卡可以嵌在电子设备100中,不能和电子设备100分离。
接下来对电子设备100的软件系统予以说明。
电子设备100的软件系统可以采用分层架构,事件驱动架构,微核架构,微服务架构,或云架构。本申请实施例以分层架构的安卓(Android)系统为例,对电子设备100的软件系统进行示例性说明。
图5是本申请实施例提供的一种电子设备100的软件系统的框图。参见图5,分层架构将软件分成若干个层,每一层都有清晰的角色和分工。层与层之间通过软件接口通信。在一些实施例中,将Android系统分为应用程序层,应用程序框架层,安卓运行时(AndroidRuntime)和系统层,以及内核层。
应用程序层可以包括一系列应用程序包。如图5所示,应用程序包可以包括相机,图库,日历,通话,地图,导航,WLAN,蓝牙,音乐,视频,短信息等应用程序。
应用程序框架层为应用程序层的应用程序提供应用编程接口(applicationprogramming interface,API)和编程框架。应用程序框架层包括一些预先定义的函数。
如图5所示,应用程序框架层可以包括窗口管理器,内容提供器,视图系统,电话管理器,资源管理器,通知管理器等。窗口管理器用于管理窗口程序。窗口管理器可以获取显示屏大小,判断是否有状态栏,锁定屏幕,截取屏幕等。内容提供器用来存放和获取数据,并使这些数据可以被应用程序访问,这些数据可以包括视频,图像,音频,拨打和接听的电话,浏览历史和书签,电话簿等。视图系统包括可视控件,比如显示文字的控件,显示图片的控件等。视图系统可用于构建应用程序的显示界面,显示界面可以由一个或多个视图组成,比如,包括显示短信通知图标的视图,包括显示文字的视图,以及包括显示图片的视图。电话管理器用于提供电子设备100的通信功能,比如通话状态的管理(包括接通,挂断等)。资源管理器为应用程序提供各种资源,比如本地化字符串,图标,图片,布局文件,视频文件等。通知管理器使应用程序可以在状态栏中显示通知信息,可以用于传达告知类型的消息,可以短暂停留后自动消失,无需用户交互。比如,通知管理器被用于告知下载完成,消息提醒等。通知管理器还可以是以图表或滚动条文本形式出现在系统顶部状态栏的通知,比如后台运行的应用程序的通知。通知管理器还可以是以对话窗口形式出现在屏幕上的通知,比如在状态栏提示文本信息,发出提示音,电子设备振动,指示灯闪烁等。
如图5所示,应用程序框架层还可以运行有第一进程和第二进程,第一进程与第二进程可以进行异步binder通信。
在一些实施例中,第一进程可以获取窗口信息,并将窗口信息通过异步binder通信的方式发送给第二进程,以供第二进程据此进行相关处理。
比如,第一进程可以为SurfaceFlinger进程。第二进程可以为SystemServer进程。SurfaceFlinger进程可接收多个来源的图形数据并将这些图形数据合成后发送到显示屏进行渲染。SystemServer进程可创建并运行系统的核心服务。SurfaceFlinger进程与SystemServer进程可以进行异步binder通信。具体来讲,SurfaceFlinger进程中运行有updateInputFlinger函数,SystemServer进程中存在InputDispatcher线程。SurfaceFlinger进程通过运行updateInputFlinger函数,可以获取窗口信息并将窗口信息通过异步binder通信的方式发送给SystemServer进程中的InputDispatcher线程,以供InputDispatcher线程根据窗口信息进行触摸事件的分发。
在另一些实施例中,第一进程可以将缓冲空间释放信息通过异步binder通信的方式发送给第二进程,以指示第二进程释放缓冲空间。
比如,第一进程可以为SurfaceFlinger进程。第二进程可以为RenderThread线程所属的进程。RenderThread线程用于绘制图像帧。SurfaceFlinger进程与RenderThread线程所属的进程可以进行异步binder通信。具体来讲,SurfaceFlinger进程中运行有ReleaseBuffer函数。SurfaceFlinger进程通过运行ReleaseBuffer函数,可以将缓冲空间释放信息通过异步binder通信的方式发送给RenderThread线程,以指示RenderThread线程释放缓冲空间。
Android Runtime包括核心库和虚拟机。Android Runtime负责安卓系统的调度和管理。核心库包含两部分:一部分是java语言需要调用的功能函数,另一部分是安卓的核心库。应用程序层和应用程序框架层运行在虚拟机中。虚拟机将应用程序层和应用程序框架层的java文件执行为二进制文件。虚拟机用于执行对象生命周期的管理,堆栈管理,线程管理,安全和异常的管理,以及垃圾回收等功能。
系统层可以包括多个功能模块,比如:表面管理器(surface manager),媒体库(Media Libraries),三维图形处理库(比如:OpenGL ES),二维图形引擎(比如:SGL)等。表面管理器用于对显示子系统进行管理,并且为多个应用程序提供了2D和3D图层的融合。媒体库支持多种常用的音频,视频格式回放和录制,以及静态图像文件等。媒体库可以支持多种音视频编码格式,比如:MPEG4,H.264,MP3,AAC,AMR,JPG,PNG等。三维图形处理库用于实现三维图形绘图,图像渲染,合成,和图层处理等。二维图形引擎是二维绘图的绘图引擎。
内核层是硬件和软件之间的层。内核层可以包含显示驱动,摄像头驱动,音频驱动,传感器驱动,binder驱动等。
应用程序框架层中的第一进程和第二进程可以通过binder驱动实现异步binder通信。具体来讲,第二进程可以具有binder线程池。第一进程可以将上文的窗口信息或缓冲空间释放信息携带于binder消息中发送给binder驱动,binder驱动可以将binder消息发送给第二进程的binder线程池中的binder线程进行处理。
比如,第一进程可以为SurfaceFlinger进程。第二进程可以为SystemServer进程。SurfaceFlinger进程中运行有updateInputFlinger函数,SystemServer进程中存在InputDispatcher线程。SurfaceFlinger进程通过运行updateInputFlinger函数,可以获取窗口信息并将窗口信息携带于binder消息中发送给binder驱动,binder驱动可以将binder消息发送给SystemServer进程的binder线程池中的binder线程,binder线程可以将窗口信息传递给InputDispatcher线程,以供InputDispatcher线程根据窗口信息进行触摸事件的分发。
又比如,第一进程可以为SurfaceFlinger进程。第二进程可以为RenderThread线程所属的进程。SurfaceFlinger进程中运行有ReleaseBuffer函数。SurfaceFlinger进程通过运行ReleaseBuffer函数,可以将缓冲空间释放信息携带于binder消息中发送给binder驱动,binder驱动可以将binder消息发送给RenderThread线程所属的进程的binder线程池中的binder线程,binder线程可以将缓冲空间释放信息传递给RenderThread线程,RenderThread线程接收到缓冲空间释放信息后可以释放缓冲空间。
下面对本申请实施例提供的信息发送方法进行说明。
图6是本申请实施例提供的一种信息发送方法的流程图,该方法应用于电子设备。参见图6,该方法包括以下步骤:
步骤601:第一进程的主线程创建第一子线程和第二子线程。
第一进程是能够获取窗口信息的进程。该窗口信息可以包括电子设备显示的部分或全部窗口的窗口信息,如可以包括可见窗口的窗口信息和不可见窗口的窗口信息。该窗口信息中可以包含窗口位置、窗口大小、窗口类型等信息,本申请实施例对此不作限定。
比如,第一进程可以为SurfaceFlinger进程,当然,第一进程也可以为其他能够获取窗口信息的进程,本申请实施例对此不作唯一限定。
电子设备创建第一进程后,第一进程的主线程开始运行。该主线程在运行过程中可以创建第一子线程和第二子线程。
第一子线程能够被该主线程通过第一函数调用,且不能被该主线程通过除第一函数之外的其他函数调用。这种情况下,第一子线程用于单独执行第一函数的发送任务。该主线程仅在运行第一函数时能够调用第一子线程来执行发送任务,该主线程在运行其他函数时不能调用第一子线程。
第二子线程能够被该主线程通过除第一函数之外的第二函数调用。这种情况下,第二子线程用于执行第二函数的发送任务。该主线程在运行第二函数时能够调用第二子线程来执行发送任务。可选地,第二子线程不能被该主线程通过除第二函数之外的其他函数调用,这种情况下,第二子线程用于单独执行第二函数的发送任务;或者,第二子线程能够被该主线程通过除第一函数和第二函数之外的其他函数调用,这种情况下,第二子线程是串行执行多个函数中每个函数的发送任务。
在本申请实施例中,该主线程至少能够运行第一函数和第二函数,第一函数和第二函数中的一个用于向第二进程发送窗口信息,另一个用于指示第二进程释放缓冲空间。第二进程为除第一进程之外的进程。第一函数和第二函数对应的第二进程可以相同,也可以不同。比如,第一函数可以为updateInputFlinger函数,第二函数可以为ReleaseBuffer函数,这种情况下,第一函数对应的第二进程为需要窗口信息的进程,第二函数对应的第二进程为需要释放缓冲空间的进程;或者,第一函数可以为ReleaseBuffer函数,第二函数可以为updateInputFlinger函数,这种情况下,第一函数对应的第二进程为需要释放缓冲空间的进程,第二函数对应的第二进程为需要窗口信息的进程。
在本申请实施例中,该主线程通过运行第一函数可以调用第一子线程来执行发送任务,该主线程通过运行第二函数可以调用第二子线程来执行发送任务。第一子线程和第二子线程的运行互不影响,因而第一函数和第二函数中的一个函数的异常状态不会影响到另一个函数的运行,从而可以避免因第一函数或第二函数的异常状态而造成性能问题。
步骤602:该主线程运行第一函数,以将第一目标信息传递给第一子线程。
该主线程运行第一函数时可以根据第一目标信息调用第一子线程,以将第一目标信息传递给第一子线程。第一目标信息是第一函数需要向第二进程发送的信息。比如,若第一函数用于向第二进程发送窗口信息,则第一目标信息为目标窗口信息。或者,若第一函数用于指示第二进程释放缓冲空间,则第一目标信息为缓冲空间释放信息。
步骤603:第一子线程接收到该主线程传递的第一目标信息后,向第二进程发送第一目标信息。
第一子线程接收到该主线程传递的第一目标信息后,即可执行第一函数的发送任务,来向第二进程发送第一目标信息。
在一些实施例中,第一子线程可以通过binder驱动向第二进程发送第一目标信息。具体来讲,第一子线程可以将第一目标信息携带于binder消息中发送给binder驱动。binder驱动接收到该binder消息后,可以将该binder消息发送至第二进程的binder线程池中的binder线程进行处理,在一些实施例中,该binder线程可以将该binder消息中的第一目标信息传递给第二进程中的其他线程进行处理。
可选地,该主线程运行第二函数,以将第二目标信息传递给第二子线程。该主线程运行第二函数时可以根据第二目标信息调用第二子线程,以将第二目标信息传递给第二子线程。第二目标信息是第二函数需要向第二进程发送的信息。比如,若第二函数用于向第二进程发送窗口信息,则第二目标信息为目标窗口信息。或者,若第二函数用于指示第二进程释放缓冲空间,则第二目标信息为缓冲空间释放信息。
第二子线程接收到该主线程传递的第二目标信息后,向第二进程发送第二目标信息。也即,第二子线程接收到该主线程传递的第二目标信息后,即可执行第二函数的发送任务,来向第二进程发送第二目标信息。
在一些实施例中,第二子线程可以通过binder驱动向第二进程发送第二目标信息。具体来讲,第二子线程可以将第二目标信息携带于binder消息中发送给binder驱动。binder驱动接收到该binder消息后,可以将该binder消息发送至第二进程的binder线程池中的binder线程进行处理,在一些实施例中,该binder线程可以将该binder消息中的第二目标信息传递给第二进程中的其他线程进行处理。
在本申请实施例中,第一进程的主线程能够运行第一函数和第二函数,第一函数和第二函数中的一个用于向第二进程发送窗口信息,另一个用于指示第二进程释放缓冲空间。该主线程可以创建第一子线程和第二子线程,第一子线程用于单独执行第一函数的发送任务,第二子线程用于执行第二函数的发送任务。第一子线程和第二子线程的运行互不影响,因而第一函数和第二函数中的一个函数的异常状态不会影响到另一个函数的运行,从而可以避免因第一函数或第二函数的异常状态而造成性能问题。
下面以第一函数为用于向第二进程发送窗口信息的函数,第一目标信息为目标窗口信息为例,来对上述信息发送方法进行示例性说明。
该信息发送方法应用于电子设备中的第一进程向第二进程发送窗口信息的场景中。需说明的是,电子设备的显示屏在显示时会不断刷新屏幕图像,显示屏的刷新率即是指屏幕图像每秒被刷新的次数,显示屏每次显示的屏幕图像可以称为图像帧。第一进程每获取到一个图像帧的图形数据,可以将该图形数据发送至显示屏进行渲染,从而完成对这个图像帧的显示。并且,第一进程每获取到一个图像帧的图形数据,还可以根据该图形数据获取相应的窗口信息,并向第二进程发送该窗口信息。可选地,第一进程向第二进程发送该窗口信息时可以采用异步binder通信的方式。具体来讲,第一进程可以将携带有该窗口信息的binder消息发送给binder驱动,binder驱动可以将该binder消息发送给第二进程的binder线程池中的binder线程。
图7是本申请实施例提供的一种信息发送方法的流程图,该方法应用于电子设备。参见图7,该方法包括以下步骤:
步骤701:第一进程的主线程创建第一子线程,第一子线程能够被该主线程通过第一函数调用,且不能被该主线程通过除第一函数之外的其他函数调用。
第一进程是能够获取窗口信息的进程。该窗口信息可以包括电子设备显示的部分或全部窗口的窗口信息,如可以包括可见窗口的窗口信息和不可见窗口的窗口信息。该窗口信息中可以包含窗口位置、窗口大小、窗口类型等信息,本申请实施例对此不作限定。
比如,第一进程可以为SurfaceFlinger进程,当然,第一进程也可以为其他能够获取窗口信息的进程,本申请实施例对此不作唯一限定。
电子设备创建第一进程后,第一进程的主线程开始运行。该主线程在运行过程中可以创建第一子线程。第一子线程用于单独执行第一函数的发送任务。也即,该主线程仅能通过第一函数调用第一子线程来执行发送任务,而不能通过其他函数调用第一子线程。
第一函数用于向第二进程发送窗口信息。也即,该主线程运行第一函数时,可以获取窗口信息,并调用第一子线程向第二进程发送该窗口信息。比如,第一函数可以为updateInputFlinger函数,当然,第一函数也可以为其他能够发送窗口信息的函数,本申请实施例对此不作唯一限定。
本申请实施例中,第一进程的主线程创建仅用于执行第一函数的发送任务的第一子线程,如此是将第一函数的发送任务从该主线程中拆分到单独的子线程。这种情况下,第一函数的异常状态不会影响到该主线程中的其他函数的运行,从而可以避免因第一函数的异常状态而造成性能问题。
进一步地,该主线程还可以创建第二子线程。第二子线程能够被该主线程通过第二函数调用。也即,第二子线程可以执行第二函数的发送任务。第二函数与第一函数不同,比如,第二函数可以为ReleaseBuffer函数,当然,第二函数也可以为该主线程中除第一函数之外的其他函数,本申请实施例对此不作唯一限定。
可选地,该主线程仅能通过第二函数调用第二子线程,这种情况下,第二子线程是单独执行第二函数的发送任务。或者,该主线程不仅能通过第二函数调用第二子线程,还可以通过除第一函数和第二函数之外的其他至少一个函数调用第二子线程,这种情况下,第二子线程是串行执行多个函数中每个函数的发送任务。
比如,第一进程为SurfaceFlinger进程,第一函数为updateInputFlinger函数,第二函数为ReleaseBuffer函数。在如图8所示的线程状态示意图中,SurfaceFlinger进程具有主线程“surfaceflinger1653”,主线程“surfaceflinger1653”在运行过程中创建第一子线程“surfaceflinger2688”和第二子线程“surfaceflinger2689”。其中,第一子线程用于单独执行updateInputFlinger函数的发送任务,第二子线程用于执行ReleaseBuffer函数的发送任务,第一子线程与第二子线程的运行互不影响。这种情况下,即使第一子线程“surfaceflinger2688”在执行updateInputFlinger函数的发送任务时出现异常状态,也不会影响第二子线程“surfaceflinger2689”对ReleaseBuffer函数的发送任务的执行,从而可以避免出现性能问题。
步骤702:该主线程运行第一函数,以将目标窗口信息传递给第一子线程。
该主线程运行第一函数时可以获取目标窗口信息并根据目标窗口信息调用第一子线程,以将目标窗口信息传递给第一子线程。
目标窗口信息可以是电子设备显示的部分或全部窗口的窗口信息,目标窗口信息是第一函数需要发送给第二进程的窗口信息。
在一些实施例中,该主线程运行第一函数时可以获取当前窗口信息,比如,该主线程在获取到待渲染的当前图像帧的图形数据时,通过运行第一函数可以根据该图形数据获取当前图像帧包含的全部窗口的窗口信息作为当前窗口信息。可选地,该主线程运行第一函数时还可以根据当前窗口信息确定电子设备显示的窗口是否发生变化,具体来讲,在当前窗口信息与历史窗口信息(即上一个图像帧包含的全部窗口的窗口信息)不同时可以确定电子设备显示的窗口发生变化,在当前窗口信息与历史窗口信息相同时可以确定电子设备显示的窗口未发生变化。
可选地,该主线程运行第一函数时,可以将当前窗口信息直接确定为目标窗口信息;或者,可以根据当前窗口信息确定目标窗口信息,目标窗口信息为当前窗口信息中除包含预设窗口类型的窗口信息之外的其他窗口信息,也即,可以对当前窗口信息进行筛选,将当前窗口信息中除包含预设窗口类型的窗口信息之外的其他窗口信息确定为目标窗口信息。
预设窗口类型可以预先进行设置,如可以由技术人员根据相关需求进行预先设置。示例地,预设窗口类型可以为用户在屏幕上无法直接操作的窗口的窗口类型,如预设窗口类型可以包括不可见窗口类型(NOT_VISIBLE)、非输入通道窗口类型(NO_INPUT_CHANNEL)等窗口类型中的一个或多个。
本申请实施例中第一函数向第二进程发送的目标窗口信息是对当前窗口信息进行筛选得到的,经过筛选,极大的减少了需要向第二进程发送的窗口信息的数据量,也就减少了后续需要向第二进程发送的携带有窗口信息的binder消息的数据量,从而优化了负载情况,可以在一定程度上避免出现稳定性问题。
比如,如下表1所示,相关技术中需要发送的当前窗口信息的数据量大于或等于本申请实施例中需要发送的目标窗口信息的数据量。并且,随着打开的应用程序数量的增多,相比于相关技术,本申请实施例中通过对当前窗口信息的筛选,可以在很大程度上减少需要发送的目标窗口信息的数据量,如此可以在一定程度上避免出现稳定性问题。
表1
需说明的是,本申请实施例仅以上表1为例来对窗口信息的数据量进行举例说明,上表1并不对本申请实施例构成限定。
示例地,第一进程为SurfaceFlinger进程,第一函数为updateInputFlinger函数,第二进程为SystemServer进程。即使某次updateInputFlinger函数的运行时间较长,导致binder消息的堆积。但是由于本申请实施例中的binder消息的数据量较小,所以堆积的binder消息的总数据量也较小,这种情况下,当堆积的binder消息在短时间内涌入SystemServer进程的binder线程池时,不会将SystemServer进程的binder线程池占满,也就不会造成稳定性问题。
该主线程运行第一函数时,可以在获取到目标窗口信息后根据目标窗口信息调用第一子线程,以将目标窗口信息传递给第一子线程,以便第一子线程可以向第二进程发送目标窗口信息。
在一些实施例中,该主线程运行第一函数时,可以在获取到目标窗口信息后直接根据目标窗口信息调用第一子线程。或者,该主线程运行第一函数时,可以在获取到目标窗口信息后,在根据当前窗口信息确定窗口发生变化的情况下再根据目标窗口信息调用第一子线程。也即,可以在窗口发生变化时再调用第一子线程向第二进程发送目标窗口信息,如此,可以降低窗口信息的发送频率,优化负载情况,避免出现稳定性问题。
步骤703:第一子线程接收到该主线程传递的目标窗口信息后,向第二进程发送目标窗口信息。
第一子线程接收到该主线程传递的目标窗口信息后,即可执行第一函数的发送任务,来向第二进程发送目标窗口信息。
第二进程是需要根据窗口信息进行相关处理的进程。比如,第二进程可以为SystemServer进程,SystemServer进程包括InputDispatcher线程,InputDispatcher线程可根据窗口信息进行触摸事件的分发。当然,第二进程也可以为其他需要根据窗口信息进行相关处理的进程,本申请实施例对此不作唯一限定。
在一些实施例中,第一子线程可以通过binder驱动向第二进程发送目标窗口信息。具体来讲,第一子线程可以将目标窗口信息携带于binder消息中发送给binder驱动。binder驱动接收到该binder消息后,可以将该binder消息发送至第二进程的binder线程池中的binder线程进行处理,在一些实施例中,该binder线程可以将该binder消息中的目标窗口信息传递给第二进程中的其他线程进行处理。比如,第二进程可以为SystemServer进程,SystemServer进程包括InputDispatcher线程,SystemServer进程中的binder线程接收到binder驱动发送的binder消息后,可以将该binder消息中的目标窗口信息传递给InputDispatcher线程,InputDispatcher线程可以根据目标窗口信息进行触摸事件的分发。
可选地,步骤703的操作可以包括如下步骤(1)至步骤(3):
(1)第一子线程接收到该主线程传递的目标窗口信息后,确定接收到目标窗口信息的时刻与上一次向第二进程发送窗口信息的时刻之间的时间间隔。
第一子线程每次向第二进程发送窗口信息后,可以记录发送时刻。如此,第一子线程接收到目标窗口信息后可以确定接收到目标窗口信息的时刻与所记录的发送时刻(即上一次向第二进程发送窗口信息的时刻)之间的时间间隔。
之后,第一子线程可以根据该时间间隔向第二进程发送目标窗口信息。具体地,第一子线程在该时间间隔大于或等于第一时长的情况下可以执行如下步骤(2);在该时间间隔小于第一时长的情况下可以执行如下步骤(3)。
(2)第一子线程在该时间间隔大于或等于第一时长的情况下向第二进程发送目标窗口信息。
第一时长可以预先进行设置,如第一时长可以根据电子设备的显示屏的帧间隔时间进行预先设置。示例地,第一时长可以大于显示屏的帧间隔时间。进一步地,第一时长还可以小于或等于m倍的帧间隔时间,m大于1,如m可以为2、3等。比如,第一时长可以大于显示屏的帧间隔时间且小于或等于2倍的帧间隔时间。这种情况下,若电子设备的显示屏的刷新率为90Hz(赫兹),则显示屏的帧间隔时间为1000÷90≈11.1ms(毫秒),第一时长可以大于11.1ms且小于或等于22.2ms,如第一时长可以为16ms。或者,若电子设备的显示屏的刷新率为120Hz,则显示屏的帧间隔时间为1000÷120≈8.3ms,第一时长可以大于8.3ms且小于或等于16.6ms,如第一时长可以为16ms。
本申请实施例中,第一子线程接收到目标窗口信息后,是在接收到目标窗口信息的时刻与上一次发送窗口信息的时刻之间的时间间隔大于显示屏的帧间隔时间的情况下才向第二进程发送目标窗口信息,如此,可以实现隔帧发送窗口信息,从而降低了窗口信息的发送频率,优化了负载情况,可以避免出现稳定性问题。
需说明的是,在第一时长大于m-1倍的帧时间间隔且小于或等于m倍的帧时间间隔的情况下,第一子线程每次至少间隔m-1个图像帧向第二进程发送一次窗口信息。比如,在第一时长大于帧间隔时间且小于或等于2倍的帧间隔时间的情况下,第一子线程每次至少间隔一个图像帧向第二进程发送一次窗口信息。假设存在连续的三个图像帧:图像帧1、图像帧2、图像帧3,第一子线程在向第二进程发送图像帧1的目标窗口信息后,若第一子线程接收到图像帧2的目标窗口信息,则不会向第二进程发送图像帧2的目标窗口信息,而是在接收到图像帧3的目标窗口信息时向第二进程发送图像帧3的目标窗口信息,如此,实现间隔性的向第二进程发送窗口信息。
(3)第一子线程在该时间间隔小于第一时长的情况下,将目标窗口信息等待第一时长。
第一子线程在将目标窗口信息等待第一时长的过程中若未接收到下一条窗口信息,也即,第一子线程若在接收到目标窗口信息后的第一时长内未接收到下一条窗口信息,则第一子线程可以向第二进程发送目标窗口信息。这种情况下,由于第一时长大于帧间隔时间,所以第一子线程是至少间隔该帧间隔时间向第二进程发送一次窗口信息,从而降低了窗口信息的发送频率,优化了负载情况,可以避免出现稳定性问题。
第一子线程若在将目标窗口信息等待第一时长的过程中接收到下一条窗口信息,则由于相邻两个图像帧之间的时间间隔为该帧时间间隔,所以第一子线程接收到该下一条窗口信息的时刻与上一次向第二进程发送窗口信息的时刻之间的时间间隔会大于该帧时间间隔,即会大于第一时长,因而第一子线程可以向第二进程发送该下一条窗口信息。也就是说,第一子线程若在将目标窗口信息等待第一时长的过程中接收到下一条窗口信息,则可以直接向第二进程发送该下一条窗口信息。
比如,如图9所示,假设第一时长为16ms。第一子线程接收到目标窗口信息后,若确定接收到目标窗口信息的时刻与上一次向第二进程发送窗口信息的时刻之间的时间间隔小于16ms,则第一子线程将目标窗口信息等待16ms。之后,如图9中的(a)图所示,若在目标窗口信息的等待过程中第一子线程接收到下一条窗口信息,则会打断目标窗口信息的等待,这种情况下,第一子线程丢弃目标窗口信息并向第二进程发送该下一条窗口信息。或者,如图9中的(b)图所示,若在目标窗口信息的等待过程中第一子线程一直未接收到下一条窗口信息,则第一子线程可以在等待超时后自动向第二进程发送目标窗口信息。
可选地,第一子线程接收到该主线程传递的目标窗口信息后,可以在接收到目标窗口信息的时刻与上一次向第二进程发送窗口信息的时刻之间的时间间隔小于第一时长的情况下,将目标窗口信息存储至任务队列,并等待第一时长。之后,第一子线程若在接收到目标窗口信息后的第一时长内未接收到下一条窗口信息,则向第二进程发送该任务队列中的目标窗口信息;第一子线程若在接收到目标窗口信息后的第一时长内接收到下一条窗口信息,则丢弃该任务队列中的目标窗口信息,并向第二进程发送该下一条窗口信息。
可以理解的,该任务队列中的窗口信息为第一子线程已接收且尚未向第二进程发送的窗口信息。这种情况下,上述步骤(1)中第一子线程接收到该主线程传递的目标窗口信息后,可以先确定该任务队列中是否存在窗口信息。若该任务队列中存在窗口信息,表明目标窗口信息与上一次向第二进程发送的窗口信息之间至少间隔了该任务队列中存在的窗口信息,即表明第一子线程接收到目标窗口信息的时刻与上一次向第二进程发送窗口信息的时刻之间的时间间隔至少大于帧时间间隔,因而第一子线程可以丢弃该任务队列中的窗口信息,并直接向第二进程发送目标窗口信息。而若该任务队列中不存在窗口信息,则第一子线程可以执行步骤(1)中的确定接收到的目标窗口信息的时刻与上一次向第二进程发送窗口信息的时刻之间的时间间隔的操作以及后续步骤(2)和步骤(3)。如此,通过该任务队列可以实现对是否可发送目标窗口信息的快速判断。
需说明的是,本申请实施例通过上述步骤(1)至步骤(3)可以实现隔帧向第二进程发送窗口信息。这种情况下,即使某次第一函数的运行时间较长,也不会导致binder消息的过度堆积。因而当少量堆积的binder消息在短时间内涌入第二进程的binder线程池时,不会将第二进程的binder线程池占满,也就不会造成稳定性问题。
本申请实施例通过上述步骤(1)至步骤(3)实现了第一子线程在发送窗口信息时的一种降负载方案。在一些实施例中,可以在全场景下实现该降负载方案,即第一子线程每接收到该主线程传递的一条窗口信息均可以执行上述步骤(1)至步骤(3)。在另一些实施例中,可以仅在部分场景下实现该降负载方案,而在其他场景下直接将接收到的窗口信息发送给第二进程。
可选地,可以在应用程序处于启动退出动效的过程中实现该降负载方案,该启动退出动效是指应用程序启动或退出时的动效。由于应用程序处于启动退出动效时大概率不会出现对窗口的操作,所以这种场景下隔帧发送窗口信息不会对用户操作造成影响。
或者,可以在应用程序处于启动退出动效且显示屏的刷新率大于或等于预设刷新率时实现该降负载方案。预设刷新率可以预先进行设置,且预设刷新率可以设置的较大,比如,预设刷新率可以为90Hz、120Hz等,本申请实施例对此不作限定。由于显示屏的刷新率大于或等于预设刷新率,即显示屏的刷新率较高,所以在这种场景下隔帧发送窗口信息不会造成卡顿。
接下来对在上述两种场景下实现该降负载方案的过程进行详细说明,具体可以包括如下步骤A至步骤B:
步骤A:该主线程若接收到第一消息,则将目标变量设置为第一变量值。
第一消息用于指示应用程序的启动退出动效开始,示例地,第一消息可以为binder消息。可选地,电子设备中可以包括目标模块,目标模块可以检测应用程序是否处于启动动效或退出动效。若目标模块检测到应用程序处于启动动效或退出动效的开始阶段,则可以向该主线程发送第一消息,以指示应用程序的启动退出动效开始。
该主线程接收到第一消息后,即可将目标变量设置为第一变量值。目标变量用于指示是否使用该降负载方案。目标变量为第一变量值时指示使用该降负载方案。目标变量为第二变量值时指示不使用该降负载方案。第一变量值与第二变量值不同,如第一变量值可以为true,第二变量值可以为false。
在一些实施例中,该主线程接收到第一消息后,可以直接将目标变量设置为第一变量值。在另一些实施例中,该主线程接收到第一消息后,可以先确定显示屏的刷新率是否大于或等于预设刷新率,若显示屏的刷新率大于或等于预设刷新率再将目标变量设置为第一变量值,若显示屏的刷新率小于预设刷新率则不改变目标变量的变量值,即将目标变量保持为第二变量值。
可选地,若目标模块检测到应用程序结束启动动效或退出动效,则可以向该主线程发送第二消息,第二消息用于指示应用程序的启动退出动效结束,示例地,第二消息可以为binder消息。该主线程接收到第二消息后,可以直接将目标变量设置为第二变量值。
在一些实施例中,该主线程在将目标变量设置为第一变量值后的第二时长内若未接收到第二消息,则可以将目标变量设置为第二变量值。
第二时长可以预先进行设置,且第二时长可以设置的较大,如第二时长可以为2秒、3秒等。可选地,第二时长可以大于启动退出动效的最大持续时长。
该主线程将目标变量设置为第一变量值,表明启动了该降负载方案。这种情况下,该主线程可以记录该降负载方案的生效时间,即记录在将目标变量设置为第一变量值后经过了多长时间。若该主线程在将目标变量设置为第一变量值后的第二时长内未接收到第二消息,说明该降负载方案的生效时间已经达到第二时长,即该降负载方案的生效时间已经超出了启动退出动效的最大持续时长,这种情况下该主线程还未接收到第二消息,说明可能是出现了一些错误,因而在此情况下该主线程可以主动关闭该降负载方案,即该主线程可以将目标变量设置为第二变量值,可选地,在此情况下该主线程还可以打印日志,以便技术人员可以根据日志及时确认异常情况。
步骤B:第一子线程接收到该主线程传递的目标窗口信息后,若确定目标变量为第一变量值,则执行上述步骤(1)至步骤(3)提供的降负载方案。
而若确定目标变量为第二变量值,说明目前不能使用该降负载方案,则第一子线程可以直接向第二进程发送目标窗口信息。
比如,第一进程为SurfaceFlinger进程,第一函数为updateInputFlinger函数,第二函数为ReleaseBuffer函数。在如图10所示的线程状态示意图中,SurfaceFlinger进程具有第一子线程“surfaceflinger2688”,第一子线程用于单独执行updateInputFlinger函数的发送任务。如图10中的(a)图所示,在应用程序未处于启动退出动效时,第一子线程可以向第二进程发送每个图像帧的窗口信息。而如图10中的(b)图所示,在应用程序处于启动退出动效的过程中,第一子线程可以使用该降负载方案,隔帧向第二进程发送窗口信息。
需说明的是,本申请实施例中可以通过对当前窗口信息进行筛选来得到需要向第二进程发送的窗口信息,和/或,可以采用降负载方案来隔帧向第二进程发送窗口信息,如此,减少了单次需要发送的窗口信息的数据量和/或降低了窗口信息的发送频率,也就减少了单个binder消息的数据量和/或降低了binder消息的发送频率,从而优化了负载情况,可以避免产生稳定性问题。
在本申请实施例中,第一进程的主线程创建第一子线程。之后,该主线程运行第一函数,以获取目标窗口信息并根据目标窗口信息调用第一子线程。第一子线程接收到该主线程传递的目标窗口信息后向第二进程发送目标窗口信息。由于第一子线程仅能被该主线程通过第一函数调用而不能被该主线程通过其他函数调用,所以第一函数的异常状态不会影响到该主线程中的其他函数的运行,从而可以避免因第一函数的异常状态而造成性能问题。
下面以第一函数为用于指示第二进程释放缓冲空间的函数,第一目标信息为缓冲空间释放信息为例,来对上述信息发送方法进行示例性说明。
图11是本申请实施例提供的一种信息发送方法的流程图,该方法应用于电子设备。参见图11,该方法包括以下步骤:
步骤1101:第一进程的主线程创建第一子线程,第一子线程能够被该主线程通过第一函数调用,且不能被该主线程通过除第一函数之外的其他函数调用。
第一进程是能够获取窗口信息的进程。该窗口信息可以包括电子设备显示的部分或全部窗口的窗口信息,如可以包括可见窗口的窗口信息和不可见窗口的窗口信息。该窗口信息中可以包含窗口位置、窗口大小、窗口类型等信息,本申请实施例对此不作限定。
比如,第一进程可以为SurfaceFlinger进程,当然,第一进程也可以为其他能够获取窗口信息的进程,本申请实施例对此不作唯一限定。
电子设备创建第一进程后,第一进程的主线程开始运行。该主线程在运行过程中可以创建第一子线程。第一子线程用于单独执行第一函数的发送任务。也即,该主线程仅能通过第一函数调用第一子线程来执行发送任务,而不能通过其他函数调用第一子线程。
第一函数用于指示第二进程释放缓冲空间。也即,该主线程运行第一函数时,可以调用第一子线程向第二进程发送缓冲空间释放信息。比如,第一函数可以为ReleaseBuffer函数,当然,第一函数也可以为其他能够指示进程释放缓冲空间的函数,本申请实施例对此不作唯一限定。
本申请实施例中,第一进程的主线程创建仅用于执行第一函数的发送任务的第一子线程,如此是将第一函数的发送任务从该主线程中拆分到单独的子线程。这种情况下,该主线程中其他函数的异常状态不会影响到第一函数的运行,从而可以避免因其他函数的异常状态而造成性能问题。
进一步地,该主线程还可以创建第二子线程。第二子线程能够被该主线程通过第二函数调用。也即,第二子线程可以执行第二函数的发送任务。第二函数与第一函数不同,比如,第二函数可以为updateInputFlinger函数,当然,第二函数也可以为该主线程中除第一函数之外的其他函数,本申请实施例对此不作唯一限定。
可选地,该主线程仅能通过第二函数调用第二子线程,这种情况下,第二子线程是单独执行第二函数的发送任务。或者,该主线程不仅能通过第二函数调用第二子线程,还可以通过除第一函数和第二函数之外的其他至少一个函数调用第二子线程,这种情况下,第二子线程是串行执行多个函数中每个函数的发送任务。
步骤1102:该主线程运行第一函数,以将缓冲空间释放信息传递给第一子线程。
该主线程运行第一函数时可以根据缓冲空间释放信息调用第一子线程,以将缓冲空间释放信息传递给第一子线程。缓冲空间释放信息用于指示释放缓冲空间。
步骤1103:第一子线程接收到该主线程传递的缓冲空间释放信息后,向第二进程发送缓冲空间释放信息。
第一子线程接收到该主线程传递的缓冲空间释放信息后,即可执行第一函数的发送任务,来向第二进程发送缓冲空间释放信息。
第二进程是需要释放缓冲空间的进程。比如,第二进程可以为RenderThread线程所属的进程。当然,第二进程也可以为其他需要释放缓冲空间的进程,本申请实施例对此不作唯一限定。
在一些实施例中,第一子线程可以通过binder驱动向第二进程发送缓冲空间释放信息。具体来讲,第一子线程可以将缓冲空间释放信息携带于binder消息中发送给binder驱动。binder驱动接收到该binder消息后,可以将该binder消息发送至第二进程的binder线程池中的binder线程进行处理,在一些实施例中,该binder线程可以将该binder消息中的缓冲空间释放信息传递给第二进程中的其他线程进行处理。比如,第二进程可以为RenderThread线程所属的进程,RenderThread线程所属的进程中的binder线程接收到binder驱动发送的binder消息后,可以将该binder消息中的缓冲空间释放信息传递给RenderThread线程,RenderThread线程可以根据缓冲空间释放信息释放缓冲空间。
在本申请实施例中,第一进程的主线程创建第一子线程。之后,该主线程运行第一函数,以根据缓冲空间释放信息调用第一子线程。第一子线程接收到该主线程传递的缓冲空间释放信息后向第二进程发送缓冲空间释放信息。由于第一子线程仅能被该主线程通过第一函数调用而不能被该主线程通过其他函数调用,所以该主线程中的其他函数的异常状态不会影响到第一函数的运行,从而可以避免因其他函数的异常状态而造成性能问题。
下面对本申请实施例提供的一种信息发送方法进行说明。
图12是本申请实施例提供的一种信息发送方法的流程图,该方法应用于电子设备。参见图12,该方法包括以下步骤:
步骤1201:SurfaceFlinger进程的主线程创建第三子线程,第三子线程能够被该主线程通过updateInputFlinger函数调用。
电子设备创建SurfaceFlinger进程后,SurfaceFlinger进程的主线程开始运行。该主线程在运行过程中可以创建第三子线程。第三子线程用于执行updateInputFlinger函数的发送任务。在一些实施例中,第三子线程可以为上文所述的第一子线程或第二子线程。在另一些实施例中,第三子线程能够被该主线程通过ReleaseBuffer函数调用,也即,第三子线程能够串行执行updateInputFlinger函数和ReleaseBuffer函数的发送任务。
步骤1202:该主线程运行updateInputFlinger函数,以执行操作:获取当前窗口信息,根据当前窗口信息确定目标窗口信息,将目标窗口信息传递给第三子线程,目标窗口信息为当前窗口信息中除包含预设窗口类型的窗口信息之外的其他窗口信息。
该主线程运行updateInputFlinger函数时可以获取当前窗口信息,比如,该主线程在获取到待渲染的当前图像帧的图形数据时,通过运行updateInputFlinger函数可以根据该图形数据获取当前图像帧包含的全部窗口的窗口信息作为当前窗口信息。可选地,该主线程运行updateInputFlinger函数时还可以根据当前窗口信息确定电子设备显示的窗口是否发生变化,具体来讲,在当前窗口信息与历史窗口信息(即上一个图像帧包含的全部窗口的窗口信息)不同时可以确定电子设备显示的窗口发生变化,在当前窗口信息与历史窗口信息相同时可以确定电子设备显示的窗口未发生变化。
该主线程运行updateInputFlinger函数时,可以对当前窗口信息进行筛选,将当前窗口信息中除包含预设窗口类型的窗口信息之外的其他窗口信息确定为目标窗口信息。
预设窗口类型可以预先进行设置,如可以由技术人员根据相关需求进行预先设置。示例地,预设窗口类型可以为用户在屏幕上无法直接操作的窗口的窗口类型,如预设窗口类型可以包括不可见窗口类型、非输入通道窗口类型等窗口类型中的一个或多个。
本申请实施例中updateInputFlinger函数向第二进程发送的目标窗口信息是对当前窗口信息进行筛选得到的,经过筛选,极大的减少了需要向第二进程发送的窗口信息的数据量,也就减少了后续需要向第二进程发送的携带有窗口信息的binder消息的数据量,从而优化了负载情况,可以在一定程度上避免出现稳定性问题。
这种情况下,即使某次updateInputFlinger函数的运行时间较长,导致binder消息的堆积。但是由于本申请实施例中的binder消息的数据量较小,所以堆积的binder消息的总数据量也较小,这种情况下,当堆积的binder消息在短时间内涌入第二进程的binder线程池时,不会将第二进程的binder线程池占满,也就不会造成稳定性问题。
该主线程运行updateInputFlinger函数时,可以在获取到目标窗口信息后根据目标窗口信息调用第三子线程,以将目标窗口信息传递给第三子线程,以便第三子线程可以向第二进程发送目标窗口信息。
在一些实施例中,该主线程运行updateInputFlinger函数时,可以在获取到目标窗口信息后直接根据目标窗口信息调用第三子线程。或者,该主线程运行updateInputFlinger函数时,可以在获取到目标窗口信息后,在根据当前窗口信息确定窗口发生变化的情况下再根据目标窗口信息调用第三子线程。也即,可以在窗口发生变化时再调用第三子线程向第二进程发送目标窗口信息,如此,可以降低窗口信息的发送频率,优化负载情况,避免出现稳定性问题。
步骤1203:第三子线程接收到该主线程传递的目标窗口信息后,向第二进程发送目标窗口信息。
第三子线程接收到该主线程传递的目标窗口信息后,即可执行updateInputFlinger函数的发送任务,来向第二进程发送目标窗口信息。
第二进程是需要根据窗口信息进行相关处理的进程。比如,第二进程可以为SystemServer进程,SystemServer进程包括InputDispatcher线程,InputDispatcher线程可根据窗口信息进行触摸事件的分发。当然,第二进程也可以为其他需要根据窗口信息进行相关处理的进程,本申请实施例对此不作唯一限定。
在一些实施例中,第三子线程可以通过binder驱动向第二进程发送目标窗口信息。具体来讲,第三子线程可以将目标窗口信息携带于binder消息中发送给binder驱动。binder驱动接收到该binder消息后,可以将该binder消息发送至第二进程的binder线程池中的binder线程进行处理,在一些实施例中,该binder线程可以将该binder消息中的目标窗口信息传递给第二进程中的其他线程进行处理。比如,第二进程可以为SystemServer进程,SystemServer进程包括InputDispatcher线程,SystemServer进程中的binder线程接收到binder驱动发送的binder消息后,可以将该binder消息中的目标窗口信息传递给InputDispatcher线程,InputDispatcher线程可以根据目标窗口信息进行触摸事件的分发。
在本申请实施例中,SurfaceFlinger进程的主线程创建第三子线程,第三子线程能够被该主线程通过updateInputFlinger函数调用。该主线程运行updateInputFlinger函数,以执行操作:获取当前窗口信息,根据当前窗口信息确定目标窗口信息,将目标窗口信息传递给第三子线程,目标窗口信息为当前窗口信息中除包含预设窗口类型的窗口信息之外的其他窗口信息。第三子线程接收到主线程传递的目标窗口信息后,向第二进程发送目标窗口信息。本申请实施例中,updateInputFlinger函数向第二进程发送的目标窗口信息是对当前窗口信息进行筛选得到的,经过筛选,极大的减少了需要向第二进程发送的窗口信息的数据量,从而优化了负载情况,可以在一定程度上避免出现稳定性问题。
在上述实施例中,可以全部或部分地通过软件、硬件、固件或者其任意结合来实现。当使用软件实现时,可以全部或部分地以计算机程序产品的形式实现。所述计算机程序产品包括一个或多个计算机指令。在计算机上加载和执行所述计算机指令时,全部或部分地产生按照本申请实施例所述的流程或功能。所述计算机可以是通用计算机、专用计算机、计算机网络或其他可编程装置。所述计算机指令可以存储在计算机可读存储介质中,或者从一个计算机可读存储介质向另一个计算机可读存储介质传输,比如,所述计算机指令可以从一个网站站点、计算机、服务器或数据中心通过有线(比如:同轴电缆、光纤、数据用户线(Digital Subscriber Line,DSL))或无线(比如:红外、无线、微波等)方式向另一个网站站点、计算机、服务器或数据中心进行传输。所述计算机可读存储介质可以是计算机能够存取的任何可用介质,或者是包含一个或多个可用介质集成的服务器、数据中心等数据存储设备。所述可用介质可以是磁性介质(比如:软盘、硬盘、磁带)、光介质(比如:数字通用光盘(Digital Versatile Disc,DVD))或半导体介质(比如:固态硬盘(Solid State Disk,SSD))等。
以上所述为本申请提供的可选实施例,并不用以限制本申请,凡在本申请的揭露的技术范围之内,所作的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。

Claims (11)

1.一种信息传输方法,所述方法应用于电子设备,其特征在于,包括:
检测到触摸事件;
在检测到所述触摸事件之后,所述SurfaceFlinger进程的主线程被运行,以得到窗口信息;
在得到所述窗口信息之后,所述SurfaceFlinger进程的主线程被运行,以得到缓冲空间释放信息;
所述SurfaceFlinger进程的第一子线程向第一进程发送所述窗口信息;
所述SurfaceFlinger进程的第二子线程向第二进程发送所述缓冲空间释放信息,其中,所述第二子线程与所述第一子线程不同。
2.如权利要求1所述的方法,其特征在于,所述第一进程为SystemServer进程。
3.如权利要求2所述的方法,其特征在于,所述SurfaceFlinger进程的第一子线程向第一进程发送所述窗口信息,包括:
所述第一子线程向所述SystemServer进程的InputDispatcher线程发送所述窗口信息。
4.如权利要求1-3中任一项所述的方法,其特征在于,所述方法还包括:
所述SurfaceFlinger进程的主线程创建所述第一子线程和所述第二子线程。
5.如权利要求1-4中任一项所述的方法,其特征在于,所述第二进程为RenderThread线程所属的进程。
6.如权利要求1-5中任一项所述的方法,所述的方法,其特征在于,所述SurfaceFlinger进程的主线程被运行,以得到窗口信息,包括:
所述SurfaceFlinger进程的主线程被运行updateInputFlinger,以得到所述窗口信息。
7.如权利要求5所述的方法,其特征在于,所述方法还包括:
所述RenderThread释放缓冲空间。
8.如权利要求3所述的方法,其特征在于,所述第一子线程向所述SystemServer进程的InputDispatcher线程发送所述窗口信息之后,所述方法还包括:
所述InputDispatcher线程基于所述窗口信息,将所述触摸事件发送到所述触摸事件对应的窗口。
9.一种电子设备,其特征在于,所述电子设备包括显示屏、存储器和一个或多个处理器;所述显示屏、所述存储器与所述处理器耦合;所述存储器中存储有计算机程序代码,所述计算机程序代码包括计算机指令,当所述计算机指令被所述处理器执行时,使得所述电子设备执行如权利要求1-8中任一项所述的方法。
10.一种计算机可读存储介质,其特征在于,包括计算机指令,当所述计算机指令在电子设备上运行时,使得所述电子设备执行如权利要求1-8中任一项所述的方法。
11.一种芯片系统,其特征在于,所述芯片系统包括处理器,所述处理器用于调用存储器中的计算机程序,以执行如权利要求1-8中任一项所述的方法。
CN202410024038.6A 2023-05-29 2023-05-29 信息传输方法、电子设备、存储介质和芯片系统 Pending CN117909070A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202410024038.6A CN117909070A (zh) 2023-05-29 2023-05-29 信息传输方法、电子设备、存储介质和芯片系统

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
CN202310617998.9 2023-05-29
CN202410024038.6A CN117909070A (zh) 2023-05-29 2023-05-29 信息传输方法、电子设备、存储介质和芯片系统

Related Parent Applications (1)

Application Number Title Priority Date Filing Date
CN202310617998.9 Division 2023-05-29 2023-05-29

Publications (1)

Publication Number Publication Date
CN117909070A true CN117909070A (zh) 2024-04-19

Family

ID=90716745

Family Applications (2)

Application Number Title Priority Date Filing Date
CN202410028322.0A Pending CN117909071A (zh) 2023-05-29 2023-05-29 图像显示方法、电子设备、存储介质和芯片系统
CN202410024038.6A Pending CN117909070A (zh) 2023-05-29 2023-05-29 信息传输方法、电子设备、存储介质和芯片系统

Family Applications Before (1)

Application Number Title Priority Date Filing Date
CN202410028322.0A Pending CN117909071A (zh) 2023-05-29 2023-05-29 图像显示方法、电子设备、存储介质和芯片系统

Country Status (1)

Country Link
CN (2) CN117909071A (zh)

Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113129202A (zh) * 2020-01-10 2021-07-16 华为技术有限公司 数据传输方法、装置及数据处理系统、存储介质
US20210274246A1 (en) * 2018-06-20 2021-09-02 Hangzhou Hikvision Digital Technology Co., Ltd. Data Processing Method and Apparatus, Electronic Device, System, and Storage Medium
CN114880159A (zh) * 2022-07-13 2022-08-09 腾讯科技(深圳)有限公司 数据处理方法、装置、设备及存储介质
CN115525453A (zh) * 2022-01-19 2022-12-27 荣耀终端有限公司 多屏协同中断的处理方法及电子设备
CN115629884A (zh) * 2022-12-12 2023-01-20 荣耀终端有限公司 一种线程调度方法、电子设备及存储介质
CN116048833A (zh) * 2022-08-31 2023-05-02 荣耀终端有限公司 一种线程处理方法、终端设备及芯片系统

Family Cites Families (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8539450B2 (en) * 2009-03-11 2013-09-17 Nec Laboratories America, Inc. Fast and accurate data race detection for concurrent programs with asynchronous calls
CN110018890B (zh) * 2018-01-10 2021-07-30 武汉斗鱼网络科技有限公司 一种线程间的交互方法、电子设备及可读存储介质
CN112717370B (zh) * 2019-03-18 2023-07-14 荣耀终端有限公司 一种控制方法和电子设备
CN113138655B (zh) * 2021-04-02 2023-11-28 Oppo广东移动通信有限公司 处理器频率的调整方法、装置、电子设备及存储介质

Patent Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20210274246A1 (en) * 2018-06-20 2021-09-02 Hangzhou Hikvision Digital Technology Co., Ltd. Data Processing Method and Apparatus, Electronic Device, System, and Storage Medium
CN113129202A (zh) * 2020-01-10 2021-07-16 华为技术有限公司 数据传输方法、装置及数据处理系统、存储介质
CN115525453A (zh) * 2022-01-19 2022-12-27 荣耀终端有限公司 多屏协同中断的处理方法及电子设备
CN114880159A (zh) * 2022-07-13 2022-08-09 腾讯科技(深圳)有限公司 数据处理方法、装置、设备及存储介质
CN116048833A (zh) * 2022-08-31 2023-05-02 荣耀终端有限公司 一种线程处理方法、终端设备及芯片系统
CN115629884A (zh) * 2022-12-12 2023-01-20 荣耀终端有限公司 一种线程调度方法、电子设备及存储介质

Also Published As

Publication number Publication date
CN117909071A (zh) 2024-04-19

Similar Documents

Publication Publication Date Title
CN109559270B (zh) 一种图像处理方法及电子设备
CN112148400B (zh) 锁定状态下的显示方法及装置
US20230418696A1 (en) Method for performing drawing operation by application and electronic device
CN113961157B (zh) 显示交互系统、显示方法及设备
CN113805797B (zh) 网络资源的处理方法、电子设备及计算机可读存储介质
EP4152782A1 (en) Message pushing method and apparatus
CN112527476A (zh) 资源调度方法及电子设备
WO2020155875A1 (zh) 电子设备的显示方法、图形用户界面及电子设备
CN116009999A (zh) 卡片分享方法、电子设备及通信系统
CN116048833B (zh) 一种线程处理方法、终端设备及芯片系统
WO2023005900A1 (zh) 一种投屏方法、电子设备及系统
EP4273687A1 (en) Picture sharing method and electronic device
CN116048831B (zh) 一种目标信号处理方法和电子设备
CN113760191B (zh) 数据读取方法、装置、存储介质和程序产品
WO2021104000A1 (zh) 屏幕显示方法及电子设备
CN114691248B (zh) 显示虚拟现实界面的方法、装置、设备和可读存储介质
CN117909070A (zh) 信息传输方法、电子设备、存储介质和芯片系统
CN116088944B (zh) 界面显示方法和装置
WO2023174322A1 (zh) 图层处理方法和电子设备
CN116684521B (zh) 音频处理方法、设备及存储介质
CN116991274B (zh) 一种上滑动效异常处理方法及电子设备
CN116700578B (zh) 图层合成方法、电子设备以及存储介质
WO2024093703A1 (zh) 一种实例的管理方法、装置、电子设备及存储介质
EP4239467A1 (en) Frame rate switching method and device
EP4207782A1 (en) Screen mirroring method and apparatus, device, and storage medium

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination