Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 24.01.2016, 20:08
PainKiller вне форума Посмотреть профиль Отправить личное сообщение для PainKiller Найти все сообщения от PainKiller
  № 1  
Ответить с цитированием
PainKiller
 
Аватар для PainKiller

блогер
Регистрация: Sep 2011
Адрес: Москва
Сообщений: 533
Записей в блоге: 4
По умолчанию Оптимизация скроллинга большой изометрической карты

Продолжаю осваивать изометрию, гуглил несколько дней, искал готовые движки и тьюториалы для старлинга, все что находится, производит грустное впечатление. Есть 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, и тайлить при переходе перса с экрана на экран), хотя конечно реализовать это будет сложно. Но в любом случае, прежде чем приступать к работе, хотелось бы услышать ваше мнение, возможно у кого то есть ссылки на рабочие либы, и т.д.

Старый 24.01.2016, 23:05
faraday вне форума Посмотреть профиль Отправить личное сообщение для faraday Найти все сообщения от faraday
  № 2  
Ответить с цитированием
faraday
 
Аватар для faraday

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

Старый 25.01.2016, 01:21
PainKiller вне форума Посмотреть профиль Отправить личное сообщение для PainKiller Найти все сообщения от PainKiller
  № 3  
Ответить с цитированием
PainKiller
 
Аватар для PainKiller

блогер
Регистрация: Sep 2011
Адрес: Москва
Сообщений: 533
Записей в блоге: 4
Спасибо за отклик, буду обдумывать ваши советы

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

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

Создать новую тему Ответ Часовой пояс GMT +4, время: 20:40.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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