0

我一直在制作这个基于 2d 瓦片的游戏引擎,用于多个项目。

我有一个名为“ScreenObject”的类,它主要由

Dictionary<Point, Tile>

Point 键是显示在屏幕上渲染 Tile 的位置,并且 Tile 包含一个或多个要在该点绘制的纹理。这个 ScreenObject 是图块将被修改、删除、添加等的地方。

我在测试中绘制瓷砖的原始方法是遍历 ScreenObject 并分别在每个位置绘制每个四边形。根据我的阅读,这是对资源的巨大浪费。在测试中并没有慢到可怕,但是在我完成了动画类和效果类之后,我相信它会非常慢。

最后一件事,如果你不介意的话。正如我之前所说,Tile 类可以包含多个要在屏幕上的 Point 位置绘制的纹理。

我在这里认识到可能有两种选择。为每个要绘制的纹理在该位置添加一个四边形,或者以某种方式..为同一个四边形使用多个纹理(如果可能的话)。即使每个图块仅包含一个纹理,也将在屏幕上绘制 64 个四边形。大多数图块将包含 2-5 个纹理,因此使用此方法总四边形的数量会显着增加。为每个新纹理添加一个四边形是否可行,还是我忽略了更好的方法?

4

2 回答 2

0

我怀疑使用 Dictionary 会比使用直接数组要慢。如果您的世界由 512x512 个图块组成,那么您分配一个长度为 512x512 (262144) 的数组。YTou 可以使用“array[x + (y * 512)]”获取该数组中的任何给定图块。

您知道有多少个图块,因此存储一个数组,每个数组要么指向该位置的图块,要么在列表中具有该图块的索引(您可能会以这种方式节省内存,因为您可以将所有图块保存在一个数组中大小小于 65536,甚至可能是 256,因此将索引存储为 16 位。

然后,您可以找到要渲染的阵列区域。要以最佳方式执行此操作,您需要尽可能避免切换纹理。所以首先我会检查你的瓷砖有多大,然后尝试将尽可能多的纹理组合成一个大纹理。然后设置你的 UV 来采样这个大纹理的一个子部分。这样,您应该能够限制使用一些大纹理的纹理数量。当然,您可能会发现给定的图块集(例如岩石地面)将使用相同的纹理组。也可能在某处与草混合,因此可能值得将草纹理保留在两个大纹理中,以避免进行如此多的纹理交换。即牺牲显存换取速度。

然后迭代数组的可见部分并使用纹理 1 绘制所有图块,然后使用纹理 2 绘制所有图块,依此类推。

于 2010-05-14T07:49:00.680 回答
0

我建议使用由三角形 + 索引组成的单个 VAO 对象。计算客户端的位置并在每一帧(流)上更新它。

使用纹理图集将所有内容存储在单个纹理中(以避免切换状态)。您可以使用纹理打包工具。

一次渲染(如果您启用了深度缓冲区)。否则先渲染不透明的对象,然后渲染所有应该混合的对象。

于 2013-04-15T17:55:28.377 回答