Há pouco mais de uma semana, me pediram pra desenvolver um certo minigame. Comecei a desenvolvê-lo pelo RM VX e percebi que havia algo estranho com os frames, eles pareciam ter tamanhos diferentes, dependendo da situação. Depois, fui transferir o minigame para o RM XP. Aí é que as coisas se complicaram, mesmo, os frames pareciam estar totalmente loucos. Discuti o problema com um pessoal do chat e, algum tempo depois, o maniaconfloor veio com a solução, que me tirou das trevas da ignorância. Resolvi, então, publicar um texto discorrendo sobre frames e apresentando alguns detalhes sobre eles.
"O que são frames?" Frames são unidades de tempo. Você talvez já tenha visto em algum Maker que 60 frames são iguais a um segundo, por exemplo. Nesse caso, o frame seria uma unidade de tempo 60 vezes menor que o segundo. No entanto, o tamanho do frame varia de um Maker para outro e, além disso, ainda pode ser alterado por script. Eles também podem sofrer algumas alterações de acordo com o seu computador. Para ver a quantos frames por segundo seu jogo está rodando, aperte F2.
Depois de ter alguns problemas com frames, no RM VX, resolvi fazer um teste: fiz dois timers (relógios). Um deles aumentaria o valor de uma certa variável em 60, em processo paralelo, após 60 frames. O outro aumentaria outra variável mas, dessa vez, com 1 frame de espera. Eu esperava que, a cada 60 frames, ambas variáveis possuíssem o mesmo valor. Mas o que ocorreu foi que a primeira variável ficou com o dobro do valor da segunda. Para o RM XP, repeti a mesma experiência mas, dessa vez, a primeira variável ficava 1,5 vezes o valor da segunda. Como se não bastasse estar diferente em um único Maker, ainda divergia entre Makers diferentes!
Aí que o maniac veio com uma outra experiência: ele programou para que, durante 60 frames, dois relógios funcionassem: um funcionaria em processo paralelo, sem tempo de espera; o outro funcionaria em processo paralelo, com 1 frame de espera. Repetiu a experiência para o VX e para o XP, obtendo os seguintes resultados: no VX, após esperar 60 frames, o primeiro relógio deu um resultado de 60 e o segundo deu um resultado de 30; no XP, após esperar 60 frames, o primeiro relógio deu um resultado de 120 e o segundo deu um resultado de 40. Aí ele propôs a seguinte solução: para evitar "crash" (excesso de processamento, que faz o jogo travar), a engine do RPG Maker adiciona um tempo de espera ao final de processos paralelos. No entanto, o VX adiciona 1 frame, enquanto o XP adiciona meio frame.
Então, o que ocorre nos relógios do VX é o seguinte: o primeiro espera 1 frame, aumenta a variável, repetindo isso 60 vezes, até que marque 60; o segundo espera 2 frames e aumenta a variável, repetindo isso 30 vezes (60 frames), marcando o valor 30. Já no XP, o primeiro aumenta a variável a cada meio frame e, já que isso se repete durante 60 frames, marca o valor 120; o segundo relógio espera esse meio frame e mais 1, totalizando 1 frame e meio de espera entre cada incremento de variável, durante 60 frames, marcando o valor de 40 na variável (60/1,5 = 40).
Pronto, está resolvido, agora, já sabemos por que ocorre essa divergência. Mas algo nisso me incomodou: o RM XP parte os frames ao meio! Isso significa que você pode ter muitos problemas se precisar trabalhar com medidas precisas de tempo e que repetem um processo paralelo por muito tempo. Como você não pode mandar um evento esperar meio frame, isso te impõe algumas limitações.
No entanto, pra resolver isso, basta que, em vez de deixar o evento ocorrer em processo paralelo, crie um ciclo para contar o tempo. Mas lembre-se de que, no ciclo, precisa haver um tempo de espera, exatamente para evitar o "crash". Então, mande o ciclo esperar 1 frame, ao seu final, e os frames não serão mais partidos, ficando com o funcionamento semelhante ao do VX.
Mais uma coisa que percebi, nesse estudo de frames, foi que o VX era 3 vezes mais rápido que o XP, por padrão. Ou seja, enquanto o VX rodava a 60 fps (frames por segundo), o XP rodava a 20 fps. Isso, no entanto, pode ser alterado por script. Para o RM XP, basta colocar isto no Main, logo abaixo do "begin": Graphics.frame_rate = (VALOR), substituindo pelo valor desejado.
Nas próximas semanas, ainda continuarei atualizando o blog com baixa freqüência, mas pretendo aumentá-la em dezembro.
Até a próxima.
First blog post
Há 8 anos
