- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在游戏中,我有一个 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 ListView和 TableView是虚拟化控件的示例。这些虚拟控件可以支持我的数据结构,其中包含数千个项目,但只有当前可见的数十个项目的视觉项目实际上显示在屏幕上。当滚动控件或修改其底层数据结构时,将调用回调来刷新每个显示单元格的图形节点。
基于场景图的网格虚拟控件的示例是 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/
前言: 有时候,一个数据库有多个帐号,包括数据库管理员,开发人员,运维支撑人员等,可能有很多帐号都有比较大的权限,例如DDL操作权限(创建,修改,删除存储过程,创建,修改,删除表等),账户多了,管理
这个问题已经有答案了: Condition variable deadlock (2 个回答) 已关闭 5 年前。 在研究多线程时,我编写了以下代码,但在屏幕上没有观察到输出。我在这里做错了什么?我期
复制代码 代码如下: <IfModule mod_rewrite.c> RewriteEngineOn RewriteBase/ #将www.zzvips.com跳转到www.zzv
复制代码 代码如下: <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / # 把 www.zzvips.com
复制代码 代码如下: Const T_GATEWAY = "1.1.1.1" '网关 Const T_NEWDNS1 = "2.2.2.2" 'DNS1
0. 修改索引 大文本字段支持排序 PUT http://localhost:9200/lrc_blog/_mapping //请求体 { "properties": { "title": { "t
仅 react 当状态发生变化时重新渲染 . 那么为什么我会直接看到我对真实 DOM 所做的更改呢? 我知道我正在修改真实的 DOM,但是当我根本没有改变状态时触发重新渲染的是什么。 import R
Xcode beta 5 推出 @FetchRequest对于 SwiftUI。 我有一个 View ,它有一个 @FetchRequest . NSFetchRequest是在管理器中创建的,该管理
关闭。这个问题需要更多 focused .它目前不接受答案。 想改进这个问题?更新问题,使其仅关注一个问题 editing this post . 7年前关闭。 Improve this questi
我有一个表达式[text][id]应替换为链接 text 解决方案是( id 是整数) $s = preg_replace("/\[([^\]]+)(\]*)\]\[([0-9]+)\]/","$1$
我在 repo 中有一个文件,我不想让任何人更新。 我能做什么? 最佳答案 你想要svn锁:http://www.linxit.de/svnbook/en/1.2/svn.ref.svn.c.lock
说我有项目 list 。我想导出到csv,但在此之前我想做一些计算/修改。 基本上,设置如下所示: PS C:\Files> gci Directory: C:\Files Mode
我有一个非常简单的问题 - 是否可以修改 Java API 的源代码,例如Junit,JABX ? 我知道这似乎是一个非常愚蠢的问题,但它一直困扰着我一段时间。 最佳答案 如果您可以掌握源代码,那么请
我有一个带有变量/列的小标题,其中包括不同形状的小标题列表。我想为其中一个变量中的每个(子)标题添加一个变量/列。 例如此类数据 library("tibble") aaa aaa # A tibb
我有几个菜单,可以在单击时向当前链接添加变量。这是一个例子: 1 2 3 x y z 我的问题是,如果我选择“y”2次,它会添加“&cord=y”2次。相反,我希望它替
我有两个项目:一个服务项目和一个服务安装程序项目。服务项目具有适合我的产品的装配信息。它包括公司信息和正确的服务名称。一旦服务实际安装,所有这些似乎都会被忽略。安装服务时,它使用在服务安装程序的ini
以下代码何时可能产生副作用? @some = map { s/xxx/y/; $_ } @some; perlcritic 将其解释为危险的,因为例如: @other = map { s/xxx/y/
我想知道以下哪种解决方案更好:我想修改一些 .class 文件,我意识到有两种方法可以做到这一点: 反编译.class文件,修改它,最后再次编译。 - 直接用十六进制编辑器修改。 谢谢 最佳答案 在这
这是我的按钮代码 onclick 我希望我的程序等待用户单击一个 JPanel,并且当用户单击 JPanel 时,它应该在控制台上打印其名称。 此按钮代码未显示输出 JPopupMenu popu
我正在使用一个具有“getName()”方法的特定 API。 getName() 返回一个字符串。是否可以修改该字符串? API 中不包含修饰符方法,并且 String getName() 返回的是私
我是一名优秀的程序员,十分优秀!