Pergunta

Update 6 :

Fenomenas sugeriu-me para recriar tudo o mais simples possível. Eu tinha minhas dúvidas que este faria qualquer diferença como o algoritmo continua a mesma, eo desempenho não parece ser o problema. Enfim, foi a única sugestão que eu tenho isso aqui está:

  1. 30 FPS: http://www.feedpostal.com/test/ simples / 30 / SimpleMovement.html
  2. 40 FPS: http://www.feedpostal.com/test/ simples / 40 / SimpleMovement.html
  3. 60 FPS: http://www.feedpostal.com/test/ simples / 60 / SimpleMovement.html
  4. 100 FPS: http://www.feedpostal.com/test/ simples / 100 / SimpleMovement.html

O código:

package {
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.KeyboardEvent;
    import flash.utils.getTimer;

    [SWF(width="800", height="600", frameRate="40", backgroundColor="#000000")]

    public class SimpleMovement extends Sprite
    {
        private static const TURNING_SPEED:uint = 180;
        private static const MOVEMENT_SPEED:uint = 400;
        private static const RADIAN_DIVIDE:Number = Math.PI/180;
        private var playerObject:Sprite;
        private var shipContainer:Sprite;
        private var moving:Boolean = false;
        private var turningMode:uint = 0;
        private var movementTimestamp:Number = getTimer();
        private var turningTimestamp:Number = movementTimestamp;

        public function SimpleMovement()
        {
            //step 1: create player object
            playerObject = new Sprite();
            playerObject.graphics.lineStyle(1, 0x000000);
            playerObject.graphics.beginFill(0x6D7B8D);
            playerObject.graphics.drawRect(0, 0, 25, 50);
            //make it rotate around the center
            playerObject.x = 0 - playerObject.width / 2;
            playerObject.y = 0 - playerObject.height / 2;
            shipContainer = new Sprite();
            shipContainer.addChild(playerObject);
            shipContainer.x = 100;
            shipContainer.y = 100;
            shipContainer.rotation = 180;
            addChild(shipContainer);

            //step 2: install keyboard hook when stage is ready
            addEventListener(Event.ADDED_TO_STAGE, stageReady, false, 0, true);

            //step 3: install rendering update poll
            addEventListener(Event.ENTER_FRAME, updatePoller, false, 0, true);
        }

        private function updatePoller(event:Event):void
        {
            var newTime:Number = getTimer();

            //turning
            if (turningMode != 0)
            {

                var turningDeltaTime:Number = newTime - turningTimestamp;
                turningTimestamp = newTime;
                var rotation:Number = TURNING_SPEED * turningDeltaTime / 1000;
                if (turningMode == 1) shipContainer.rotation -= rotation;
                else shipContainer.rotation += rotation;
            }

            //movement
            if (moving)
            {
                var movementDeltaTime:Number = newTime - movementTimestamp;
                movementTimestamp = newTime;
                var distance:Number = MOVEMENT_SPEED * movementDeltaTime / 1000;
                var rAngle:Number = shipContainer.rotation * RADIAN_DIVIDE; //convert degrees to radian
                shipContainer.x += distance * Math.sin(rAngle);
                shipContainer.y -= distance * Math.cos(rAngle);
            }
        }

        private function stageReady(event:Event):void
        {
            //install keyboard hook
            stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDown, false, 0, true);
            stage.addEventListener(KeyboardEvent.KEY_UP, keyUp, false, 0, true);
        }

        private final function keyDown(event:KeyboardEvent):void
        {
            if ((event.keyCode == 87) && (!moving))  //87 = W
            {
                movementTimestamp = getTimer();
                moving = true;
            }
            if ((event.keyCode == 65) && (turningMode != 1)) //65 = A
            {
                turningTimestamp = getTimer();
                turningMode = 1;
            }
            else if ((event.keyCode == 68) && (turningMode != 2)) //68 = D
            {
                turningTimestamp = getTimer();
                turningMode = 2;
            }
        }

        private final function keyUp(event:KeyboardEvent):void
        {
            if ((event.keyCode == 87) && (moving)) moving = false; //87 = W
            if (((event.keyCode == 65) || (event.keyCode == 68)) && (turningMode != 0)) turningMode = 0; //65 = A, 68 = D
        }
    }
}

