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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 30.04.2009, 14:16
FreeS вне форума Посмотреть профиль Отправить личное сообщение для FreeS Посетить домашнюю страницу FreeS Найти все сообщения от FreeS
  № 1  
Ответить с цитированием
FreeS

Регистрация: Sep 2008
Адрес: Lviv, Ukraine
Сообщений: 5
Отправить сообщение для FreeS с помощью ICQ
По умолчанию AS2 to AS3 - жуткие тормоза

Делаю игру. Начал делать на АС2 но начали появляться подтормаживания и просадки фпс. Пока не критично, но ещё много впереди и в конце концов, это стало бы узким местом. Решил перебросить всё на АС3 пока не поздно, т.к. он вроде пошустрее, НО, получил тормозов ещё больше!

Что имеем:
вид сверху, в центре герой, бекгроунд - 2 штука растра 2500х2500 + ещё там фигни всякой типа мувика для хит теста и т.д.
Герой на месте, двигаю только бекгроунд со всеми составляющими.
В АС3 версии даже без ХитТеста, только скролл бека - фпс падает до 20-25. АС2 30 держал стабильно и с ХитТестом и стрельбой.

Код писал на фрейме мувика лежащего на главной сцене. Все обьекты внутри этого мувика. Вот код:

Код AS3:
stop();
//stage.frameRate = 120;
//var plsp = 25;
var speed:Number = 3.5;
var xspeed:Number = 0;
var yspeed:Number = 0;
//var lev = 0;
MovieClip(root).center.visible = false;
sf_holder.visible = false;
hit.visible = false;
Lshadow.vbullet.visible = false;
var canLight:Boolean = true;
var kLEFT:Boolean = false;
var kRIGHT:Boolean = false;
var kUP:Boolean = false;
var kDOWN:Boolean = false;
var radians:Number;
var grad:Number;
 
function ch_l() {
canLight = true;
}
 
var signal = true;
getFPS = function() {
    if(signal == true) {
        time = getTimer();
    } else {
        rate = int(1000 / (getTimer() - time));
    }
    signal = !signal;
    //return rate;
	MovieClip(root).fpst.text = "FPS: " + rate;
}
 
function enterFrameHandler( event : Event ) : void {
getFPS();
 
radians = Math.atan2 (hero.x-mouseX, hero.y-mouseY);
grad = -radians * 180 / Math.PI;
hero.rotation = grad;
 
 
if(kLEFT){ xspeed -= speed;}
if(kRIGHT){ xspeed += speed;}
if(kUP){ yspeed -= speed;}
if(kDOWN){ yspeed += speed;}
 
	Lshadow.x += xspeed*-1;
	Lshadow.y += yspeed*-1;
	grnd.x += xspeed*-1;
	grnd.y += yspeed*-1;
	trees.x += xspeed*-1;
	trees.y += yspeed*-1;
	hit.x += xspeed*-1;
	hit.y += yspeed*-1;
 
Lshadow.heroLight.rotation = hero.rotation;
Lshadow.heroLight.x += xspeed;
Lshadow.heroLight.y += yspeed;
Lshadow.shL.x += xspeed;
Lshadow.shL.y += yspeed;
 
	xspeed = 0;
	yspeed = 0;
 
      }
 
function keyPressed(event:KeyboardEvent):void {
 
if(event.keyCode == Keyboard.LEFT){
	kLEFT = true;
}
if(event.keyCode == Keyboard.RIGHT){
	kRIGHT = true;
}
if(event.keyCode == Keyboard.UP){
	kUP = true;
}
if(event.keyCode == Keyboard.DOWN){
	kDOWN = true;
}
 
}
function keyUP(event:KeyboardEvent):void {
 
if(event.keyCode == Keyboard.LEFT){
	kLEFT = false;
}
if(event.keyCode == Keyboard.RIGHT){
	kRIGHT = false;
}
if(event.keyCode == Keyboard.UP){
	kUP = false;
}
if(event.keyCode == Keyboard.DOWN){
	kDOWN = false;
}
 
}
 
 
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressed);
stage.addEventListener(KeyboardEvent.KEY_UP, keyUP);
addEventListener( Event.ENTER_FRAME, enterFrameHandler );
С АС3 незнаком. Это первый опыт. Никак не пойму где туплю, откуда такие тормоза ?

Старый 30.04.2009, 14:25
mre вне форума Посмотреть профиль Отправить личное сообщение для mre Посетить домашнюю страницу mre Найти все сообщения от mre
  № 2  
Ответить с цитированием
mre
 
Аватар для mre

Регистрация: Jul 2007
Адрес: Москва
Сообщений: 996
Цитата:
Сообщение от FreeS Посмотреть сообщение
т.к. он вроде пошустрее
Пошустрее он при выполнении грамотного кода, а не при отрисовке битмап таких размеров "+ ещё там фигни всякой".
__________________
Griver

Старый 30.04.2009, 14:41
FreeS вне форума Посмотреть профиль Отправить личное сообщение для FreeS Посетить домашнюю страницу FreeS Найти все сообщения от FreeS
  № 3  
