gpt4 book ai didi

c# - 基于事件与轮询组件

转载 作者:太空宇宙 更新时间:2023-11-03 18:43:35 25 4
gpt4 key购买 nike

支持每种设计的考虑因素是什么?

假设我正在编写一个从设备(鼠标、游戏 handle 、触摸等)收集输入的输入组件。

设计它的一种方法是提供一个方法的 API,在给定的时间点测试给定的状态(这个按钮在这个帧中被按下了吗?)

另一种方法是让一些其他组件在每一帧连续调用该组件,检查这些内容,引发事件以通知正在发生的事情(例如——定义一个事件 MouseClicked,它将被 API 用户 Hook )。

为什么您会喜欢这些设计中的每一个?

最佳答案

从消费代码可以看出,“推”模型和“拉”模型之间存在差异。要么在输入设备的上下文中工作(在某种程度上,设备由操作系统轮询以用作事件的触发器,要么只是设置一个在下一次轮询之前有效的值)。我认为使用其中一个的决定取决于重要的是什么;是现在点击了,还是已经点击了?这种微小的语义差异可能意味着行为上的重大差异。

如果您正在寻找的是在您检查时按下按钮,则将其设置为轮询机制。提供一个属性,该属性的更新频率与您从库中知道的方式一样频繁,消费者将检查该属性以确定是否按下了按钮。

如果您需要传达某个时间某个按钮被按下,则将其设置为一个事件,该事件会将此信息“推送”给它的听众。

您想使用哪一个取决于您如何构造使用它的程序。 Windows GUI 游戏的程序从一开始就设计为简单地等待输入,最好由基于事件的模型提供服务。视频游戏,如横向卷轴,您必须知道输入的当前状态才能绘制下一帧,轮询机制可能会更好。

坦率地说,在这样的库中,并排设置这两个场景是微不足道的;更新一个属性,然后如果有人在听,就大声喊出来。这样,当用户觉得有必要实现他们的目的时,消费代码可以推送或拉取。

关于c# - 基于事件与轮询组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6497727/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com