Os resultados foram como eu esperava. Absolutamente nenhuma melhoria. Eu realmente espero que alguém tem outra sugestão como essa coisa precisa de conserto. Além disso, eu duvido que é o meu sistema como eu tenho um muito bom (8 GB de RAM, Q9550 QuadCore Intel, ATI Radeon 4870 512MB). Além disso, todos os outros eu pedi até agora tinha o mesmo problema com o meu cliente.

Update 5: outro exemplo de um jogo em flash suave apenas para demonstrar que o meu movimento definitivamente é diferente! Consulte http://www.spel.nl/game/bumpercraft.html

Update 4 : Eu segui o tempo antes da renderização (Event.RENDER) e logo após renderização (Event.ENTER_FRAME), os resultados:

rendering took: 14 ms
rendering took: 14 ms
rendering took: 12 ms
rendering took: 16 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 14 ms
rendering took: 12 ms
rendering took: 16 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 14 ms
rendering took: 12 ms
rendering took: 16 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 16 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 16 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 16 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 16 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 16 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 16 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 16 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 16 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 16 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 16 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 16 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 16 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 14 ms
rendering took: 14 ms
rendering took: 14 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 16 ms
rendering took: 12 ms
rendering took: 24 ms
rendering took: 18 ms
rendering took: 16 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 16 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 16 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 16 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 16 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 16 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 16 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 16 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 16 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 16 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 16 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 16 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 16 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 16 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 16 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 16 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 16 ms
rendering took: 12 ms
rendering took: 232 ms
rendering took: 14 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 16 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 16 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 16 ms
rendering took: 12 ms
rendering took: 14 ms
rendering took: 12 ms

O intervalo é de 12-16 ms. Durante estas diferenças, o / deformação / movimento vacilante chocante já estava acontecendo. Há também um pico de 232ms, neste momento houve uma relativamente grande warp. Esta não é, contudo, a maior problme, o maior problema são as pequenas deformações contínuas durante o movimento normal. Será que este dê a ninguém um indício?

Update 3: Após o teste, eu sei que os seguintes fatores são não causando meu problema:

  • qualidade do Bitmap -.> Alterados com photoshop para um mais feio 8 cores otimizada gráfico, nenhuma melhoria em tudo
  • constante rotação de imagem, rodando -> desativado-lo, nenhuma melhoria em tudo
  • renderização Browser -> tentou usar o flash player autônomo, nenhuma melhoria em tudo

Estou 100% convencido de que as mentiras de problema em qualquer meu código ou no meu algoritmo. Por favor, me ajude. Tem sido quase duas semanas (1 semana que eu fiz esta pergunta no SO) agora e eu ainda tenho que começar minha resposta de ouro.

Update 1:. veja abaixo para fonte projeto Flex completa e uma demonstração ao vivo demonstrando meu problema

Eu estou trabalhando em um jogo em flash 2d. navios do jogador são criados como um objeto:

ships[id] = new GameShip();

Quando o movimento e rotação informação está disponível, isto está sendo direcionado para o navio correspondente:

ships[id].setMovementMode(1); //move forward

Agora, dentro desse movimento GameShip objeto funciona usando o evento "Event.ENTER_FRAME":

addEventListener(Event.ENTER_FRAME, movementHandler);

A função a seguir é então a ser executado:

private final function movementHandler(event:Event):void
        {
            var newTimeStamp:uint = UtilLib.getTimeStamp(); //set current timeStamp
            var distance:Number = (newTimeStamp - movementTimeStamp) / 1000 * movementSpeed; //speed = x pixels forward every 1 second
            movementTimeStamp = newTimeStamp; //update old timeStamp
            var diagonalChange:Array = getDiagonalChange(movementAngle, distance); //the diagonal position update based on angle and distance
            charX += diagonalChange[0];
            charY += diagonalChange[1];
            if (shipContainer)
            { //when the container is ready to be worked with
                shipContainer.x = charX;
                shipContainer.y = charY;
            }
        }

