Общий подход
Наиболее эффективный подход к предоставлению ограниченного окна просмотра очень большого мира — это использование мозаичной модели. для мира и загружать только графические ресурсы и отображать плитки, необходимые для текущего окна просмотра.
Пример реализации на основе холста
Хорошим обзором того, как это сделать, является механизм плитки 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
JScrollPane
иJViewport
очень оптимизированы для рендеринга только того, что физически находится в области просмотра окон просмотра. То, что я предлагаю сделать, это просто попытаться заставить его работать самым простым способом. Когда вы столкнетесь с проблемой оптимизации, попробуйте решить ее. Если вы попытаетесь переоптимизировать сейчас, вы можете создать больше проблем для системы. - person MadProgrammer   schedule 31.01.2015