前言

现在我们已经可以在窗口里展示我们的图片了
由于图片的数量不多, 所以我们感觉不到渲染的速度, 但当你真正开发一款游戏的时候, 你会发现渲染未经处理的原图会使程序运行变得很慢
所以我们需要进行优化, 加速程序的运行

原理

大部分的位图都是24位的, 所以我们加载图片的时候, 都是以24位的格式进行加载
但是现在市面上的显示器有可能不是24位的, 所以当你每次渲染图片的时候, 都要将它的格式转换成显示器的格式
于是, 我们可以在创建 surface 的时候, 将其转换好, 这样就不用每次都转换了

代码

直接使用我们第2节的代码, 修改几行如下

package main

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

func main() {
    sdl.Init(sdl.INIT_EVERYTHING)
    defer sdl.Quit()

    window, _ := sdl.CreateWindow("test", sdl.WINDOWPOS_UNDEFINED, sdl.WINDOWPOS_UNDEFINED,
        670, 620, sdl.WINDOW_SHOWN)
    defer window.Destroy()

    surface, _ := window.GetSurface()
    defer surface.Free()
    surface.FillRect(nil, sdl.MapRGB(surface.Format, 0x0, 0x0, 0x0))

    //这里是关键的修改地方
    pngImage, _ := img.Load("../asserts/image/texture.png")
    optimizedImage, _ := pngImage.Convert(surface.Format, 0)
    defer optimizedImage.free()
    pngImage.Free()

    optimizedImage.Blit(nil, surface, nil)
    window.UpdateSurface()

    running := true
    for running {
        for event := sdl.PollEvent(); event != nil; event = sdl.PollEvent() {
            switch event.(type) {
            case *sdl.QuitEvent:
                println("Quit")
                running = false
                break
                break
            }
        }
        sdl.Delay(16)
    }
}
  1. 如前, pngImage 为原始 surface
  2. pngImage.Convert 为转换函数, 第一个参数即为窗口 surface 的格式, 第二个参数为 0
  3. 转换之后需要将原始 surface 的内存释放掉, 之后直接使用 optimizedImage 就好了
  4. 其他的代码不变

源码 https://gitee.com/fcsvr/tank.git