run.go
func RunWithoutMainLoop(f func(*Image) error, width, height int, scale float64, title string) <-chan error {
	f = (&imageDumper{f: f}).update

	c := newUIContext(f)
	theUIContext.Store(c)

	atomic.StoreInt32(&isRunning, 1)
	return uiDriver().RunWithoutMainLoop(width, height, scale, title, c, graphicsDriver())
}
func RunWithoutMainLoop(f func(*Image) error, width, height int, scale float64, title string) <-chan error {
	f = (&imageDumper{f: f}).update

	c := newUIContext(f)
	theUIContext.Store(c)

	atomic.StoreInt32(&isRunning, 1)
	return uiDriver().RunWithoutMainLoop(width, height, scale, title, c, graphicsDriver())
}
// RunWithoutMainLoop runs the game, but don't call the loop on the main (UI) thread.
// Different from Run, RunWithoutMainLoop returns immediately.
//
// Ebiten users should NOT call RunWithoutMainLoop.
// Instead, functions in github.com/hajimehoshi/ebiten/mobile package calls this.