no route to host Chromium网页输入事件捕捉和手势检测过程分析(24)

电脑杂谈  发布时间:2018-02-16 22:46:44  来源:网络整理

TouchEventQueue类的成员变量touch_queue_描写叙述的是一个Touch事件队列。这个队列用来暂存即将要发送给Render进程的Touch事件。

一个即将要发送的Touch事件在两种情况下须要暂存在队列中:

1. 在它之前的Touch事件还未发送给Render进程,即Touch事件队列不为空。

2. Render进程正在发送一个ACK事件给Browser进程,而Browser进程正在分发这个ACK事件。这个ACK事件分发完毕之后。Browser进程才干够将下一个Touch事件发送给Render进程处理。这时候TouchEventQueue类的成员变量dispatching_touch_ack_的值就不等于NULL,它指向正在分发的ACK事件。

TouchEventQueue类的成员函数QueueEvent所做的事情就是推断参数event描写叙述的Touch事件能否够立即发送。假设能立即发送,那么就会将它保存在Touch事件队列中,然后再调用另外一个成员函数ForwardNextEventToRenderer将它从Touch事件队列读取出来,而且发送给Render进程。假设不能立即发送,那么相同会将它保存在Touch事件队列中,只是要等到上一个发送给Render进程的Touch事件被ACK之后,才干继续将它发送给Render进程。这相同是通过调用TouchEventQueue类的成员函数ForwardNextEventToRenderer进行发送的。

我们注意到,在将参数event描写叙述的Touch事件保存在Touch事件队列之前,假设队列不为空,那么TouchEventQueue类的成员函数QueueEvent会推断参数event描写叙述的Touch事件与队列中最后一个Touch事件是否是相同的,也就是它们所包括的触摸点都是一样的。假设相同,那么就能够合并为一个Touch事件发送给Render进程。

合并后的Touch事件使用一个CoalescedWebTouchEvent对象描写叙述。

这样能够避免反复向Render进程发送相同的Touch事件。

我们假设参数event描写叙述的Touch事件能够立即发送给Render进程,因此接下来我们就继续分析TouchEventQueue类的成员函数ForwardNextEventToRenderer的实现,例如以下所看到的:

void TouchEventQueue::ForwardNextEventToRenderer() {
  ......

  TouchEventWithLatencyInfo touch = touch_queue_.front()->coalesced_event();
  ......

  // A synchronous ack will reset |dispatching_touch_|, in which case
  // the touch timeout should not be started.
  base::AutoReset<bool> dispatching_touch(&dispatching_touch_, true);
  SendTouchEventImmediately(touch);
  
  ......
}
这个函数定义在文件external/chromium_org/content/browser/renderer_host/input/touch_event_queue.cc中。


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-81055-24.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    • 赛乃外尔买买提艾力
      赛乃外尔买买提艾力

      可能不合格么

    热点图片
    拼命载入中...