Показать сообщение отдельно
Старый 25.03.2016, 23:53
Godwarlock вне форума Посмотреть профиль Отправить личное сообщение для Godwarlock Найти все сообщения от Godwarlock
  № 15  
Ответить с цитированием
Godwarlock

Регистрация: Jan 2012
Сообщений: 836
dimarik да я тут на две страницы уже раскочегарился)
Ну давайте попробуем поподробнее разобраться в моей проблеме)
В общем есть класс объекта, в который передаются нужные параметры, x,y,z, контейнер в который помещаем объект и т.д.
Код AS3:
 
id = i;
type = t;
sorting = s;
setX = x;
setY = y;
setZ = z;
setR = r;
thisContainer - это обычный IsoDisplayObject
 
model = new (ApplicationDomain.currentDomain.getDefinition("platform_" + id) as Class);
model.gotoAndStop(setR);
model.cacheAsBitmap = true;
objectModel = new IsoDisplayObject();
objectModel.moveTo(setX, setY, setZ);
objectModel.container.addChild(model);
thisContainer.addChild(objectModel);
thisContainer.container.mouseChildren = false;
thisContainer.container.mouseEnabled = false;
 
//Эта функция вызывается, если объект попадает в область видимости.
public function addObject():void
		{
			if (flagVisible)
			{
		     flagVisible = false;
			thisContainer.addChild(objectModel);
 
			}
		}
 
//Эта функция вызывается, если объект вне зоны видимости.
		public function deleteObject():void
		{
			if (!flagVisible)
			{
			flagVisible = true;
			thisContainer.removeChild(objectModel);
			}
		}
Из всевозможных способов(visible,alpha и т.д) лучше всего проявил себя addChild и removeChild, другие варианты жрут fps больше всего.
Всё. Тут мы добавили объект и сам класс объекта кидаем в вектор. И таких вот объектов создается 2000+. И даже если оставить из 2000, только декорации, коих 140шт, фпс все равно проседает на ноуте до 30-40.
Далее, в контроллере управления персонажем, вызывается по энтерфейму функция, которая определяет какие объекты вне зоны, относительно персонажа. То есть пробегаемся по вектору с этими объектами и меняем его состояние видимости/невидимости, вызывая выше перечисленные функции удаления/добавления объектов для каждого экземпляра в массиве. Вызывать эту функцию только при движении персонажа или каждый кадр, не влияет ни на что. Проверено.

Код AS3:
private function updatePlayerCoordinates(e:Event):void
{
ptPlayer = new Pt(WorldConfigurations.cameraObject.x, WorldConfigurations.cameraObject.y);//Здесь получаем координаты персонажа, относительно изометрической сетки. WorldConfigurations.cameraObject - это ссылка на активный объект. В игре есть кинематика, когда вместо игрока перемещается например квестовый нпс и поэтому чтобы карта следовала за ним, мы берем координаты именно из этой переменной.
viewMap.centerOnPt(ptPlayer, true);//Эта функция, которая центрирует камеру вьюшки относительно текущих координат персонажа
updateMap();//Эта функция, которая как раз проверяет какие объекты в зоне видимости, а какие вне зоны.
Вот пример зажатой кнопки W(вверх), по которой изменяем координаты персонажа когда он двигается вверх. (персонаж двигается в 8 направлениях)
if (up_press_platform)
			{
				thisX = playerObject.sprite.x -= UserConf.speed;
				thisY = playerObject.sprite.y -= UserConf.speed;
				playerObject.updateRotation(5);
			}
}
updatePlayerXY(thisX, thisY);//Присваиваем объекту новые координаты, если не было столкновений и прочего в условиях
 
private function updatePlayerXY(x:int, y:int):void
		{
 
			playerObject.sprite.x = x;
			playerObject.sprite.y = y;
 
		}
Всё вроде бы нормально. На моём i3 fps держится в пределах 55-60, в редких случаях до 48 опускается. На двухядерных процах, при таком раскладе fps падает до 20, а то и меньше. Если убрать
Код AS3:
viewMap.centerOnPt(ptPlayer, true);
эту функцию, карта не будет следовать за текущим объектом, персонаж двигается, фпс на старом железе при этом держится в пределах 50-60, это в прочем нормально. Я был бы рад даже такому результату, если бы еще и карта двигалась) Как оказалось, смещение карты без функции центрирования камеры также не дало результатов, фпс проседать стал ровно также, как и с этой функцией. Собственно, оптимизировать нефига не получилось и вообще уже начинаю сомневаться, что сохранить стабильный фпс с большими картами на двухядерных процах текущие версии flash player-а не в состоянии...


Последний раз редактировалось Godwarlock; 26.03.2016 в 00:05.