在游戏中我有一个GridPane在方形单元格中显示世界的Tiles。玩家可以使用键盘移动列\行显示的内容。我想到的方法是: 让GridPane以编程方式更改显示的磁贴,方法是在播放器输入上按x步移动所有内容。 将GridPane包装在ScrollPane中并将ScrollPane的滚动条连接到Keyboard输入。
我的问题是,假设在同一地图上看不见的东西总是被加载,每种方法的优点和缺点是什么?最具体地说,我想知道将ScrapPane中的GridPane包装起来是否会保持图像加载,即使它们处于屏幕外,从而影响性能,如果在这种情况下最好只在需要时重新加载它们。我也想知道是否有第三种更有效的方式我没想过。
我正在使用JavaFX8
答案 0 :(得分:2)
一般方法
在一个非常大的世界中提供有限视口的最有效方法是为世界使用tile based model并仅加载图形资源并显示当前视口所需的图块。
基于画布的示例实现
如何实现这一目标的一个很好的概述是eppleton blog post中描述的eppleton JavaFX tile引擎。该特定实现使用基于Canvas直接绘制的方法而不是面向场景图节点的方法。
基于场景图节点的示例实现
基于场景图的方法依赖于所谓的虚拟控件;其中控件提供作为基础数据模型的窗口的单元格。 JavaFX ListView和TableView是虚拟化控件的示例。这些虚拟控件可以支持我的数据结构,其中包含数千个项目,但只有当前可见的数十个项目的可视项目实际显示在屏幕上。当滚动控件或修改其底层数据结构时,将调用回调以刷新每个显示单元格的图形节点。
基于场景图的网格虚拟控件示例是ControlsFX GridView。请注意,与基于画布的eppleton Tile Engine不同,ControlsFX GridView并非专门为游戏引擎构建并优化为基于核心区块的渲染器,因此如果您以这种方式使用GridView,则需要显着添加GridView的分支或扩展的更多功能,使其在功能上与完整的游戏平铺引擎相提并论。
现有规范和工具集
请注意,现有的Tile地图格式规范(例如TMX和现有editors)可以创建符合此类格式的文件。使用tilemap适用于实时和回合制游戏,甚至可以在游戏类型之外使用,尽管它的传统用法是创建视频游戏。
其他问题的答案
您是否介意详细阐述,即使只是略微说明您对GridView的意义并未进行优化?
您的主要应用程序似乎是编写基于磁贴的游戏引擎。这样的引擎通常提供对读取图块地图数据,图块图像数据,将动画精灵叠加到图块等上的支持。这些特征不在ControlsFX GridView中,因为它具有不同的焦点(例如,显示缩略图的视口)文件目录的图像)。关键不在于GridView没有优化性能(因为它),重点是GridView不会为您提供特定应用程序可能需要的最佳开箱即用功能(基于磁贴的游戏) )。
我忘了在我的情况下提到实体移动Tile by Tile而不是Pixel by Pixel
这使得实现更简单,因为您只需要担心离散坐标处的切片,并且实体可以是精确的切片坐标,而没有当前位置的偏移和切片之间的渲染。然而,它并没有真正改变将虚拟化视口仅用于世界的整个方法,而世界只能呈现您当前可以看到的内容,而不是始终呈现整个世界。
如果我在一年前知道这一切,我的发展方式就会采取一条完全不同的路线。
有时做研究是值得的,有时候你会错误地学习:-)如果他知道他现在知道什么,我肯定John Carmack会以不同的方式写出原始的Doom。我不会让这些事情让你太担心。只需评估你现在的位置并从那里开始。