规划2D磁贴引擎 - 性能问题

时间:2009-07-15 05:45:57

标签: optimization graphics 2d sdl tile-engine

正如标题所说,我正在充实2D平台发动机的设计。它仍然处于设计阶段,但我担心我会遇到渲染器的问题,如果它们成为一个问题我想避开它们。

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

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

我担心的是,我希望能够利用此引擎的透明胶片和动画磁贴,而且由于我对设计不太熟悉,我担心我目前的解决方案将会是工作效率太低。

我的目标FPS是平坦的每秒60帧,并且绘制了所有四个图层,我正在查看需要每秒绘制的21x16x4x60 = 80,640个单独的32x32px图块,此外需要多个奇数大小的blits精灵,这似乎有点过分。那么,有没有更好的方法来渲染我所拥有的tilemap设置?我正在寻找使用硬件加速来绘制平铺图的可能性,如果它有助于提高性能。我也希望能够在较旧的计算机上运行这款游戏。

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

7 个答案:

答案 0 :(得分:4)

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

降低瓷砖和瓷砖填充率的一种策略是将静态区域复合在一起。例如,如果您知道某个区域不需要更新,则可以缓存该区域。很大程度上取决于图层是否独立滚动(视差风格)。

此外,请在Google上查看“脏矩形”,看看是否有任何方案符合您的需求。

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

答案 1 :(得分:2)

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

在500mhz系统上,每层每像素可获得大约6.8个cpu周期,或每个屏幕像素27个,如果你在每个图层的每个图块上都有完整的alpha通道,那么(我相信)是不够的,但如果你选择那些可能提到的快捷方式,应该没问题。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

您是否可以将每个完整图层缓冲到其视图中以及所有四个端点的额外图块大小(如果您有垂直滚动),再次使用缓冲区创建一个新缓冲区减去第一列并绘制新的结束列? 这将减少大量不必要的重绘。

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

答案 4 :(得分:0)

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

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

如果您确实发现需要优化,那么最简单的方法是仅重绘自上一帧以来已更改的屏幕区域。听起来你需要知道任何动画瓷砖,以及每帧都改变状态的任何瓷砖。根据游戏的不同,这可以是从无益处到大规模节省的任何地方 - 它实际上取决于每帧的屏幕变化程度。

答案 5 :(得分:0)

您可以考虑将具有相同纹理的相邻切片合并为具有纹理切片的更大多边形(构建过程的排序)。

答案 6 :(得分:-1)

如何将帧速率降低到30fps。我认为2D游戏就足够了。