private final function getDiagonalChange(angle:Number, distance:Number):Array
        {
            var rAngle:Number = angle * Math.PI/180; //convert degrees to radian
            return [Math.sin(rAngle) * distance, (Math.cos(rAngle) * distance) * -1];
        }

Quando o objeto não está se movendo, o ouvinte de evento serão removidos. O mesmo método é utilizado para a rotação. Tudo funciona quase perfeito.

Eu defini-alvo do projeto FPS 100 e criou um contador de FPS. De acordo com o contador de FPS, o FPS média no firefox é de cerca de 100, enquanto o topo é de 1000 e no fundo é 22. Eu acho que a parte inferior e superior FPSs única estão acontecendo durante a inicialização do cliente (inicialização).

O problema é que o navio parece estar quase perfeitamente lisa, enquanto should ser apenas isso sem a parte "quase". É quase como se o navio estiver "piscando" muito, muito rápido, você não pode realmente vê-lo, mas é difícil de se concentrar no objeto enquanto ele está movendo-se com seus olhos. Além disso, de vez em quando, parece haver um pouco de pico framerate, como se o cliente está ignorando um par de quadros, você, em seguida, vê-lo rapidamente warp.

É muito difícil explicar o que o verdadeiro problema é, mas em geral é que o movimento não é perfeitamente lisa. Então, você tem alguma sugestão sobre como fazer o movimento ou transição de objetos perfeitamente lisa?

Update 1:

Eu recriado o cliente para demonstrar o meu problema. Por favor verificá-la.

O cliente: http://feedpostal.com/test/MovementTest .html

O projeto do ActionScript (fonte cheio): http: // feedpostal. com / test / MovementTest.rar

Um exemplo de um jogo em flash suave (não foi criado por mim): http://www.gamesforwork.com/games/swf/Mission%20Racing_august_10th_2009.swf

Levei um tempo muito longo para recriar esta versão do lado do cliente, espero que este ajuda a vontade de resolver o problema.

Por favor nota: sim, é realmente muito suave. Mas definitivamente não é bom o suficiente.

Foi útil?

Solução

Eu não sei se há alguma resposta de ouro aqui, mas eu tenho um par de sugestões.

Em primeiro lugar, eu dispensar quaisquer investigações sobre coisas como otimizar Math.PI / 180, e assim por diante. O geralmente elevada taxa de quadros deve deixar claro que cálculos simples não estão retardando qualquer coisa para baixo.

Em segundo lugar, para resolver os picos ocasionais de lag display: Estes olhar para mim muito parecido com o coletor de lixo está sendo executado com muita freqüência. Em um breve olhar através de seu código não vi quaisquer causas óbvias de GCs freqüentes, mas eu tenho duas sugestões. Primeiro, se você tem acesso ao IDE Flash, eu ia tentar recriar seu projeto sem utilizar a estrutura Flex. projecto A Flash não inclui qualquer código exceto o que você colocar, mas Flex emprega um monte de sua própria Arcanery, que pode não ser sempre óbvio, e alguma interação entre o código eo quadro pode estar causando GCs.

Se isso não ajuda, a outra coisa para tentar seria fazer uma versão muito simplificada do seu código (em Flash, se possível), que poderia vir a ser bastante simples para não provocar os mesmos picos. Quero dizer, por exemplo, uma única classe anexado ao gráfico, que tem apenas um ouvinte para eventos-chave e um segundo ouvinte para o frame (ou temporizador) eventos, dentro do qual há variáveis ??são criados. Se uma versão mínima não exibir esses picos, então ele deve ser possível para triangular entre isso e seu cliente completo, para descobrir o que está causando os pontos.

