【问题标题】:Tile engine performance issue瓦片引擎性能问题
【发布时间】:2011-10-08 17:14:03
【问题描述】:

我正在使用 SFML,但我找不到任何关于库如何工作的解释,而且我遇到了性能问题。 我正在尝试制作一个由 50x50 瓦片组成的瓦片图,每个瓦片宽度为 20x20 像素。 1)每个图块都是一个 sf::sprite,其图形图像只是一个大图像(我的图块集),我在其上设置了一个 20x20 的子矩形。 2)我只是循环使用瓷砖总数并使用 App.Draw(Map[i][j]);绘制每个图块,我正在使用“视图”对象,因此我可以移动视图

现在我的 FPS 非常低(1 张图像/秒),我想知道与前面几点相关的两件事。 1)是否每个 sf::sprite 都需要时间来绘制,因为它们的图像来自被裁剪的巨大图像? 2)我是否可以遍历整组图块,甚至是我没有看到的图块?我假设视图对象使得不在视图中的图块不会徒劳地重新计算

谢谢

【问题讨论】:

  • 向我们展示你如何渲染你的地图,(发布一些代码),这不应该发生。此外,您是在每次迭代时还是在程序开始时裁剪图块?
  • 我只是在做: for(int i=0; i
  • 即使使用 20 x 20 的图块(这甚至不会填满屏幕),我在滚动时也能获得 20 FPS,这似乎太低了
  • 我对 SFML 不是很熟悉,但您应该尝试只绘制可见的东西。大多数图形库不这样做,因为客户端可以更有效地做到这一点。另外,请确保 SFML 使用的是硬件加速渲染,而不是软件块。
  • 没有任何代码,答案是你做错了。试试探查器。冒险猜测你在每一帧都绑定纹理。 SFML 在后台使用 Opengl,所以它相当快,除非你在 opengl 中做一些愚蠢的事情。

标签: c++ sfml


【解决方案1】:

这通常被认为是渲染图块地图的错误方式。

更正确的方法是创建一个大纹理,或者在这种情况下为sf::Image,然后将您的图块渲染到这个纹理上,然后将这个大纹理渲染到屏幕上。在某些情况下,这种方法不可行,但在大多数情况下,它要好得多。

这样,您只需在加载瓦片地图时渲染每个瓦片一次,然后您只需为每一帧渲染一次大纹理,而不是为每帧渲染 2500 个单独的瓦片。

SFML 使用 OpenGL 的方式对大量的 Draw() 调用并不友好,因此它有助于找到尽可能少地调用它的方法。

【讨论】:

  • 还需要注意的是,SFML 2 会对此进行优化。也许它实际上已经实现了,我已经有一段时间没有使用 SFML 的 tile 引擎了。
猜你喜欢
  • 2023-04-06
  • 1970-01-01
  • 2012-07-18
  • 2012-05-31
  • 1970-01-01
  • 2011-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多