我现在才开始修改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程序员来说是显而易见的,我期待着你的回答。
答案 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()
}
}()