Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   [Алгоритмы] Оптимизация скроллинга большой изометрической карты (http://www.flasher.ru/forum/showthread.php?t=212364)

PainKiller 24.01.2016 20:08

Оптимизация скроллинга большой изометрической карты
 
Продолжаю осваивать изометрию, гуглил несколько дней, искал готовые движки и тьюториалы для старлинга, все что находится, производит грустное впечатление. Есть isoHill, есть многочисленные заброшенные порты as3isoLib, большинство из которых даже не компилируются, нет нужного мне функционала, и годится только на то, чтобы посмотреть как делают другие. Ну это лирика, теперь ближе к делу. Вопрос с которым я столкнулся, и по которому хотелось бы узнать мнение опытных товарищей, заключается в оптимизации скроллинга большой изометрической карты. И насколько вообще реально на флеше делать большие изометрические карты (например 1000 х 1000 тайлов). Из всего что я нашел, можно выделить 2 подхода:

1. Описан в книге Juwal Bose Starling Game Development Essentials. Тайлы перебираются из, допустим JSON описания карты и рисуются в одну большую текстуру, привожу предельно краткий кусок кода, функция инициализации карты (тут только бекграунд, 1 слой):
Код AS3:

private function init(e:Event = null):void 
{
                        this.removeEventListener(Event.ADDED_TO_STAGE, init);
 
                        _texAtlas = IsoTest.assets.getTextureAtlas('isotiles');
 
                        //_rTex = new RenderTexture(stage.stageWidth, stage.stageHeight);
                        _rTex = new RenderTexture(TILE_WIDTH * WORLD_WIDTH, TILE_WIDTH * WORLD_WIDTH);
                        _rTexImage = new Image(_rTex);
                        addChild(_rTexImage);
 
                        _screenOffset = new Point(stage.stageWidth / 2, 0);
 
                        var img:Image;
                        var pt:Point = new Point();
                        for(var i:int=0; i < WORLD_WIDTH; i++)
                        {
                                for(var j:int=0; j < WORLD_WIDTH; j++)
                                {
                                        img = new Image(_texAtlas.getTexture('tiles0001'));
                                        pt.x = j * TILE_WIDTH;
                                        pt.y = i * TILE_WIDTH;
                                        pt = IsoHelper.cartToIso(pt);
                                        img.x = pt.x + _screenOffset.x;
                                        img.y = pt.y + _screenOffset.y;
                                        _rTex.draw(img);
                                }
                        }
                        trace("_rTexImage.width = " + _rTexImage.width + " _rTexImage.height = " + _rTexImage.height);
                        _rTexImage.addEventListener(TouchEvent.TOUCH, onTouch);
}

Получившуюся текстуру драгать мышкой не проблема, но этот подход сразу упирается в максимальный размер тестуры допустимый старлингом (2048х2048) т.е. карту больше сделать не получится. Если же вводить оффсет по движению мыши и по нему перерисовывать карту, то меня пугает скорость этого процесса, при старте флешки, карта размером 50х50 тайлов у меня инициализируется несколько секунд и такие лаги при драге непримелимы.

2. Этот подход я подсмотрел в этом тьюториале Карта состоит из тайлов (т.е. в отличие от предыдущего метода, здесь каждый тайл это отдельный объект), которые храняться в обжект пуле, и подсовываются по мере движения персонажа по карте. Я подозреваю что это единственый способ отрисовки крупных карт на флеше, но возникает вопрос насколько он производительный, для больших и сложных карт и фулскрина? Смущают размеры демки, к этому тьюториалу http://murdochcarpenter.com/clients/...starling/demo/

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

faraday 24.01.2016 23:05

для правильного порядка, и отсутствия постоянной сортировки используйте слои. штук 10 обычно достаточно.
в каждом слое создаете пул объектов с позициями и добавляете все их в quadTree (быстрые выборки по координатам). у каждого слоя имплементируете метод setViewPort, по получению которого делаете выборку из quadTree и обновляете displayList только объектами в фокусе. setViewPort вызываете по enterFrame или муву карты. это общий подход, отдельно идет оптимизация анимаций, пулы картинок, обновление дерева
p.s еще хз есть ли смысл привязываться к тайлам, они используются в основном для поиска пути и грубого позиционирования, чем в отрисовке

PainKiller 25.01.2016 01:21

Спасибо за отклик, буду обдумывать ваши советы

Добавлено через 47 часов 10 минут
Что неужели больше некому и нечего сказать?

В общем я решил форкнуть понравившийся мне порт as3isoLib на старлинг, и допилить его под себя. Писать движок с нуля показалось мне как то черезчур. Если что то толковое получится, напишу в блоге.


Часовой пояс GMT +4, время: 20:49.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.