Ответить с цитированием
FreeS

Регистрация: Sep 2008
Адрес: Lviv, Ukraine
Сообщений: 5
Отправить сообщение для FreeS с помощью ICQ
Цитата:
Сообщение от mre Посмотреть сообщение
Пошустрее он при выполнении грамотного кода, а не при отрисовке битмап таких размеров "+ ещё там фигни всякой".
Пофлеймил, молодец. А по существу ответить ? Никак ?
Битмап тут не причём, на АС2 всё норм. По коду - для того тут и спрашиваю. Если есть ошибки буду благодарен за подсказки.

Старый 30.04.2009, 14:57
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 4  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
А вы еще больше анонимных функций насоздавайте, так оно может вообще не стартанет...
Кроме того, не понятно как вы отрисовку делаете... Логичнее всего делать это с помощью copyPixels и отрисовывать только видимую часть, ну или как-то так, а не рисовать каждый раз огромный битмап.
Кроме того, если вам нужны множественные преобразования позиционирования / поворота / размеров лучше использовать DisplayObject#transform.matrix, а не x, y, width, height, rotation.
Ну и вообще на таймлайне лучше не писать...
__________________
Hell is the possibility of sanity

Старый 30.04.2009, 15:35
FreeS вне форума Посмотреть профиль Отправить личное сообщение для FreeS Посетить домашнюю страницу FreeS Найти все сообщения от FreeS
  № 5  
Ответить с цитированием
FreeS

Регистрация: Sep 2008
Адрес: Lviv, Ukraine
Сообщений: 5
Отправить сообщение для FreeS с помощью ICQ
Цитата:
А вы еще больше анонимных функций насоздавайте, так оно может вообще не стартанет...
Это вы имеете в виду вот это:
getFPS = function() {
? если да, то оно на скорость не влияет, по крайней мере существенно (убирал всё кроме вывода фпс - всё работало на максимум.
Цитата:
Кроме того, не понятно как вы отрисовку делаете... Логичнее всего делать это с помощью copyPixels и отрисовывать только видимую часть, ну или как-то так, а не рисовать каждый раз огромный битмап.
Да, у меня отрисовывается целый битмап. Если есть возможность рисовать только видимую часть - то это есть гуд. Ещё бы ссылочку на примерчик, и я был бы счастлив

Цитата:
Кроме того, если вам нужны множественные преобразования позиционирования / поворота / размеров лучше использовать DisplayObject#transform.matrix, а не x, y, width, height, rotation.
ок, спасибо, попробую.

Цитата:
Ну и вообще на таймлайне лучше не писать...
ну, это да, но я пока не совсем вьехал в классы и т.п. Начинаю с более простого варианта.

Старый 30.04.2009, 15:52
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 6  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Где-то на форуме была тема по этому поводу... попробуйте поискать "spritesheet" или как-то так...
Вот есть пару статей, вроде в тему, но там было лучше описано...
http://blog.touchmypixel.com/archives/5
http://tutorial.jcwcn.com/2D-Graphic...-08/11049.html
__________________
Hell is the possibility of sanity

Старый 02.05.2009, 15:22
Random1984 вне форума Посмотреть профиль Отправить личное сообщение для Random1984 Найти все сообщения от Random1984
  № 7  
Ответить с цитированием
Random1984

Регистрация: Mar 2009
Адрес: (0,0,0)
Сообщений: 7
Зделайте наоборот - герой ходит по карте и на нем сфокусирована камера.
Код AS1/AS2:
var map:MovieClip;//- мувик карты
var hero:MovieClip;// - мувик героя (он находится на карте, соответственно в мувику map)
 
//Далее делаем так, чтобы герой был всегда по центру экрана
var rect_mask:Rectangle;//  - прямоугольная область которая будет видна на экране
//rect_mask.x rect_mask.y - координаты верхнего левого угла видимой области
//rect_mask.width rect_mask.height - ширина и высота видимой области
var stageWidth:int; - ширина экрана
var stageHeight:int; - высота экрана
//для того, что бы герой был всегда по центру экрана нужно чтобы он был в центре этой прямоугольной области
rect_mask.x=hero.x-stageWidth/2;
rect_mask.y=hero.y-stageHeight/2;
rect_mask.width=stageWidth;
rect_mask.heigth=stageHeight;
 
map.scrollRect = rect_mask;// выводим на экран прямоугольную область на экран
вроде так. Плюс контроль границ карты.

Таким образом, карта неподвижна, двигаются только юниты на ней, посему ненужно ее перерисовывать каждый раз, двигать ее мувик, двигать статические обекты на ней. Скролрект попиксельно скопирует содержимое мар на экран, так должно быть быстрее. Плюс к этому, логичнее, когда юниты двигаются по карте, а не когда под героем ездит карта. При этом нужно будет делать апдейт только движущихся обектов, деревья и все остальное трогать не надо будет.
http://murejib.com/2008/04/24/ scrollrect-2/

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

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

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


 


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


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