Golang中的博弈循环模拟

Golang中的博弈循环模拟,go,goroutine,game-loop,Go,Goroutine,Game Loop,我想在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

我想在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*时间.毫秒)
,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
那么,
goroutine314[运行]
的含义是什么?我是否使用314 goroutine进行了5秒的游戏循环?如果这个能运行几个小时呢

但是,如果程序使用运行时包并打印
runtime.NumGoroutine
这是goroutine的返回编号,则结果是
Goroutines:2

那么,请再说一遍,
goroutine314[运行]
的含义是什么?而运行时包说的是不同的事情


最后,如果有人能告诉我在golang创建游戏循环的更好方法,我真的很感激,谢谢你,AfterFunc在goroutine中执行注册函数

虽然一次只运行2个go例程,但在整个程序中有314个go例程(可能?不确定goroutine ID如何工作)


我不认为这是一种“更好”的方式,但我的另一种方式是将游戏循环建模为<<代码> Roo.

func gameLoop()  {
    tick := time.Tick(16 * time.Millisecond)

    for {
        select {
        case <-tick:

        }
    }
}
func gameLoop(){
滴答声:=时间滴答声(16*时间毫秒)
为了{
挑选{

case
AfterFunc
执行goroutine中注册的函数

虽然一次只运行2个go例程,但在整个程序中有314个go例程(可能?不确定goroutine ID如何工作)


我不认为这是一种“更好”的方式,但我的另一种方式是将游戏循环建模为<<代码> Roo.

func gameLoop()  {
    tick := time.Tick(16 * time.Millisecond)

    for {
        select {
        case <-tick:

        }
    }
}
func gameLoop(){
滴答声:=时间滴答声(16*时间毫秒)
为了{
挑选{

case它甚至可以用更短的方式编写:
表示范围时间。勾选(16*time.millis秒){…}
。你的建议要好得多-更紧凑、更可读、更少的GC压力、更少的上下文切换,当然更地道。我发现这比
time.AfterFunc()更优雅
。谢谢你的回答。这就像有一个时间步长吗?这能每秒工作30帧吗?@majidarif如果你做数学,它可以,是的-这里的答案是基于60fps(16ms*60~=1s)。它甚至可以用更短的方式写:
表示距离时间。勾选(16*time.毫秒){…}
。你的建议要好得多-更紧凑、更可读、GC压力更小、上下文切换更少,当然更惯用。我发现这比
time.AfterFunc()更优雅
。谢谢你的回答。这像是有一个时间步长吗?它每秒工作30帧吗?@majidarif如果你计算一下,它可以,是的-这里的答案是基于60fps(16ms*60~=1s)。