代码之家  ›  专栏  ›  技术社区  ›  Sukasa

规划2D图块引擎-性能问题

  •  1
  • Sukasa  · 技术社区  · 17 年前

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

    Uint16

    我担心的是,我希望能够利用这个引擎的透明度和动画图块,由于我对设计不太熟悉,我担心我目前的解决方案效率太低,无法很好地工作。

    我的目标FPS是每秒60帧,在绘制所有四个层的情况下,我看到每秒需要绘制21x16x4x60=80640个单独的32x32px图块,再加上精灵需要许多奇数大小的块,这似乎有点过分了。那么,有没有更好的方法来渲染我的tilemap设置呢?我正在寻找使用硬件加速绘制波浪图的可能性,如果这将有助于大大提高性能的话。我也希望能在稍旧的电脑上很好地运行这款游戏。

    7 回复  |  直到 17 年前
        1
  •  4
  •   Justicle    17 年前

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

    此外,请在谷歌上搜索“脏矩形”,看看是否有任何方案可以满足您的需求。

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

        2
  •  2
  •   David    17 年前

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

    在500mhz的系统中,每层每像素大约有6.8个cpu周期,或者每屏幕像素有27个cpu周期。如果你在每层的每个图块上都有完整的alpha通道,这(我相信)是不够的,但如果你尽可能采取上述快捷方式,应该没问题。

        3
  •  1
  •   David Anderson    17 年前

        4
  •  1
  •   scott_aw    16 年前

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

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

        5
  •  0
  •   Rik Heywood    17 年前

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

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

    如果你确实发现需要优化,那么最简单的方法是只重绘自上一帧以来发生变化的屏幕区域。听起来你需要知道任何动画图块,以及每帧状态都发生了变化的图块。根据游戏的不同,这可能根本没有好处,也可能节省大量成本——这真的取决于每帧屏幕的变化程度。

        6
  •  0
  •   Cecil Has a Name    17 年前

    您可以考虑使用纹理平铺将具有相同纹理的相邻图块合并到一个更大的多边形中(某种构建过程)。

        7
  •  -1
  •   Adrian Toman Duncan_m    14 年前

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