Обертывание GridPane в ScrollPane или его программная модификация. Самый эффективный подход?

В игре у меня есть GridPane, отображающий плитки мира в квадратных ячейках. Игрок может с помощью клавиатуры перемещать то, что отображается столбцом\строкой. Подходы, о которых я подумал, следующие: заставить GridPane программно изменять отображаемые плитки, перемещая все на x шагов при вводе игрока. Обертывание GridPane в ScrollPane и привязка прокрутки ScrollPane к вводу с клавиатуры.

Мой вопрос: если предположить, что вещи, которые находятся вне поля зрения, но на одной и той же карте, всегда загружаются, каковы плюсы и минусы каждого подхода с точки зрения эффективности? В частности, мне интересно, будет ли обертывание GridPane в ScrollPane сохранять изображения загруженными, даже если они находятся за пределами экрана, что влияет на производительность, и если в этом случае было бы лучше просто перезагрузить их при необходимости. Мне также интересно, есть ли третий, более эффективный способ, о котором я не думал.

Я использую JavaFX8


person Angelo Alvisi    schedule 31.01.2015    source источник
comment
Да, изображения загружаются, так как занимают память, нет, они не рендерятся. JScrollPane и JViewport очень оптимизированы для рендеринга только того, что физически находится в области просмотра окон просмотра. То, что я предлагаю сделать, это просто попытаться заставить его работать самым простым способом. Когда вы столкнетесь с проблемой оптимизации, попробуйте решить ее. Если вы попытаетесь переоптимизировать сейчас, вы можете создать больше проблем для системы.   -  person MadProgrammer    schedule 31.01.2015
comment
Стратегия реализации, которую вы выберете, вероятно, будет различаться в зависимости от того, много ли в вашем игровом мире ячеек или всего несколько сотен. Если второе, ваш текущий подход может сработать, если первое, вам может понадобиться использовать или разработать движок тайлов.   -  person jewelsea    schedule 31.01.2015
comment
@MadProgrammer Не уверен, что это имеет значение, но это не Swing, это Javafx 8.   -  person Angelo Alvisi    schedule 31.01.2015
comment
@AngeloAlvisi это имеет небольшое значение, но я бы все же предположил, что scrollPane оптимизирован для рисования только того, что видно ....   -  person MadProgrammer    schedule 31.01.2015
comment
@MadProgrammer Я понимаю, это именно то, что я искал, если вы не против добавить свой комментарий в ответ, я проголосую и приму его.   -  person Angelo Alvisi    schedule 01.02.2015
comment
@jewelsea Я просмотрел ссылку, похоже, я уже делал псевдо-движок Tile, ссылка была очень полезной, даже если она не применима к моему коду, как для RTG, в то время как моя игра является TBG. Если вы хотите поместить это в ответ, я проголосую за него.   -  person Angelo Alvisi    schedule 01.02.2015


Ответы (1)


Общий подход

Наиболее эффективный подход к предоставлению ограниченного окна просмотра очень большого мира — это использование мозаичной модели. для мира и загружать только графические ресурсы и отображать плитки, необходимые для текущего окна просмотра.

Пример реализации на основе холста

Хорошим обзором того, как это сделать, является механизм плитки eppleton JavaFX, описанный в запись в блоге eppleton. В этой конкретной реализации используется прямой Canvas. подход, основанный на рисовании, а не подход, ориентированный на узлы графа сцены.

Пример реализации на основе графа сцены

Подход, основанный на графе сцены, основан на так называемом виртуальном элементе управления; где элемент управления предоставляет ячейки, которые являются окнами для базовой модели данных. JavaFX ListView и TableView являются примерами виртуализированных элементов управления. Эти виртуальные элементы управления могут поддерживать мои структуры данных, которые содержат тысячи элементов, но на экране фактически отображаются только визуальные элементы для видимых в данный момент десятков элементов. При прокрутке элемента управления или изменении его базовой структуры данных вызываются обратные вызовы для обновления графических узлов для каждой отображаемой ячейки.

