gpt4 book ai didi

java - 将 GridPane 包装在 ScrollPane 中或以编程方式修改它。最有效的方法?

转载 作者:行者123 更新时间:2023-11-30 03:34:49 25 4
gpt4 key购买 nike

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

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

我正在使用 JavaFX8

最佳答案

一般方法

在非常大的世界中提供有限视口(viewport)的最有效方法是使用 tile based model对于世界,仅加载图形资源并显示当前视口(viewport)所需的图 block 。

基于 Canvas 的实现示例

关于如何实现这一点的一个很好的概述是 eppleton JavaFX 平铺引擎,它在 eppleton blog post 中进行了描述。 。该特定实现使用 Canvas基于直接绘制的方法而不是面向场景图节点的方法。

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

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

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

现有规范和工具集

请注意,Tile map 格式存在现有规范,例如 TMX和现有的editors创建符合此类格式的文件。瓦片 map 的使用适用于实时游戏和回合制游戏,甚至在游戏类型之外也很有用,尽管它的传统用法是在视频游戏的创建中。

其他问题的答案

would you mind elaborating, even if just slightly about what you mean with GridView is not optimized?

您的主要应用程序似乎正在编写基于图 block 的游戏引擎。这样的引擎通常提供对读取图 block map 数据、图 block 图像数据、在图 block 上叠加动画 Sprite 等的支持。这些类型的功能不在 ControlsFX GridView 中,因为它具有不同的焦点(例如,显示缩略图的视口(viewport))文件目录的图像)。问题不在于 GridView 没有优化性能(因为确实如此),问题在于 GridView 不会为您提供特定应用程序(基于图 block 的游戏)可能需要的最佳开箱即用功能集)。

I forgot to mention in my case the Entities move Tile by Tile and not Pixel by Pixel

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

Had I know all this a year ago I would had taken a very different route in my delevopment.

有时做研究是值得的,有时你会从错误中学习:-)我确信如果约翰·卡马克当时知道他现在所知道的,他会以不同的方式写出最初的《毁灭战士》。我不会让这些事情让你太担心。只需评估您现在所处的位置并从那里出发即可。

关于java - 将 GridPane 包装在 ScrollPane 中或以编程方式修改它。最有效的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28250416/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com