bil*_*ani 1 go game-loop goroutine
我想在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()
}
}
Run Code Online (Sandbox Code Playgroud)
该程序以62.5Hz运行(16*time.Millisecond),var sec用于wg.Done()在5秒后调用并导致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
Run Code Online (Sandbox Code Playgroud)
那是什么意思goroutine 314 [running]?我使用314 goroutine进行5秒游戏循环吗?怎么这运行几个小时?
但是,如果程序使用运行时包并打印runtime.NumGoroutine返回goroutine的数量,结果是Goroutines: 2
那么,又回到了什么意思goroutine 314 [running]?而运行时包说不同的东西.
最后一个,如果有人能告诉我在golang中创建游戏循环的更好方法,我真的很感激,谢谢
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:
}
}
}
Run Code Online (Sandbox Code Playgroud)
除了简单地为一个间隔注册一个案例之外<-time.After,通过为一个<-done频道添加另一个案例,通过添加另一个案例或取消,可以通过频道选择来轻松地模拟超时.
| 归档时间: |
|
| 查看次数: |
940 次 |
| 最近记录: |