【发布时间】:2021-09-26 09:38:10
【问题描述】:
我正在编写一个特定的应用程序,该应用程序必须根据通过 UDP 协议传输的数据在屏幕上呈现图像,并尽可能降低延迟。整体程序设计无关紧要,代码清洁度或可维护性也无关紧要。我需要 1 毫秒的延迟(用于处理数据报并调用翻转视频缓冲区的回调)或低于该延迟。
现在,我正在考虑以下方法:socket.socket().recvfrom()、selectors.DefaultSelector().register()、asyncore.dispatcher、multiprocessing.Process、concurrent.futures.ProcessPoolExecutor().submit()、twisted.internet.protocol.ConnectedDatagramProtocol
虽然socket.recvfrom() 是最简单的方法,但它意味着下面的while true 循环是阻塞的,并且如果在调用recvfrom() 方法之前发送数据报,则不允许侦听 (即没有缓冲区),我的应用程序将以 1500 Hz 的频率接收数据报。twisted 框架是否足够快?是基于select还是基于回调?
我个人的偏好是我使用 ProcessPoolExecutor,尽管我认为必须调用回调会浪费几分之一毫秒,而过程式单线程代码是最快的。
我还想避免函数调用开销,因此不能为我收到的每个数据报调用某种回调。
我应该选择哪个?
【问题讨论】:
-
您认为刷新显示的速度有多快?每秒60次?每秒120次?您认为观看显示器的人可以多快看到它的更新?对网络的响应比您实际更新显示的速度更快有什么好处?
-
@Jean-PaulCalderone,当一个特别重要的数据到达时,我只需要更新一次 - 但是当它更新时,我需要快速完成;将有一个 240 赫兹的显示屏,可能带有 G-sync
标签: sockets callback udp twisted latency