zworld/engine/run.go
2024-01-14 22:56:06 +08:00

82 lines
1.5 KiB
Go

package engine
import (
"log"
"runtime"
"time"
"zworld/engine/object"
"zworld/engine/render/graph"
"zworld/engine/renderapi/vulkan"
)
type SceneFunc func(object.Object)
type RendererFunc func(vulkan.App, vulkan.Target) graph.T
type Args struct {
Title string
Width int
Height int
Renderer RendererFunc
}
func Run(args Args, scenefuncs ...SceneFunc) {
log.Println("goworld")
runtime.LockOSThread()
go RunProfilingServer(6060)
interrupt := NewInterrupter()
backend := vulkan.New("goworld", 0)
defer backend.Destroy()
if args.Renderer == nil {
args.Renderer = graph.Default
}
// create a window
wnd, err := vulkan.NewWindow(backend, vulkan.WindowArgs{
Title: args.Title,
Width: args.Width,
Height: args.Height,
Frames: 3,
})
if err != nil {
panic(err)
}
defer wnd.Destroy()
// create renderer
renderer := args.Renderer(backend, wnd)
defer renderer.Destroy()
// create scene
scene := object.Empty("Scene")
wnd.SetInputHandler(scene)
for _, scenefunc := range scenefuncs {
scenefunc(scene)
}
// run the render loop
log.Println("ready")
counter := NewFrameCounter(60)
for interrupt.Running() && !wnd.ShouldClose() {
// update scene
wnd.Poll()
counter.Update()
scene.Update(scene, counter.Delta())
// draw
renderer.Draw(scene, counter.Elapsed(), counter.Delta())
}
}
func RunGC() {
start := time.Now()
runtime.GC()
elapsed := time.Since(start)
if elapsed.Milliseconds() > 1 {
log.Printf("slow GC cycle: %.2fms", elapsed.Seconds()*1000)
}
}