2010-05-14 123 views
0

我一直在生产这个基于2d的基于tile的游戏引擎,以用于几个项目。在OpenGL中绘制多个四边形的最有效方法

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

Dictionary<Point, Tile> 

的点关键是要显示在何处渲染屏幕上的瓷砖和瓷砖包含一个或多个纹理是在那一刻画出来。这个ScreenObject是瓷砖将被修改,删除,添加等等。

我在测试中绘制瓷砖的原始方法是遍历ScreenObject并在每个位置分别绘制每个四边形。从我看过的文字来看,这是一个巨大的资源浪费。在测试中速度并不是很慢,但是在完成动画课程和效果课程后,我相信它会非常缓慢。

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

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

回答

0

我怀疑使用字典会比只使用直阵列慢。如果你的世界包含512x512瓦片,那么你可以分配一个长度为512x512(262144)的数组。 YTou可以通过使用“array [x +(y * 512)]”来获得该数组中任何给定的图块。

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

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

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

0

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

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

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

相关问题