簡體   English   中英

在ScrollPane中包裝GridPane或以編程方式對其進行修改。 最有效的方法?

[英]Wrapping a GridPane in a ScrollPane or programatically modifying it. Most efficient approach?

在游戲中,我有一個GridPane以正方形單元格顯示世界的圖塊。 播放器可以使用鍵盤移動列\\行顯示的內容。 我想到的方法是:通過在播放器輸入上按x步移動所有內容,使GridPane以編程方式更改顯示的圖塊。 將GridPane包裹在ScrollPane中,然后將ScrollPane的滾動條綁定到Keyboard輸入。

我的問題是,假設總是看不見東西但在同一張地圖上的東西總是裝滿,那么每種方法在效率方面的優缺點是什么? 最具體地說,我想知道是否將GridPane包裹在ScrollPane中,即使圖像不在屏幕上也可以保持加載,從而影響性能,如果在這種情況下最好在需要時重新加載它們。 我還想知道是否還有我沒有想到的第三種更有效的方法。

我正在使用JavaFX8

一般的做法

在非常大的世界上提供有限視口的最有效方法是對世界使用基於圖塊的模型 ,並且僅加載圖形資源並顯示當前視口所需的圖塊。

基於示例畫布的實現

eppleton博客文章中對eppleton JavaFX tile引擎進行了很好的概述。 該特定實現使用基於Canvas直接繪圖的方法,而不是面向場景圖節點的方法。

基於示例場景圖節點的實現

基於場景圖的方法依賴於所謂的虛擬控件。 控件提供的單元格是基礎數據模型的窗口。 JavaFX ListViewTableView是虛擬控件的示例。 這些虛擬控件可以支持我的數據結構,該數據結構包含數千個項目,但是屏幕上實際上只顯示了當前可見的數十個項目的可視項目。 滾動控件或修改其基礎數據結構時,將調用回調以刷新每個顯示單元的圖形節點。

基於場景圖的網格虛擬控件的一個示例是ControlsFX GridView 請注意,與基於畫布的eppleton Tile Engine不同,ControlsFX GridView並非專門為游戲引擎而構建並優化為基於核心Tile的渲染器,因此,如果您以這種方式使用GridView,則需要大量添加GridView的分叉或擴展具有更多功能,使其功能與完整的游戲圖塊引擎相當。

現有規格和工具集

請注意,現有的圖塊地圖格式(例如TMX)規范和現有的編輯器都可以創建符合此類格式的文件。 盡管傳統的用法是創建視頻游戲,但tilemap的用法既適用於實時游戲又適用於基於回合的游戲,甚至在游戲類型之外也可能有用。

回答其他問題

即使只是略微優化了GridView的含義,您是否願意進行詳細說明?

您的主要應用程序似乎是在編寫基於圖塊的游戲引擎。 這樣的引擎通常為讀取圖塊地圖數據,圖塊圖像數據,將動畫精靈疊加在圖塊上等提供支持。ControlsFXGridView中沒有這類功能,因為它具有不同的焦點(例如顯示縮略圖的視口)文件目錄的圖片)。 關鍵不是因為GridView並不是針對性能進行優化的,而是因為GridView不會為您提供特定應用程序可能需要的最佳現成功能集(基於圖塊的游戲) )。

在我的案例中,我忘了提到實體逐塊移動,而不是逐像素移動

這使實現更加簡單,因為您只需要擔心離散坐標處的圖塊,並且實體可以是精確的圖塊坐標,而無需偏移當前位置和圖塊之間的渲染。 但是,它並沒有真正改變使用僅顯示到世界上的虛擬視口的整體方法,該視口僅呈現您當前可以看到的內容,而不是始終呈現整個世界。

如果我一年前知道這一切,我在發展中會走一條截然不同的路線。

有時候做研究是值得的,有時候你會從錯誤中學習:-)我敢肯定,如果約翰·卡馬克(John Carmack)知道當時的情況,他會寫出不同的原始《毀滅戰士》。 我不會讓這些事情讓您擔心太多。 只需評估您現在所在的位置,然后從那里去即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM