在游戏中,除了让空闲线程等待用户输入之外,还有其他选择吗?

问题描述 投票:0回答:1

我编写了一个非常基本的贪吃蛇游戏,就输入/输出而言,我采用了以下方法:

  • 我创建一个
    MVar
    来存储最近的按键;
  • 我使用
    withAsync
    生成两个线程,我将
    MVar
    传递给这两个线程;
    1. 一个线程使用
      tryTakeMVar
      检查是否按下了任何键,然后根据按下的键(如果有)更新游戏状态(我的意思是,即使没有按下任何键,它也会更新状态)
    2. 另一个线程只是阻塞在
      getChar
      上,当按下某个键时,它使用
      putMVar
      来存储它,以便前一个线程拾取它。

现在,《贪吃蛇》肯定不是一款需要你长时间呆在那里而不按键的游戏,但是,考虑到 thead 2 的处理量很小,我知道它在 99% 的时间里都被阻止了。最少。

这看起来不像是线程的良好用法,所以我可以做更好的事情吗?

我确实认为我对多线程的理解一定存在一些根本性的缺陷,因为我情不自禁地认为

某事

必须空闲等待输入,否则谁会接手它?如果不是一根线,那东西会是什么?

我可以想到一种单线程方法,其中使用假设的超时版本
getChar

并将其用作更新游戏状态的循环的一部分,但这听起来不像是一种可以扩展到更严肃的游戏的方法.

    

multithreading haskell io game-development
1个回答
0
投票

事实上,你的两个线程主要是在等待,除非你的蛇是超音速的:)并且以最大速度运行。

一个线程等待用户输入
  • 一个线程处理游戏逻辑并等待下一个时钟周期
  • 通常还有另一个线程将游戏状态渲染到屏幕上。在你的情况下,你可能只是更新视频缓冲区,所以你不需要它。
© www.soinside.com 2019 - 2024. All rights reserved.