我一直在制作这个基于2d瓦片的游戏引擎,用于几个项目中。
我有一个名为"ScreenObject“的类,它主要由一个
Dictionary<Point, Tile>
point键用于显示在屏幕上渲染Tile的位置,并且Tile包含一个或多个要在该点绘制的纹理。此ScreenObject是将修改、删除、添加等磁贴的位置。
我在测试中绘制图块的原始方法是遍历ScreenObject,并在每个位置分别绘制每个四边形。据我所知,这是对资源的巨大浪费。它在测试中并不是特别慢,但在我完成了动画类和效果类之后,我确信它会非常慢。
最后一件事,如果你不介意的话..正如我之前所说的,Tile类可以包含多个要在屏幕上的Point位置绘制的纹理。
我认为我在这里可能有两个选择。或者在要绘制的每个纹理的该位置添加一个四边形,或者以某种方式..对同一四边形使用多个纹理(如果可能)。即使每个瓷砖只包含一个纹理,也就是在屏幕上绘制64个四边形。大多数瓷砖将包含2-5个纹理,因此使用此方法将显著增加四边形的总数。是否可以为每个新纹理添加一个四边形,或者我忽略了一个更好的方法?
发布于 2010-05-14 07:49:01
我怀疑使用字典会比直接使用数组慢。如果你的世界由512x512瓦片组成,那么你分配一个长度为512x512 (262144)的数组。YTou可以通过使用"arrayx + (y * 512)“获得该数组中的任何给定瓦片。
你知道有多少瓦片,所以存储一个数组,每个瓦片要么指向该位置的瓦片,要么在列表中有一个到瓦片的索引(这样可能会节省内存,因为你可以将所有瓦片的大小保持在小于65536甚至256的数组中,从而将索引存储为16位。
然后找到数组中要渲染的区域。要以最佳方式执行此操作,您需要尽可能避免切换纹理。所以第一件事,我会检查你的瓷砖有多大,然后试着把所有的纹理组合成一个大的纹理。然后设定UV以对此大纹理的子部分进行采样。通过这种方式,您应该能够限制使用几个大纹理的纹理数量。当然,你可能会发现一个给定的瓦片集(比方说岩石地面)将使用相同的纹理组。也可能会有一些混合到草的地方,所以它可能很值得在两个大纹理中持有草纹理,以避免进行如此多的纹理交换。即牺牲视频内存来换取速度。
然后迭代数组的可见部分,使用texture 1绘制所有瓦片,然后使用texture 2绘制所有瓦片,依此类推。
发布于 2013-04-15 17:55:28
我建议使用由三角形+索引组成的单个VAO对象。计算客户端的位置,并在每一帧上更新它(流)。
使用纹理图集在单个纹理中存储所有内容(以避免切换状态)。您可以使用纹理打包器工具。
一次渲染(如果启用了深度缓冲区)。否则,首先渲染不透明的对象,然后渲染应该混合的所有对象。
https://stackoverflow.com/questions/2831402
复制