我应该在2D滚动地图中使用什么缓冲策略?
所以,我正在用Java创建一个2D自上而下的游戏。
我遵循Java 2D指令:硬件加速 - 第2部分 - 缓冲策略来利用硬件加速。
基本上,我在想的是这样的:
我希望能够轻松地在地图中添加更多部分。 所以我宁愿不参加我见过的一些教程中提出的路线(每个地图图块都有一个周边图块的邻接列表;以中心图块开始,用广度优先搜索填充屏幕)。
相反,我的想法是屏幕大小的瓷砖集合(为了简单起见,例如32x32),并且这些屏幕“块”中的每一个将具有引用每个相邻集合的列表。 然后,我将为当前屏幕和8个相邻屏幕创建一个缓冲区,并在VRAM缓冲区中绘制可见部分。
我的问题是,这是否是一个正确的方法来解决这个问题,还是有更好的选择? 我浏览了很多教程,但它们似乎都提供了相同的(看起来很高的维护)选项。
看起来这将是一个更好的选择,因为在tile级别上执行的操作将需要多达1024倍的邻接列表。 另外,我考虑在VRAM中只显示可见部分的原因,同时将“当前”屏幕及其相邻屏幕保留在标准缓冲区中是因为我刚刚接触硬件加速,并不完全确定假设可接受多少空间可用。 因为Java无论如何都试图加速标准缓冲区,理论上它应该和每个VRAM一样快。
任何和所有的建议,欢迎!
我没有看过任何流行的基于tile的游戏引擎,但我会考虑使用fly-weight模式来渲染JScrollPane
的视口中仅显示可见的图块。 JTable
既是一个例子,也是一个可用的实现。
附录: JTable
方法的一个优点是视图模型分离,它允许将瓦片相关资源的获取归入模型。 这使得优化更容易,而无需更改视图。
即使没有滚动条,也可以通过扩展JComponent
或适当的子类来利用scrollRectToVisible()
。 setDoubleBuffered()
方法也可能有帮助。
上一篇: What buffering strategy should I use for my 2D scrolling map?
下一篇: OOP: How do I deal with objects that have mutual relations?