golang - 网络游戏中的主循环

时间:2012-12-08 09:03:12

标签: go

我现在才开始修改Go大约一个星期了,我对它印象深刻。但是,我还有一些问题我无法理解。

现在的主要问题是,当我有连接处理代码工作时,我想添加一个独立于连接循环的主游戏循环。如何做到这一点?

package main

import (
  "fmt"
  "net"
  "strconv"
  "time"
  "galaxy"
)

const PORT = 5555

func main() {
  playerFactory := galaxy.NewPlayerFactory()

  server, err := net.Listen("tcp", ":" + strconv.Itoa(PORT))
  if server == nil {
    panic("listen failed: " + err.Error() + "\n")
  } else {
    defer server.Close()
  }

  // main loop  
  go func() {
    for {   
      // entity updates
      playerFactory.Update()
    }
  }() // adding this just blocks everything after the goroutine

  // connection handling
  for {
    conn, err := server.Accept()
    if err != nil {
      fmt.Printf("client error: %s\n", err.Error())
    } else {
      playerFactory.CreatePlayer(conn)
    }
  }

}

按照当前编写的方式运行主循环(这是我尝试添加的部分),但是忽略了连接处理代码。这是一个使用频道来控制的地方吗?我确信解决方案对于一位经验丰富的Go程序员来说是显而易见的,我期待着你的回答。

1 个答案:

答案 0 :(得分:4)

如果playerFactory.Update()从未释放CPU(例如通过阻止资源),则无法保证其他goroutine可以运行

您可以尝试更改GOMAXPROCS,但这取决于您的CPU数量,以后问题会在其他非阻塞goroutine中重新出现。

我看不出有任何理由让游戏循环不间断地运行。最常见的情况是你必须定期做某事。

在这种情况下,您的代码将是

  // main loop  
  go func() {
     timer := time.Tick(100 * time.Millisecond)
     for now := range timer {   
         // entity updates (you could use now for physic engine calculs)
         // this is called every 100 millisecondes
         playerFactory.Update()
     }
  }()
相关问题