Просмотр полной версии : Как правильно создать "огромную" локацию
Universe
26.11.2013, 18:15
Есть задача, создать локацию, которая по размерам будет примерно 16 на 16 тысяч пикселей. Для экономии ресурсов для локации буду использовать тайлы размером 256 на 256 px. Однако, даже при использовании тайлов производительность значительно падает. Подскажите, плиз, как правильно сделать подобную локацию, чтобы не падала производительность.
Подскажите, плиз, как правильно сделать подобную локацию, чтобы не падала производительность.
Вероятнее всего старательно, вдумчиво, тестируя и исправляя ошибки запрограммировать оптимальную реализацию.
Давайте конкретнее разбираться, иначе толку от таких поверхностных разговоров совсем нет.
Покажите флэшку, для начала. Ну и код, само-собой.
MikroAcse
26.11.2013, 20:17
Подгружать/выгружать нужные и не нужные тайлы?
Хранить данные не изображением и не DO, а в каком-то текстовом формате (JSON, XML).
Profit?
shaman4d
26.11.2013, 20:19
Есть задача, создать локацию, которая по размерам будет примерно 16 на 16 тысяч пикселей. Для экономии ресурсов для локации буду использовать тайлы размером 256 на 256 px. Однако, даже при использовании тайлов производительность значительно падает. Подскажите, плиз, как правильно сделать подобную локацию, чтобы не падала производительность.
Я так думаю телепатов здесь нет, может вы сначала расскажете как сделали вы? покажете что у вас получилось...
А может комп по новее купить...
MikroAcse
26.11.2013, 22:21
А может комп по новее купить...
Не у всех "супер-компы" дома, так что нужно думать не только про мощные компьютеры.
Dukobpa3
26.11.2013, 22:22
Есть карта. Вся. Поделеная на тайлы.
Есть вью-порт. То что видно на екране, + зазор по краям на полтайла-тайл.
Следим за вьюпортом. Всё что вне его - убираем. Насколько сильно надо убирать - сами разберетесь. Может просто визибл фолс хватит. А может и вообще картинки дестроить придется полностью.
Когда вьюпорт попадает на невидимый блок - создаем и показываем. Для этого и зазор нужен. А то может получиться что на краю экрана будет пустой тайл, не отрисованный.
bifidokk
27.11.2013, 08:46
А может комп по новее купить...
и всем игрокам в дальнейшем это же посоветовать :)
caseyryan
27.11.2013, 08:59
Решал я как-то такую задачу у себя в игре. Схема получилась длинная и сложная, но работает как часы. Карты можно делать очень большие, без потери производительности.
Решение было почти как описал Dukobpa3, только у меня для большей части работы используется метод copyPixels(). То есть изначально создается картинка, размером чуть больше экрана. И на основе позиций объектов, описанных в xml, в нее при смещении врисовывается нужная картинка, Но не так, что при смещении на один пиксель она снова перерисовывается, а, скажем, сместилась она на ширину кратную ширине одного тайла (200px), возвращаем ее в исходное положение (на 200 пикселей назад) и перерисовываем. Так для всех тайлов, которые могут быть на экране в данный момент. Это решение подходит для всех объектов, которые не нужно сортировать. Все они врисовываются в нужные тайлы еще на этапе парсинга карты. Далее они просто ложатся в коллекцию (создавал специально, чтобы можно было просто найти объект, на основе его координат)
А для объектов, которые подлежат сортировке, используется вьюпорт. Простая проверка "за пределами экрана" или нет. Так как их гораздо меньше, чем тайлов, то тут можно и removeChild() / addChild() использовать
В общем, в любом случае придется голову поломать. Простого решения тут нет.
Да оно и без всяких махинаций с copyPixels не должно тормозить
Просто убирайте невидимые тайлы из списка отображения (removeChild)
(только не в каждом кадре убирать всё и добавлять видимое, а удалять/добавлять только при изменении статуса видимости - определялка областей перерисовки к этому делу очень чуствительна)
Еще всё гораздо быстрее работает, если битмапа в тайлах не поддерживает прозрачность.
Стоп, 16000x16000 - да у вас там под гигабайт всего. Может редактор написать и попереиспользовать одинаковые тайлы.
Хотя, если оно не перерисовывается и в JPEG, то занимать будет мало.
Короче, нужно больше информации. Т.к. причины тормозов не понятны.
caseyryan
27.11.2013, 13:03
Да оно и без всяких махинаций с copyPixels не должно тормозить
Просто убирайте невидимые тайлы из списка отображения (removeChild)
Будет тормозить, проверял. Чем больше тайлов, тем сильнее тормоза. А с сopyPixels() будет всего одна картинка, которую нужно двигать
Дык там тайлы большие, 256x256 - их на экране штук 20 помещается - там тормозить нечему
Universe
27.11.2013, 18:14
Основные тормоза были изза высокого разрешения битмепы-маски которая применялась с тайловому слою. Снизил её разрешение и тормоза пропали. Спасибо за предложенные варианты, попробую - отпишусь) Сорри за малое кол-во информации по вопросу.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.