我想在go(lang)中创建游戏循环,所以我尝试了以下方法:
package main
import (
"fmt"
// "runtime"
"sync"
"time"
)
var v = 0
var wg sync.WaitGroup
var sec = 5
func main() {
wg.Add(1)
gameLoop()
wg.Wait()
}
func gameLoop() {
time.AfterFunc(16*time.Millisecond, gameLoop)
v++
fmt.Println(v)
if v == sec*60 {
// fmt.Println("Goroutines: ", runtime.NumGoroutine())
panic("err")
wg.Done()
}
}
该程序以62.5Hz的频率运行
(16*time.Millisecond)
,var sec
用于在5秒钟后调用wg.Done()
并导致var v
打印300次。调用
panic("err")
使得结果如下:panic: err
goroutine 314 [running]:
panic(0x493c60, 0xc420094370)
/usr/local/go/src/runtime/panic.go:500 +0x1a1
main.gameLoop()
/home/billyzaelani/Desktop/main.go:26 +0x11f
created by time.goFunc
/usr/local/go/src/time/sleep.go:154 +0x44
exit status 2
那么
goroutine 314 [running]
是什么意思?我是否使用314 goroutine进行了5秒的游戏循环?如果运行几个小时怎么办?但是,如果程序使用运行时包并打印
runtime.NumGoroutine
(即goroutine的返回编号),则结果为Goroutines: 2
那么,再次返回
goroutine 314 [running]
是什么意思?而运行时程序包说了不同的话。最后一个,如果有人可以向我展示在golang中创建游戏循环的更好方法,我真的很感谢,谢谢
最佳答案
AfterFunc
在goroutine中执行注册的功能。 https://golang.org/pkg/time/#AfterFunc
虽然一次只运行2个go例程,但整个程序中却有314个(可能不确定goroutine id如何工作)goroutine。
我不认为这是一种“更好”的方式,但是我更喜欢的另一种方式是将游戏循环建模为for
循环。
func gameLoop() {
tick := time.Tick(16 * time.Millisecond)
for {
select {
case <-tick:
}
}
}
除了简洁地记录一个时间间隔的大小写之外,通过选择一个 channel ,还可以通过为
<-time.After
添加另一个大小写,或者通过为<-done
channel 添加另一个大小写,轻松地对超时进行建模。关于go - Golang中的游戏循环模拟,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40696458/