Finalmente, quanto à lisura geral, o meu único comentário seria que atualizações de tela do Flash são inerentemente ligeiramente irregular, e realisticamente você só tem duas abordagens disponíveis. Ou você mover seus atores de acordo com atualizações quadro, o que torna o seu movimento ligeiramente irregular como framerates variar, ou movê-los de acordo com o tempo decorrido, o que torna o seu movimento global de suavizar (em pixels por segundo), mas a sua exibição ligeiramente irregular (em pixels moveu por trama). A diferença é ampliada em maior FPS.

Além disso, é importante lembrar que após o Flash tem feito suas atualizações, como eles aparecem na tela é fortemente influenciada por sua placa de vídeo. Especialmente você vai descobrir que corte e vsync questões podem ser altamente perceptível em um ambiente e ausente em outra. Não há nenhuma maneira real, o desenvolvedor pode resolver isso, a não ser para evitar geralmente animações muito alto FPS e manter a carga geral do processador tão baixo quanto possível.

Editar: Para saber mais sobre o que quero dizer sobre a actualização de quadro tempo sendo "inerentemente desigual", consulte este post . O atraso entre as atualizações de tela variando entre 12-16ms não é algo que você pode fazer nada a respeito; é um resultado do fato de que o sistema operacional eo navegador influenciar obras de temporização do modo de flash. (Também é algo que você vai ver mesmo em um filme vazio, razão pela qual muitos comentários neste tópico sobre como otimizar matemática e assim por diante não estão indo para ajudá-lo.) Você não pode evitar este tipo de variação, mas como eu disse acima, você pode adaptar-lhe efeitos visuais para evocar o efeito desejado. De qualquer forma, eu acho que os pontos são muito mais vale a pena se preocupar. A variação que você está olhando é sutil, e vai ser difícil de aviso em um jogo com muitas coisas acontecendo, mas os picos são flagrantes.

Editar 2 Você pergunta: "Você realmente acha que esses jogos suaves usar o mesmo algoritmo movimento como eu faço?"

A resposta é, eu acho que eles estão fazendo algo muito mais simples. Eles estão quase certamente fazer um dos seguintes procedimentos:

function onEnterFrame() { // move at a constant speed per frame
    ship.angle += dtheta;
    ship.x += speed * Math.cos( ship.angle );
    ship.y += speed * Math.sin( ship.angle );
}

function onEnterFrame2() { // move at a constant speed per second
    var dt:Number = getTimeSinceLastFrame();
    ship.angle += anglePerSecond * dt/1000;
    var dist:Number = speedPerSecond * dt/1000;
    ship.x += dist * Math.cos( ship.angle );
    ship.y += dist * Math.sin( ship.angle );
}

Em outras palavras, ou mover uma distância constante por trama, ou uma distância constante por segundo. Essas são as duas maneiras mais simples você pode se aproximar isso, e são as duas opções que vão resultar na aparência mais suave do Flash. Eles parecem idênticos em um consframerate tant, eo último método ficará mais suave em diferentes ligeiramente framerates por razões semelhantes ao "aliasing temporal" mencionado no artigo é ligada. Mas a escolha entre esses métodos realmente se resume a, se um pico de CPU ocorre, depois que mais você quer o navio ter mantido em movimento ou não? Que é realmente uma questão de design de jogo. Uma coisa que eu fiz no passado é usar o segundo método, enquanto aperto dt a no máximo 2 ou 3 vezes a duração de um quadro ideal (1 / fps).

Como você já deve ter percebido, os dois métodos Eu só recomendados são exatamente o que o "Corrigir o seu timestep!" artigo diz não fazer. Isto é porque este artigo é sobre integradas numericamente motores de física, e isso não é o que você está fazendo. Se você começar molas e gravidade implementação, então sim, sempre que os Timesteps obter grande que irá introduzir um monte de erros, porque para esse tipo de simulação, a coisas simplificar, o erro depende do tamanho da iteração. Em que você está fazendo, não, de modo ocasionais grandes Timesteps não afetam a exatidão da simulação.

Responder para atualizar 6

