我想在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/

10-15 07:28