AS3 Что вызывает отставание при использовании боковых прокруток?

Я программировал боковую прокрутку на основе учебника, найденного в книге. Мой друг сделал то же самое, и его работает отлично.

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

Однако отставание присутствует только тогда, когда на сцене есть «стены». Когда прокручиваю мимо них, лаг уходит, потом возвращается.

Стены и полы используют один и тот же код (они оба назначаются как переменные «floorObjects») и используют один и тот же код столкновения, однако я не могу понять, почему возникает задержка.

С того места, где персонаж начинается (примерно в 60 раз), если персонаж идет влево, возникает ОГРОМНОЕ количество задержек. Если я пойду вправо, задержка не будет слишком большой, пока экран не начнет прокручиваться.

Я полагаю, что задержка при движении влево может быть связана с тем, что программа не позволяет прокручивать карту и т. Д. Но я не могу понять, почему возникает задержка при попытке двигаться вправо.

Я перечислил код прокрутки и основной цикл, если нужно, я могу загрузить код коллизий, и любая помощь будет принята с благодарностью.

Код прокрутки;

public function scrollGame()
        {

            var stagePosition:Number = gameLevel.x + player.mc.x;
            var rightEdge:Number = stage.stageWidth - edgeDistance;
            var leftEdge:Number = edgeDistance;
            //Scroll the GameLevel to the Left if player moves right
            if(stagePosition > rightEdge)
            {
                gameLevel.x -= (stagePosition - rightEdge);
                //Prevent the game scrolling off the stage
                if (gameLevel.x < -(gameLevel.width-stage.stageWidth)) 
                    gameLevel.x = -(gameLevel.width-stage.stageWidth);                      
            }
            //Scroll the GameLevel to the right if player moves left
            if(stagePosition < leftEdge)
            {
                gameLevel.x += (leftEdge - stagePosition);
                //Prevent the game scrolling off the stage
                if(gameLevel.x > 0) 
                    gameLevel.x = 0;                
            }

        }

Основной цикл:

public function gameLoop(e:Event)
        {
            //Get Time Difference
            if(lastTime == 0) lastTime = getTimer();
            var timeDiff:int = getTimer() - lastTime;
            lastTime += timeDiff;

            //Game Cycle tasks
            //Only perform if in play mode
            if(gameMode == "play")
            {
                moveCharacter(player, timeDiff);
                moveEnemies(timeDiff);
                checkCollisions();
                scrollGame();

            }
        }

ОБНОВИТЬ:

Так что я его "профилировал", большая часть времени тратится либо на функцию MoveCharacter(), либо на команду gotoAndStop(). Поэтому я удалил это, и это не имело значения, все еще отставало. Затем я также удалил врагов, которые все еще отстают. Но снижение качества до низкого каким-то образом исправило это (хотя сейчас качество плохое). Есть идеи относительно того, что вызывает отставание и как его исправить?


person NeoKuro    schedule 28.04.2014    source источник
comment
Ваша функция scrollGame не выглядит особенно интенсивной. Ваша функция gameLoop вызывает некоторые другие методы, которые могут быть медленными, а могут и нет - мы не можем сказать. Он может даже просто медленно рисовать мир. Я бы использовал профилировщик, чтобы выяснить, на что тратится время, и тогда мы сможем посоветовать, как улучшить эту конкретную часть.   -  person AndySavage    schedule 28.04.2014
comment
Спасибо, я новичок во Flash, ха-ха. Что такое профилировщик, я не могу сказать, что слышал о нем раньше :/   -  person NeoKuro    schedule 28.04.2014
comment
Ах, неважно, кажется достаточно простым (я предполагаю, что Adobe Scout будет достаточно? :L)   -  person NeoKuro    schedule 28.04.2014
comment
Итак, я профилировал его, большая часть времени тратится либо на функцию MoveCharacter(), либо на команду gotoAndStop(). Поэтому я удалил это, и это не имело значения, все еще отставало. Затем я также удалил врагов, которые все еще отстают. Но снижение качества до низкого каким-то образом исправило это (хотя сейчас качество плохое). Есть идеи относительно того, что вызывает отставание и как его исправить?   -  person NeoKuro    schedule 28.04.2014
comment
Для меня это звучит очень похоже на то, что вы тратите время на рисование, а не на AS-код. Быстрый способ проверить это — скрыть содержимое (например, ваш фон или что-либо еще, что прокручивается) и проверить производительность. Если скорость рисования является вашим узким местом, вам, вероятно, следует открыть это как новый вопрос (или сделать его конкретным), поскольку это совершенно другой путь оптимизации.   -  person AndySavage    schedule 28.04.2014
comment
Ах. Да, что я сделал (что и сделала книга), так это использовал тайловую систему. Так много блоков 40x40, и код должен был смотреть на каждый из них и проверять на коллизии (дважды на символ). Я закончил тем, что просто объединил их в большие блоки, и, похоже, на данный момент это сократило отставание :)   -  person NeoKuro    schedule 29.04.2014


Ответы (1)


это из флеш университетской книги, не так ли?

Код в порядке.

Я знаю, что будет лагать в вашей флеш игре.

Однако это предположение, и я иногда получаю эту ошибку.

Убедитесь, что ваши изображения оптимизированы!

Если они импортированы из фотомагазина или illustratro, то вспышке придется иметь дело с этими сложными векторными точками.

Используйте .png для прозрачных изображений, растровые изображения тоже не помешают.

person Moynul    schedule 29.04.2014
comment
Спасибо и да это так. Я использую Photoshop и сохраняю все свои изображения (прозрачные или нет) в формате .png, но он импортирует их в виде растровых изображений. Затем я почти всегда конвертировал в символ.) Увеличивают ли символы нагрузку или не имеют никакого значения? :/ - person NeoKuro; 30.04.2014
comment
@NeoKUro, если вы собираетесь использовать изображение два раза, преобразуйте его в видеоклип, оно занимает меньше памяти. - person Moynul; 30.04.2014
comment
Хм, хорошо, есть только одна пара, которая действительно делает это, это мои облака (эта петля), но я собираюсь сделать ее прокруткой с парраллаксом, поэтому в конце нужна только 1, но сейчас игра слишком лагает. Я думаю, что это может быть рисунок, но у моего друга гораздо больше объектов, чем у меня, и он работает нормально, он сказал, что просто оптимизировал свой код, помещая вещи в функции как можно больше, вместо того, чтобы повторять это. Но не уверен, что это сильно повлияет на мою. - person NeoKuro; 30.04.2014
comment
насколько велик ваш swf-файл? вместе с вашим файлом .fla? - person Moynul; 30.04.2014