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
可能不合格么