在OpenGL中绘制多个四边形的最有效方法

时间:2010-05-14 01:53:58

标签: c# opengl 2d textures quadratic

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

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

组成
Dictionary<Point, Tile>

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

我在测试中绘制图块的原始方法是迭代ScreenObject并分别在每个位置绘制每个四边形。据我所知,这是对资源的巨大浪费。测试中的速度并不是非常慢,但在我完成动画类和效果类之后,我确信它会非常慢。

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

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

2 个答案:

答案 0 :(得分:0)

我怀疑使用Dictionary会比使用直接数组慢。如果您的世界由512x512磁贴组成,那么您将分配长度为512x512(262144)的阵列。你可以使用“array [x +(y * 512)]”来获取该数组中任何给定的tile。

你知道有多少个瓷砖存储一个数组,其中每个都指向该位置的瓷砖或者列表中的瓷砖索引(你可能会以这种方式节省内存,因为你可以保留所有瓷砖在一个小于65536,甚至可能是256的数组中,因此将索引存储为16位。

然后,您可以找到要渲染的阵列区域。为了达到最佳效果,您希望尽可能避免切换纹理。所以我首先要检查你的瓷砖有多大我然后尝试将尽可能多的纹理组合成一个大的纹理。然后设置UV以对此大纹理的子部分进行采样。这样您就可以使用一些大纹理来限制使用的纹理数量。当然,您可能会发现给定的瓷砖集(例如岩石地面)将使用相同的纹理组。在某处可能还有一些混合到草地,所以很可能值得保持两个大纹理的草纹理,以避免做这么多纹理交换。即牺牲视频内存的速度。

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

答案 1 :(得分:0)

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

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

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