gpt4 book ai didi

go - Golang 中的游戏循环模拟

转载 作者:IT王子 更新时间:2023-10-29 02:27:37 25 4
gpt4 key购买 nike

我想在 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 用于在之后调用 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

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:

}
}
}

除了简洁地为间隔注册一个案例之外,通过为 <-time.After 添加另一个案例,选择 channel 还可以让您轻松地为超时建模。 ,或取消,通过为 <-done 添加另一个案例 channel 。

关于go - Golang 中的游戏循环模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40696458/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com