go-sdl2 在第一个 运行 之后不清除 window 表面

go-sdl2 not clearing window surface after first run

我刚刚开始学习 http://lazyfoo.net/tutorials/SDL/index.php 的 SDL 教程课程,并且正在学习第一课(第 01 课)。我正在使用 github.com/veandco/go-sdl2 库手动 运行 将 C/C++ 代码转为 Go。

这是我的代码:

package main

import (
    "github.com/veandco/go-sdl2/sdl"
)

const screenWidth, screenHeight = 800, 600

func main() {
    defer sdl.Quit()
    if err := sdl.Init(sdl.INIT_VIDEO); err != nil {
        panic(err)
    }

    window, err := sdl.CreateWindow("SDL Tutorial",
        int32(sdl.WINDOWPOS_UNDEFINED), int32(sdl.WINDOWPOS_UNDEFINED),
        screenWidth, screenHeight, uint32(sdl.WINDOW_SHOWN))
    if err != nil {
        panic(err)
    }
    defer window.Destroy()

    screenSurface, err := window.GetSurface()
    if err != nil {
        panic(err)
    }

    if err = screenSurface.FillRect(nil,
        sdl.MapRGB(screenSurface.Format, 0xff, 0xff, 0xff)); err != nil {
        panic(err)
    }

    if err = window.UpdateSurface(); err != nil {
        panic(err)
    }

    sdl.Delay(2000)
}

第一次运行,它画了一个空白(白色背景)window,但之后每次,它都画了一个t运行sparent window ,显示 windows 桌面 运行ning 在它后面。

我不确定我做错了什么。

我 运行在 Ubuntu 17.10 的 KDE window 管理器上 运行ning Go 1.10,如果有什么不同的话。

更新

当我 运行 XFCE 而不是 KDE 时,不会 出现问题。

添加事件循环并无条件地或在 window 经理 (SDL_WINDOWEVENT) 要求时重绘。你不能只画一次就期望东西留在屏幕上,甚至永远可见(例如,你的画发生在 window 经理准备好展示你的 window 之前),尤其是合成 window 经理。