2d游戏引擎png8(调色板)图片渲染构想

        所谓调色板就是保存256个颜色数据的数组,然后图片数据使用这256个数组中的索引表示,这样一个颜色就只占8位,同时大多数情况下还能够达到真彩色的效果。但是调色板毕竟不是真彩色,在现在的游戏做的越来越绚丽,并且显卡越来越牛x的时代,调色板就没有太大存在价值了。

        原本现代游戏引擎已经基本抛弃调色板的使用了,但是手机游戏的兴起和最近png8的使用让我有了一个新的想法。

        原来在端游时代,我们不会如此在意内存和客户端体积,但是手游时代就需要精打细算,一兆一兆的扣数据。  正因此,png8的图片格式显得非常有价值。他使用调色板的数据索引形式,体积比png32或png24的真彩色图片减少60%~80%,并且借助算法的优异性,压缩后的图片与原来图片一般无二(详细请查阅上一篇文章,里面有介绍相关工具)。我的游戏的绝大多数图片都是经过png8压缩的,甚至很多图片(颜色比较少的背景图片)png8比jpg还要小一半。

      但是游戏引擎(cocos2d-x)在加载png8的时候直接把其扩展为32位真彩色数据,然后当做正常png图片数据来进行渲染,这么做很简单,但是由于颜色位数直接扩展,所以内存占用上png8与png32是等价的。

      我认为应该有更加酷的解决方案。理想情况下,png8的内存占用应该是png32的八分之一。排开渲染效率问题,这几乎就是一个通用的压缩纹理。

      我的思路是这样的(注意,还没有试验和制作),从png图片中读取调色板信息,然后把其保存成一个调色板纹理挂接到真实纹理数据上面,png8图片创建时直接把调色板索引数据传入显卡,然后渲染使用特殊的shader,这个shader会自动从调色板纹理里面取颜色数据,返回真实的像素信息。这样只消耗八分之一的内存就可以达到很好的效果,并且理论上渲染效率也不会降低太多。  虽然shader切换会有一定的损耗,但是完全在可接受范围内。

      最后,我认为,这个方案完全是可行的,并且一定是可行的。因为sdl依然还保留了调色板功能。一个最优秀的2d游戏引擎,应该是把核心的功能做到极致的,外层接口由安全易用的。

你可能感兴趣的:(2d游戏引擎png8(调色板)图片渲染构想)