1

在一个游戏中,我有一个 GridPane 以方形单元格显示世界的瓷砖。玩家可以使用键盘移动按列\行显示的内容。我想到的方法是:让 GridPane 通过在玩家输入上移动 x 步来以编程方式更改显示的图块。将 GridPane 包装在 ScrollPane 中,并将 ScrollPane 的滚动绑定到键盘输入。

我的问题是,假设总是加载看不见但在同一张地图上的东西,那么每种方法在效率方面的优缺点是什么?最具体地说,我想知道将 GridPane 包装在 ScrollPane 中是否会保持图像加载,即使它们不在屏幕上,从而影响性能,如果在这种情况下,最好在需要时重新加载它们。我还想知道是否有第三种更有效的方法我没有想过。

我正在使用 JavaFX8

4

1 回答 1

2

一般的做法

为非常大的世界提供有限视口的最有效方法是为世界使用基于图块的模型,并且仅加载图形资源并显示当前视口所需的图块。

基于示例画布的实现

eppleton JavaFX tile 引擎是关于如何完成此任务的一个很好的概述,该引擎在eppleton 博客文章中有所描述。该特定实现使用基于Canvas直接绘制的方法,而不是面向场景图节点的方法。

基于场景图节点的示例实现

基于场景图的方法依赖于所谓的虚拟控制;其中控件提供单元格,这些单元格是底层数据模型的窗口。JavaFX ListViewTableView是虚拟化控件的示例。这些虚拟控件可以支持我的数据结构,其中包含数千个项目,但只有当前可见的数十个项目的可视项目实际显示在屏幕上。当控件滚动或修改其底层数据结构时,将调用回调来刷新每个显示单元格的图形节点。

ControlsFX GridView是基于场景图的网格虚拟控件的一个示例。请注意,与基于画布的 eppleton Tile Engine 不同,ControlsFX GridView 并非专门为游戏引擎构建和优化为基于核心 tile 的渲染器,因此如果您以这种方式使用 GridView,则需要显着添加为 GridView 的分支或扩展提供更多功能,使其在功能上与完整的游戏磁贴引擎相当。

现有规范和工具集

请注意,Tile 地图格式(如TMX )和现有的编辑器都有现有的规范来创建符合这些格式的文件。tilemap 的使用适用于实时游戏和回合制游戏,甚至在游戏类型之外也可能有用,尽管它的传统用法是创建视频游戏。

其他问题的答案

您是否介意详细说明,即使您对 GridView 的意思稍微没有优化?

您的主要应用程序似乎正在编写基于图块的游戏引擎。这样的引擎通常支持读取瓦片地图数据、瓦片图像数据、将动画精灵叠加到瓦片上等。这些功能不在 ControlsFX GridView 中,因为它具有不同的焦点(例如显示缩略图的视口文件目录的图像)。关键不是 GridView 没有优化性能(因为它是),关键是 GridView 不会为您提供您可能需要的特定应用程序(基于图块的游戏)的最佳开箱即用功能集)。

我忘了在我的例子中提到实体移动瓷砖而不是逐像素移动

这使得实现更简单,因为您只需要担心离散坐标处的图块,并且实体可以是精确的图块坐标,而无需偏移当前位置和图块之间的渲染。但是,它并没有真正改变仅在世界上使用虚拟化视口的整个方法,该视口仅渲染您当前可以看到的内容,而不是一直渲染整个世界。

如果我在一年前知道这一切,我会在我的发展中走一条非常不同的路线。

有时做研究是值得的,有时你会从错误中学习 :-) 我敢肯定,如果约翰卡马克当时知道他现在所知道的,他会以不同的方式写出原始的毁灭战士。我不会让这些事情让你太担心。只需评估您现在的位置并从那里开始。

于 2015-02-02T21:12:20.757 回答