Skip to content

Part III: マルチタスキングとスケジューリング

概要

本章では、ゲームループを例にマルチタスキングとスケジューリングを学びます。


ゲームタスク

case class GameTask(name: String, action: () => Unit):
  def run(): Unit = action()

イベント同期

class ProcessorFreeEvent:
  private val lock = new Object
  @volatile private var signaled = false

  def waitForSignal(): Unit = lock.synchronized {
    while !signaled do lock.wait()
  }

  def signal(): Unit = lock.synchronized {
    signaled = true
    lock.notifyAll()
  }

  def reset(): Unit = lock.synchronized {
    signaled = false
  }

ゲームループ

object GameLoop:
  /** Run all tasks in a single frame */
  def runOneFrame(tasks: List[GameTask]): Unit =
    tasks.foreach(_.run())

  /** Run game loop for specified number of frames */
  def run(tasks: List[GameTask], frames: Int): Unit =
    (1 to frames).foreach { frame =>
      println(s"Frame $frame")
      runOneFrame(tasks)
    }

使用例

val tasks = List(
  GameTask("Input", () => println("Processing input...")),
  GameTask("Update", () => println("Updating game state...")),
  GameTask("Render", () => println("Rendering frame..."))
)

GameLoop.run(tasks, 3)

ポイント

  • case class: イミュータブルなデータ構造
  • synchronized: JVM レベルのロック
  • @volatile: メモリ可視性の保証

次のステップ

Part IV では、Fork/Join パターンとパイプラインを学びます。