Golang 中的游戏循环模拟
Game Loop simulation in Golang
我想在 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()
}
}
这个程序运行ning at 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
,即return个goroutine,结果是Goroutines: 2
那么,再回来goroutine 314 [running]
是什么意思呢?而 运行时间包说不同的话。
最后一个,如果有人能告诉我在 golang 中创建游戏循环的更好方法,我真的很感激,谢谢
AfterFunc
在 goroutine 中执行注册的函数。 https://golang.org/pkg/time/#AfterFunc
虽然一次只有 2 个 go routines 运行,但在整个程序中有 314 个(也许??不确定 goroutine ids 是如何工作的)goroutines。
我不认为它是一种 "better" 方式,但我更喜欢一种不同的方式,可以将游戏循环建模为 for
循环。
func gameLoop() {
tick := time.Tick(16 * time.Millisecond)
for {
select {
case <-tick:
}
}
}
除了为间隔简明地注册一个案例之外,选择一个通道还可以让您轻松地为超时建模,方法是为 <-time.After
添加另一个案例,或者为取消添加另一个案例,为 <-done
频道。
我想在 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()
}
}
这个程序运行ning at 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
,即return个goroutine,结果是Goroutines: 2
那么,再回来goroutine 314 [running]
是什么意思呢?而 运行时间包说不同的话。
最后一个,如果有人能告诉我在 golang 中创建游戏循环的更好方法,我真的很感激,谢谢
AfterFunc
在 goroutine 中执行注册的函数。 https://golang.org/pkg/time/#AfterFunc
虽然一次只有 2 个 go routines 运行,但在整个程序中有 314 个(也许??不确定 goroutine ids 是如何工作的)goroutines。
我不认为它是一种 "better" 方式,但我更喜欢一种不同的方式,可以将游戏循环建模为 for
循环。
func gameLoop() {
tick := time.Tick(16 * time.Millisecond)
for {
select {
case <-tick:
}
}
}
除了为间隔简明地注册一个案例之外,选择一个通道还可以让您轻松地为超时建模,方法是为 <-time.After
添加另一个案例,或者为取消添加另一个案例,为 <-done
频道。