【问题标题】:What buffering strategy should I use for my 2D scrolling map?我应该为我的 2D 滚动地图使用什么缓冲策略?
【发布时间】:2011-08-13 04:02:07
【问题描述】:

所以,我正在用 Java 创建一个 2d 自上而下的游戏。

我正在按照Java 2D: Hardware Accelerating - Part 2 - Buffer Strategies 的说明来利用硬件加速。

基本上,我的想法是这样的:
我希望能够轻松地向地图添加更多部分。所以我宁愿不走我看过的一些教程中建议的路线(每个地图图块都有一个周围图块的邻接列表;从中心图块开始,使用广度优先搜索填充屏幕)。

相反,我的想法是拥有屏幕大小的图块集合(为简单起见,例如 32x32),并且这些屏幕“块”中的每一个都会有一个引用每个相邻集合的列表。然后,我会为当前屏幕和相邻的 8 个屏幕创建一个缓冲区,并在 VRAM 缓冲区中绘制可见部分。

我的问题是,这是解决此问题的正确方法,还是有更好的选择?我浏览了很多教程,但它们似乎都提供了相同的(看似高维护)选项。

这似乎是一个更好的选择,因为在 tile 级别执行操作将需要 1024 倍的邻接列表。另外,我考虑只将可见部分放在 VRAM 中,而将“当前”屏幕及其相邻屏幕留在标准缓冲区中的原因是因为我是硬件加速的新手,并且不完全确定可以接受多少空间可用。因为 Java 无论如何都试图加速标准缓冲区,理论上它应该与将每个缓冲区都放入 VRAM 一样快?

欢迎提出任何建议!

【问题讨论】:

    标签: java swing bufferedimage graphics2d hardware-acceleration


    【解决方案1】:

    我没有看过任何流行的tile-based game engines,但我会考虑使用fly-weight pattern 来仅渲染在JScrollPane 的视口中可见的图块。 JTable 既是一个示例,也是一个可用的实现。

    附录:JTable 方法的一个优点是view-model separation,它允许将与图块相关的资源的获取委托给模型。这使得优化更容易,而无需更改视图。

    即使没有滚动条,也可以通过扩展JComponent 或适当的子类来利用scrollRectToVisible()setDoubleBuffered() 方法也可能有帮助。

    【讨论】:

    • 到目前为止我还没有处理过模式,但是在阅读了here 的文章之后,我想我至少对它的使用有了一个不错的掌握。 JScrollPane 似乎几乎为此量身定制(一旦滚动条被隐藏)。仍然需要研究 JTable,但这是一个很好的开始。谢谢!
    • 查找 JTables 后,我得到的是:我将创建一个 JTable 并将其插入到 JScrollPane 中。然后,使用享元模式(将瓦片对象限制为每种瓦片类型之一)和地图瓦片的一些表示(可能是字符数组或位图数据),将它们的图形插入 JTable 单元格?还是我不应该填充整个 JTable?大多数情况下,我不确定我是否正确使用了flyweights。此外,如果这是解决此问题的正确方法,是否有关于 JTables 的硬件加速的良好参考?我什至找不到在其中使用图像的参考资料。
    • 其实JTable已经使用享元模式了;您只需实现数据模型和所需的渲染器。更多内容。
    猜你喜欢
    • 2013-06-09
    • 1970-01-01
    • 1970-01-01
    • 2018-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多