在 SDL Go 程序中复制纹理时的运行时恐慌

我有一个 SDL2 go 程序,它试图将像素阵列写入屏幕。当我尝试使用新像素更新纹理时,程序会因运行时错误而恐慌:


fatal error: unexpected signal during runtime execution

不幸的是,我几乎找不到关于如何在 Go 中传递不安全指针的文档,我不确定我是否正确地处理了这个问题,下面是一些展示问题的示例代码:


func main() {

    window := sdl.CreateWindow("test", sdl.WINDOWPOS_UNDEFINED, sdl.WINDOWPOS_UNDEFINED,

        800, 600, sdl.WINDOW_SHOWN)

    renderer := sdl.CreateRenderer(window, -1, 0)

    texture := sdl.CreateTexture(renderer, sdl.PIXELFORMAT_ARGB8888,

        sdl.TEXTUREACCESS_STATIC, 800, 600)


    defer renderer.Destroy()

    defer texture.Destroy()

    defer window.Destroy()


    for {

        pixels := make([]uint32, 800*600)


        texture.Update(nil, unsafe.Pointer(&pixels), int(800*unsafe.Sizeof(pixels)))

        window.UpdateSurface()


        renderer.Clear()

        renderer.Copy(texture, nil, nil)

        renderer.Present()

    }


    sdl.Delay(1000)

    sdl.Quit()

}

这段代码编译时不会出错,但运行时会产生运行时恐慌,但我看不出这段代码中是什么导致了这种情况。


我正在使用这些 SDL2 Go 绑定:https : //github.com/veandco/go-sdl2


不负相思意
浏览 187回答 1
1回答

UYOU

间距参数期望表面的宽度 * sizeof(int32) 尽我所能,此代码有效并在每个循环中打印随机像素:func main() {    window, err := sdl.CreateWindow("test", sdl.WINDOWPOS_UNDEFINED,        sdl.WINDOWPOS_UNDEFINED, 800, 600, sdl.WINDOW_SHOWN)    if err != nil {        log.Fatal(err)    }    defer window.Destroy()    renderer, err := sdl.CreateRenderer(window, -1, 0)    if err != nil {        log.Fatal(err)    }    defer renderer.Destroy()    texture, err := renderer.CreateTexture(sdl.PIXELFORMAT_ARGB8888,        sdl.TEXTUREACCESS_STATIC, 800, 600)    if err != nil {        log.Fatal(err)    }    defer texture.Destroy()    pixels := make([]uint32, 800*600)L:    for {        for event := sdl.PollEvent(); event != nil; event = sdl.PollEvent() {            if _, ok := event.(*sdl.QuitEvent); ok {                break L            }        }        for i := range pixels {            pixels[i] = 0x00777777 + uint32(rand.Intn(0x00AAAAAA))        }        //4 == sizeof(int32), unsafe.Sizeof(pixels) returns the actual size of        //the slice header which is 24        texture.Update(nil, unsafe.Pointer(&pixels[0]), 800*4)        window.UpdateSurface()        renderer.Clear()        renderer.Copy(texture, nil, nil)        renderer.Present()    }    sdl.Delay(1000)    sdl.Quit()}//编辑它应该unsafe.Pointer(&pixels[0])不是unsafe.Pointer(&pixels)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go