我注意到在一些基于图块的游戏引擎中,图块被保存为灰度,有时甚至是黑色或白色,然后通过存储“调色板”来添加颜色以应用于某些像素,但我从未见过它是如何知道哪些像素。
仅举几个我见过的使用它的引擎,Notch 的 Minicraft 和 Gameboy 的旧 Pokemon 游戏。这就是告诉我如何在旧游戏中使用调色板的原因:解构器
从我所看到的人们在教程中使用这种技术的情况来看,它使用了一种位移形式,但是我想知道它是如何如此高效以至于它在旧的 8 位控制台中几乎是强制性的——它是如何可以将红色、绿色和蓝色应用于每帧图像的特定像素,而不是保存整个彩色图像(一些伪代码会很好)。
1 回答
它的有效之处在于它可以节省内存。存储 RGB 值通常需要 24 位(每个通道 8 位)。虽然拥有 256 种颜色的调色板(需要 256*24 位 = 768 字节),但每个像素只需要 8 位(2^8 = 256 种颜色)。因此,可以在相同数量的内存中存储三倍的像素(如果您不计算所需的调色板),但显然颜色有限。这曾经在硬件中得到支持,因此图形内存也可以更有效地使用(现代 PC 硬件实际上仍然支持这一点,但几乎从未使用过,因为图形内存不再那么有限了)。
一些硬件(包括第一批 Pokemon 游戏支持的 Super Gameboy)一次使用多个硬件调色板。不同的图块集映射到不同的调色板。但是将图块映射到不同调色板的方式非常依赖于硬件,并且通常不是很直接。
存储图像位的方式也不总是那么简单。如果像素是 8 位,则它可以是一个字节数组,其中每个字节就是一个像素(就像许多旧 DOS 游戏中使用的经典 VGA 模式一样)。但是例如 Gameboy 每个像素使用 2 位,其他使用 4,即每个调色板 2^4 = 16 种颜色。在内存中排列位的常用方法是使用位平面。即(在 16 个彩色图形的情况下)存储 4 个单独的黑白图像。但在某些情况下,位平面也可以以不同的方式交错。因此,对于如何以这种方式解码/编码图形没有简单而通用的答案。所以我想你必须更具体地说明你想要伪代码的目的。
而且我不确定这是否适用于 Minicraft。也许只是图形存储在磁盘上的方式。但是一旦将图形加载到图形内存中,它就没有意义了。(也许您对 Minicraft 的其他一些功能有所了解?)