我编写了一个非常基本的贪吃蛇游戏,就输入/输出而言,我采用了以下方法:
MVar
来存储最近的按键;withAsync
生成两个线程,我将 MVar
传递给这两个线程;
tryTakeMVar
检查是否按下了任何键,然后根据按下的键(如果有)更新游戏状态(我的意思是,即使没有按下任何键,它也会更新状态)getChar
上,当按下某个键时,它使用 putMVar
来存储它,以便前一个线程拾取它。现在,《贪吃蛇》肯定不是一款需要你长时间呆在那里而不按键的游戏,但是,考虑到 thead 2 的处理量很小,我知道它在 99% 的时间里都被阻止了。最少。
这看起来不像是线程的良好用法,所以我可以做更好的事情吗?我确实认为我对多线程的理解一定存在一些根本性的缺陷,因为我情不自禁地认为
某事必须空闲等待输入,否则谁会接手它?如果不是一根线,那东西会是什么?
我可以想到一种单线程方法,其中使用假设的超时版本getChar
并将其用作更新游戏状态的循环的一部分,但这听起来不像是一种可以扩展到更严肃的游戏的方法.
事实上,你的两个线程主要是在等待,除非你的蛇是超音速的:)并且以最大速度运行。
一个线程等待用户输入