Примером виртуального элемента управления на основе графа сцены для сетки является ControlsFX GridView. Обратите внимание, что, в отличие от eppleton Tile Engine на основе холста, ControlsFX GridView специально не создается и не оптимизируется для использования в качестве основного модуля рендеринга на основе тайлов для игрового движка, поэтому, если вы будете использовать GridView таким образом, вам потребуется значительно добавить больше функций для ответвления или расширения GridView, чтобы довести его функционально до уровня полноценного механизма тайлов игрового процесса.

Существующие спецификации и наборы инструментов

Обратите внимание, что существуют существующие спецификации для форматов карт листов, таких как TMX, и существующие редакторы для создания файлов, соответствующих этим форматам. Использование тайловой карты подходит как для игр в реальном времени, так и для пошаговых игр, и может быть даже полезно вне игрового жанра, хотя традиционно оно используется при создании видеоигр.

Ответы на дополнительные вопросы

не могли бы вы уточнить, хотя бы немного о том, что вы имеете в виду, когда GridView не оптимизирован?

Ваше основное приложение, похоже, пишет игровой движок на основе тайлов. Такой движок обычно обеспечивает поддержку чтения данных карты плитки, данных изображения плитки, наложения анимированных спрайтов на плитки и т. д. Такого рода функции отсутствуют в GridView ControlsFX, поскольку он имеет другой фокус (например, отображение окна просмотра миниатюры). изображения для каталога файлов). Дело не в том, что GridView не оптимизирован с точки зрения производительности (потому что это так), дело в том, что GridView не предоставит вам оптимальный набор готовых функций, которые могут вам понадобиться для вашего конкретного приложения (игры на основе плитки). ).

Я забыл упомянуть в моем случае, что сущности перемещают плитку за плиткой, а не пиксель за пикселем.

Это упрощает реализацию, поскольку вам нужно беспокоиться только о плитках с дискретными координатами, а объект может быть точной координатой плитки без смещения для текущего местоположения и рендеринга между плитками. Однако на самом деле это не меняет весь подход к использованию виртуализированного окна просмотра только для мира, который отображает только то, что вы можете видеть в данный момент, а не постоянно отображает весь мир.

Если бы я знал все это год назад, то пошел бы совсем другим путем в своем развитии.

Иногда полезно провести исследование, а иногда вы учитесь на ошибках :-) Я уверен, что Джон Кармак написал бы оригинальный Doom по-другому, если бы знал тогда то, что знает сейчас. Я бы не позволил таким вещам слишком сильно вас волновать. Просто оцените, где вы сейчас находитесь, и идите оттуда.

person jewelsea    schedule 02.02.2015
comment
Если бы я знал все это год назад, то пошел бы совсем другим путем в своем развитии. На данный момент у меня все настроено в фреймворке для создания всего, что мне нужно, я мог бы использовать формат TMX вместо своего собственного кода, но это, вероятно, потребует еще одного длительного пересмотра, который я не очень хочу делать. Вместо этого подход Canvas vs GridView очень интересен, не могли бы вы уточнить, хотя бы немного о том, что вы имеете в виду, когда GridView не оптимизирован? (Я забыл упомянуть в моем случае, что сущности перемещают плитку за плиткой, а не пиксель за пикселем) - person Angelo Alvisi; 03.02.2015
comment
Большое спасибо за дополнительный комментарий. Я имел в виду, что способ работы GridPane в JavaFX довольно хорошо работает с программой Tile by Tile, поскольку все, что мне нужно сделать, это реализовать ImageView, который содержит любое изображение, которое плитка должна показывать. Да, я полагаю, что больше исследований помогло бы, но первоначальная идея заключалась в том, чтобы использовать мошеннический мошенник на основе Ascii, который использовал стороннюю свинг-библиотеку. Затем в библиотеке появились ошибки, и разработка была прекращена, поэтому я сделал свою собственную реализацию Swing. Я решил перейти на графические тайлы и перешел на JavaFX, потому что постепенно возненавидел Swing. - person Angelo Alvisi; 03.02.2015