![]() |
|
||||||||||
|
|||||
|
Регистрация: Jan 2012
Сообщений: 836
|
Цитата:
Цитата:
p.s Чтобы убедиться, я перевел картинку из мувиклипа в спрайт и добавлял уже не мвк, а спрайт. Никакой производительности это не дало. Добавлено через 2 часа 47 минут Заметил такую фишку. В общем на сцене двигается персонаж, а не платформа, а чтобы следить за персонажем каждый кадр вызывается функция То есть камера всегда смотрим в центр персонажа. Я убрал её и подвигался без слежения камеры. Фпс на старом ноуте таким образом сохраняется в пределах 50-60, то есть лагов практически не наблюдается. Отсюда вопрос, если не использовать выше указанную функцию, каким образом мне тогда двигать карту и персонажа? У сцены нет свойства x,y поэтому двигать её не получится, но можно двигать объекты который расположены на всей это сцене. Получается надо брать координаты каждого объекта(то есть все 2000) и смещать в нужную сторону? Последний раз редактировалось Godwarlock; 25.03.2016 в 21:07. |
|
|||||
|
.
|
Цитата:
А вариант очень хороший. Он хорош тем, что вы не должны вкомпиливать все классы ваших 2000 объектов. Ну, можно заменить на Цитата:
Последний раз редактировалось dimarik; 25.03.2016 в 23:11. |
|
|||||
|
Регистрация: Jan 2012
Сообщений: 836
|
dimarik Да это понятно) Еще бы разобраться с оптимизацией работы со всеми этими объектами)
|
|
|||||
|
Регистрация: Jan 2012
Сообщений: 836
|
dimarik да я тут на две страницы уже раскочегарился)
Ну давайте попробуем поподробнее разобраться в моей проблеме) В общем есть класс объекта, в который передаются нужные параметры, x,y,z, контейнер в который помещаем объект и т.д. 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 больше всего. Далее, в контроллере управления персонажем, вызывается по энтерфейму функция, которая определяет какие объекты вне зоны, относительно персонажа. То есть пробегаемся по вектору с этими объектами и меняем его состояние видимости/невидимости, вызывая выше перечисленные функции удаления/добавления объектов для каждого экземпляра в массиве. Вызывать эту функцию только при движении персонажа или каждый кадр, не влияет ни на что. Проверено. 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; } эту функцию, карта не будет следовать за текущим объектом, персонаж двигается, фпс на старом железе при этом держится в пределах 50-60, это в прочем нормально. Я был бы рад даже такому результату, если бы еще и карта двигалась) Как оказалось, смещение карты без функции центрирования камеры также не дало результатов, фпс проседать стал ровно также, как и с этой функцией. Собственно, оптимизировать нефига не получилось и вообще уже начинаю сомневаться, что сохранить стабильный фпс с большими картами на двухядерных процах текущие версии flash player-а не в состоянии... Последний раз редактировалось Godwarlock; 26.03.2016 в 00:05. |
|
|||||
|
.
|
Цитата:
Ставьте cacheAsBitmap у этих мувиклипов. Они изначально векторные. Но есть известные ограничения. Прочитайте про cacheAsBitmap. Цитата:
Добавление (создание) объекта зановно тоже отнимает время. Выделение памяти средствами ОС и все такое. Причем визуально это тот же самый объект. Чтобы не рендерить визуальный объект воспользуйтесь его свойствами и выставьте: alpha = 0.0 или visible = false. Различие только в хиттесте для Mouse. Не удаляйте через removeChild. Вызов любого метода сам по себе накладен. Вам же нужно следить за тем, чтобы количество объектов не превысило условную величину. Ну, я к тому, что иногда все-таки нужно удалять "лишние" объекты из памяти. Я очень четко это понял, когда работал с мобилками. Нам OS выделяла 256 Мб памяти или благополучно нас выгружала, если мы превышали эту квоту. Проверьте ваше приложение через профилировщик Adobe Scout. Этот инструмент должен стать обыденностью для вас. Последний раз редактировалось dimarik; 26.03.2016 в 00:58. |
|
|||||
|
Регистрация: Jan 2012
Сообщений: 836
|
Цитата:
model = new (ApplicationDomain.currentDomain.getDefinition("platform_" + id) as Class); model.gotoAndStop(setR); model.cacheAsBitmap = true; Цитата:
Цитата:
Цитата:
|
|
|||||
|
.
|
Соррян, не заметил про уже установленный cacheAsBitmap. Однако его установка может вызвать падение производительности. Проверьте, что это не ваш случай. Насколько помогло или, наоборот, усугубило установка этого флага?
Ну скиньте сюда или в личку сслыль на тестовый пример, я постараюсь помочь наживую. |
|
|||||
|
Регистрация: Jan 2012
Сообщений: 836
|
Цитата:
|
![]() |
![]() |
Часовой пояс GMT +4, время: 15:05. |
|
|
« Предыдущая тема | Следующая тема » |
|
|