Em primeiro lugar, eu não dizer-lhe o seu problema foi o desempenho, eu disse especificamente o contrário. Sugeri uma reprodução mínima, porque eu acreditava que o seu problema era ou em outro lugar no seu projeto, ou inevitável, e eu ainda faço. Em segundo lugar, agora me sinto ditado bastante confortável que você está fazendo as coisas da mesma forma que qualquer outro jogo de Flash, e qualquer problema que você vê não pode ser resolvido diferente na percepção. Nos novos links que você postou, os olhares de animação perfeitamente lisa se eu vê-lo no leitor de SWF autônomo, e tem cintilação sutil na frente e nas costas bordas em navegadores (moreso no Firefox do que no IE). Tecnicamente, eu não acho que ele pode melhorar (especialmente quando é basicamente perfeito no jogador autônomo, o que implica que qualquer choppiness em navegadores é influenciada pelo contêiner.)

É claro que o percebido desempenho ainda pode melhorar. Se o navio não contrastam tão fortemente com o fundo, por exemplo, a cintilação seria muito menos perceptível. Além disso, simplesmente fazendo o movimento navio mais lentamente faria o movimento parece muito mais suave, e pode ser combinado com um fundo mover-se para dar uma ilusão de maior velocidade (como um de seus exemplos fez).

Como uma verificação de sanidade, aqui está uma versão mínima semelhante fiz no IDE. http://www.fenomas.com/random/ship/ O desempenho é comparável ao seu na minha máquina, e como eu disse, eu realmente não vejo qualquer problema. (Exceto o pico ocasional, que agora notar só ocorre para mim no Firefox.) Mais uma vez, especialmente o fato de que ambas as versões parecem basicamente perfeito para me no player autônomo mais me convence que não há nenhum algoritmo de ouro aqui. Eu sei que não é a resposta que você quer, mas é o que eu tenho.

Outras dicas

Seu código é executado sem problemas para mim. Há picos qualquer. Testado com o seguinte código adicionado no final da função updatePoller.

var shadow:Sprite = new Sprite();
shadow.graphics.beginFill(0xFFFFFF, 0.01);
shadow.graphics.lineStyle(1, 0xFFFFFF, 0.8);
shadow.graphics.drawRect(0, 0, 25, 50);
this.addChildAt(shadow, 0);
shadow.x = shipContainer.x;
shadow.y = shipContainer.y;
shadow.rotation = shipContainer.rotation;

A versão 100 fps tende a ficar padrões não uniformes, mas é normal, porque com base no seu cálculo, que não pode ser possível tornar 100 quadros em um segundo, se calcular um quadro preciso mais do que 10 ms. Então, para mim, pelo menos, o último código é executado sem problemas, em 30fps.

Quanto à parte difusa, uma das principais DOOH, e espero que você não vai ficar bravo comigo perguntando: Existe alguma chance de que o efeito difuso / embaçada é porque seu monitor? Mesmo a 10 ms de tempo de resposta em um monitor LCD, um branco que se move rapidamente algo imposto sobre um fundo preto estática, tende a olhar embaçado.

Eu acho que a raiz do seu problema é que o " sincronização vertical" não é a mesma que a da tela. Este é o mesmo problema que ocorre quando se olha para um filme 24fps em um, digamos, tela de 60Hz. As atualizações não irá combinar perfeitamente com up (no seu caso 100/60) e quando eles atingiram um salto ainda maior ele será parecido com um pequeno tremor em movimento.

Isto pode ser um pouco remediado, diminuindo sua taxa de quadros, qualquer coisa acima que da tela é apenas um desperdício de poder de processamento de qualquer maneira. Ele realmente não pode ser totalmente evitada, embora o wmodes mais recentes para flash de incorporação pode ser uma solução possível.

Posso sugerir que você está se preocupando prematuramente?

Se você olhar atentamente para o "perfeitamente lisa" jogo flash ligado a você, você vai perceber que ele está enganando vocês com o '' ilusão '' de movimento suave.

O carro não está se movendo muito rápido em tudo - provavelmente um pixel a cada poucos quadros. É o fundo que faz a maioria do movimento. Tome um olhar mais atento: há um pouco de jitter e o mesmo "difícil se concentrar" efeito que você está tentando consertar, mas já que é o fundo, parece normal. E mesmo quando o carro mostra esses efeitos, o fundo e jogabilidade distraí-lo de percebê-los.

