我想在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中创建游戏循环的更好方法,我真的很感激,谢谢你
答案 0 :(得分:5)
AfterFunc
在goroutine中执行注册的函数。 https://golang.org/pkg/time/#AfterFunc
虽然一次只运行2个例行程序,但整个程序中有314个(可能??不确定goroutine id如何工作)goroutines。
我不认为这是一个更好的"方式,但不同的方式,我的首选,可能是将游戏循环建模为for
循环。
func gameLoop() {
tick := time.Tick(16 * time.Millisecond)
for {
select {
case <-tick:
}
}
}
除了简要地为一个时间间隔注册一个案例之外,通过一个频道选择,你可以通过为<-time.After
添加另一个案例,或通过为{{1添加另一个案例来轻松地为超时建模通道。