为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
不负相思意 2021-08-10 15:29:27
我有一个 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
查看完整描述

1 回答

?
UYOU

TA贡献1878条经验 获得超4个赞

间距参数期望表面的宽度 * 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)。


查看完整回答
反对 回复 2021-08-10
  • 1 回答
  • 0 关注
  • 186 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信