Eu acho que você está percebendo o jitter, porque tudo que você tem agora é um navio em movimento sobre um fundo perfeitamente preto. Uma vez que o resto do jogo está no lugar, um jogador provavelmente não terá a atenção livre para observar um pouco jitter. Quanto à "difícil se concentrar" efeito, ele vai embora, como você reduzir a velocidade de movimento do navio.

Por que você não trabalhar no resto do jogo em primeiro lugar? Você sempre pode voltar e ajustar o movimento mais tarde, se ainda é um problema. Você está gastando muito tempo em um artefato animação. Não é o jogo mais importante?

Esta é uma boa pergunta. Eu já examinou o código e eu tenho algumas sugestões, embora o meu conselho pode não ser tão bom.

Eu estou pensando que você pode fazer um monte de otimizar o código. Obviamente, não nesta fase inicial. Mas você pode ter um teste com esse código e veja rápido ele é executado com o código otimizado, então você vai saber se vale a pena continuar.

Aqui estão as minhas 'objeções':

  • Você usa um monte de divisões. Divisão é mais caro do que multiplicação.

    var distance: Number = (newTimeStamp - movementTimeStamp) / 1000 * movementSpeed;

pode ser facilmente escrito como

var distance:Number = (newTimeStamp - movementTimeStamp) * .001 * movementSpeed;
  • Você tem um monte de referências a um monte de funções.

    Coisas como fixAngle () e assim por diante pode ser dentro da mesma função, sem ter chamadas de volta em execução e para trás, que muitas vezes. Isso se aplica a referências a classes externas e Math.PI ou Math.sin e assim por diante, como fenomas e Allan apontou.

Eu testei este método para seno e cosseno e é rápido sangrenta. Claro que faz com que o sujo código, mas é por isso que você não otimizar esse breve, até que você tem mais do mesmo funcionando da maneira que precisa de trabalho, otimizando só vai fazer você enlouquecer como o código vai ficar mais difícil de ler. Da minha experiência pecado e cos são operações muito caras.

Como os outros já mencionado, você pode estar preocupando demais nesta etapa. Tenha em mente há um monte de coisas que você pode ganhar velocidade em diante, até que você tem toda a lógica a funcionar correctamente, nem sequer pensar sobre como otimizar.

Eu acho que isso é quase certamente porque você está acima em 80fps. Flash simplesmente não pode dar uma taxa de quadros consistentes tão rápido. Desça para 30fps e testes de sustento. Além disso, tentar voar o navio em frente de um fundo real, e eu acho que você vai perceber isso menos.

não é existe Os arquivos para download ( http://feedpostal.com/test/MovementTest.rar ).

Eu respondi outra questão relativa a este assunto, leia abaixo:

Eu sinto sua dor como eu estou atualmente nas trincheiras desenvolver meu próprio jogo. Com as predefinições, o renderizador flash produz problemas rasgar tela / V-Sync horríveis, independentemente do que o código que você produz.

Este é por isso que eu estava satisfeito por ter encontrado o mais simples, a resposta elegante, que não foi re-factoring código (que não ajuda um único bit, o problema é o jogador Flash, não o código).

Apenas permitir a aceleração de hardware em sua Configurações de publicação . Há duas opções diferentes:

Nível 1: direto ; e Nível 2:. GPU

Leia mais sobre o assunto na documentação oficial: Especificar configurações de publicação para arquivos SWF , e decidir o que é a melhor opção para o seu jogo.

Mercado alvo desempenha um fator aqui, se é um jogo sério para os jogadores, você não precisa se preocupar com possíveis problemas de desempenho, como a maioria dos jogadores tem GPU.

este artigo não me fornecer a solução especificamente, mas me levar na direção certa. Mas, se o jogo vai ser em uma janela do navegador, você pode ter que usar a mesma técnica de configuração wmode de dirigir ou gpu também.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top