我们有一个(可能很大的)横向滚动2D世界,有很多重复的瓷砖(例如地形,墙壁,水等)。例如,有很大的“山丘”可能非常高,但是使用同样的小块“摇滚”纹理。
我想优化这个世界的存储和渲染(最好是绘制一个大的四边形并对其应用相同的重复纹理,而不是分别绘制很多小的相邻四边形)。
这样做的好方法是什么?目前我看到了两个可能的解决方案:
如果你曾经参与过类似的游戏,我很乐意听你的特定解决方案。
答案 0 :(得分:0)
由于你不会绘制矩形(但是三角形),我建议选择第二个选项。此外,永远不要相信您的程序的用户。
第一项任务是将地图划分为相同纹理的多边形。由于您的地形基于网格,因此可以通过一种填充与标记算法相结合的方式非常容易地实现这一点。像这样:
- n := 0 // will be the polygon numbers
- Iterate over each grid cell
- If cell is marked, continue with next cell
- mark cell with n
- check adjacent cells for the same texture and mark them accordingly *
- n := n + 1
*此步骤可以通过多种方式执行:FloodFill。此外,您应该为每个块存储边缘单元格。即具有至少一个具有不同纹理的相邻单元的单元。我们称之为种子细胞。
然后你的网格标有多边形数字,n等于多边形数。
下一步是提取多边形。这就是种子细胞会有所帮助的地方。对于每个块,从种子单元开始,沿着块的边缘运行,收集所有角点。这些角点将成为您的多边形。
之后你有一组多边形。最后一步是对多边形进行三角剖分以进行渲染。这可以通过例如实现。使用Ear Cutting / Clipping Algorithm或其他人。
答案 1 :(得分:0)
如果你可以使用像素着色器,另一种方法是提供一个“tile-atlas”纹理,其中包含所有可能的图块,这些图块一起刷成光照贴图样式的纹理,并提供更小的“tilemap”纹理(screenWidth / tileWidth X screenHeight / tileHeight),其中包含指向tilemap中该位置的“tile type”的单个组件。
然后,您可以绘制单个全屏,屏幕对齐的四边形,像素着色器将使用当前图块类型对“图块 - 图集”进行采样,并将这些像素放在屏幕上。当前变化的纹理坐标以及四边形的宽度/高度的知识可用于获取着色器内的当前像素位置。
然后可以根据需要更新“tilemap”纹理以更改当前级别。