1

正如标题所说,我正在充实 2D 平台游戏引擎的设计。它仍处于设计阶段,但我担心我会遇到渲染器问题,如果它们会成为问题,我想避免它们。

我将 SDL 用于我的基础库,并且游戏将设置为使用单个大数组Uint16来保存图块。这些索引到引擎的所有部分使用的第二个“图块定义”数组中,从碰撞处理到图形例程,这是我最关心的问题。

图形引擎设计为在 640x480 分辨率下运行,具有 32x32 瓦片。每帧每层绘制 21x16 个图块(用于处理滚动时显示的额外图块),最多可以绘制四个层。层只是单独的瓦片数组,但瓦片定义数组对所有四个层都是通用的。

我担心的是我希望能够利用这个引擎利用透明胶片和动画图块,而且由于我对设计不太熟悉,我担心我目前的解决方案效率太低运作良好。

我的目标 FPS 是每秒 60 帧,并且在绘制所有四个图层的情况下,我正在查看每秒需要绘制 21x16x4x60 = 80,640 个单独的 32x32px 块,以及精灵需要许多奇数大小的块,并且这似乎有点过分了。那么,有没有更好的方法来渲染我拥有的瓷砖地图设置?我正在寻找使用硬件加速来绘制瓷砖地图的可能性,如果它有助于提高性能。我也希望能够在稍微旧一点的电脑上运行这个游戏。

如果我在寻找太多,那么我认为降低引擎的能力是不可能的。

4

7 回答 7

4

我认为问题在于绘制调用的绝对数量,而不是您正在绘制的所有像素的总“填充率”。请记住 - 您必须每秒拨打超过 80000 次电话。我认为您最大的改进是以某种方式将这些批处理在一起。

降低瓦片和图层填充率的一种策略是将静态区域合成在一起。例如,如果您知道某个区域不需要更新,则可以对其进行缓存。很大程度上取决于图层是否独立滚动(视差样式)。

此外,在 Google 上查看“脏矩形”,看看是否有任何方案可以满足您的需求。

就个人而言,我只是试试看。这可能不会影响您的整体游戏设计,并且如果您在逻辑和表示之间有良好的分离,您可以优化瓷砖绘制直到奶牛回家。

于 2009-07-15T06:09:59.620 回答
2

确保仅在实际使用 alpha 的图块上使用 alpha 透明度,并跳过绘制空白图块。尽可能确保瓦片表面颜色深度与屏幕颜色深度匹配(对于具有 Alpha 通道的瓦片来说,这不是一个真正的选项),并将瓦片存储在视频内存中,因此 sdl 将尽可能使用硬件加速。对于不需要部分透明度或将抗锯齿边缘与背景混合的简单图块,色键透明度将比拥有完整的 Alpha 通道更快。

在 500mhz 系统上,每层每像素大约 6.8 个 cpu 周期,或每屏幕像素 27 个 cpu 周期,如果每层的每个图块上都有完整的 alpha 通道,这(我相信)是不够的,但应该如果您尽可能走上述提到的捷径,那就没问题了。

于 2009-07-15T06:24:08.843 回答
1

我同意康布瓦。如果这只是一个简单的基于图块的 2D 游戏,你真的应该降低一点标准,因为这不是孤岛危机。30FPS 非常流畅(研究命令与征服 3 限制为 30FPS)。尽管如此,我还是使用 GDI+ 编写了一个以 14FPS (1900 x 1200) 运行的远程桌面查看器,它仍然非常流畅。我认为对于您的 2D 游戏,您可能会没事,尤其是使用 SDL。

于 2009-07-15T06:11:39.773 回答
1

您可以将每个完整图层缓冲到其视图中,再加上所有四个末端的额外平铺大小(如果您有垂直滚动),再次使用缓冲区创建一个新缓冲区减去第一列并在新的末端列上绘图吗?这将减少很多不必要的重绘。

此外,如果您想要 60fps,您可以查找为较慢的系统创建跳帧方法的方法,每隔一个或每隔三个绘制阶段跳过一次。

于 2009-12-07T02:55:15.390 回答
0

我想你会惊喜地发现你一秒钟能画出多少这样的瓷砖。现代图形硬件可以以 60 fps 每帧多次填充 1600x1200 帧缓冲区,因此您的 640x480 帧缓冲区将没有问题。试试看,看看你会得到什么。

您绝对应该利用硬件加速。这将为您提供 1000 倍的性能,而您只需付出很少的努力。

如果您确实发现需要优化,那么最简单的方法是仅重绘自上一帧以来已更改的屏幕区域。听起来您需要了解任何动画拼贴,以及每帧更改状态的拼贴。根据游戏的不同,这可能是完全没有好处的,也可能是大量节省 - 这实际上取决于每帧屏幕的变化量。

于 2009-07-15T06:11:41.630 回答
0

您可能会考虑将具有相同纹理的相邻图块合并为具有纹理平铺的更大多边形(某种构建过程)。

于 2009-07-15T06:17:39.417 回答
-1

将帧速率降低到 30fps 怎么样?我认为这对于 2D 游戏来说已经足够了。

于 2009-07-15T06:07:29.127 回答