Forums » RGSS

Aula Avançada 2: Otimizando Sistemas

    • 683 posts
    4 de junho de 2015 12h56min30s ART

    Imagem Postada


    Imagem Postada

    Introdução
    Dando continuidade aos trabalhos do curso avançado, vamos hoje aprender a tornar nossos scripts mais rápidos, diminuindo lags e tornando mais dinâmico o sistema, essas dicas valem para todo o tipo de script, mas aconselho a todos a darem uma atenção especial para as dicas sobre gráficos, elas melhoram o jogo visivelmente!

    Imagem Postada


    Imagem Postada

    Eventos
    Muita gente reclama que os eventos causam muitos lags e não há antilag no mundo que permita usar todos os recursos que queremos, vejamos algumas dicas simples para reduzir esses indezejáveis lags.

    Lags causados por eventos estáticos
    Se você é um grande mapeador e utiliza 4 layers de mapeamento (os 3 mais os eventos com gráficos do tileset), uma dica incrível é usar um anti-lag simples e nomear todos os eventos estáticos como "noupdate" sem as "", esse é um recurso normalmente esquecido por todos os usuários de antilag, mas para mapas com muitos eventos ele é extremamente útil!

    Lags causados por eventos cheios de comandos
    Se você criou um "evento monstro", ou seja, um evento com linhas e linhas de comando, tente substituir alguns desses comandos por linhas de script, os scripts causam menos lag!

    Lags causados por eventos comuns
    Uma mega dica para aqueles que usam eventos comuns em processo paralelo, ou seja, que ficam rodando o tempo todo, é criar blocos de atualização. Compreenda que no rmxp, cada segundo tem 20 frames, cada frame representa uma atualização da tela, imagine um evento comum de 30 linhas sendo executado 20 vezes por segundo oO? Lag na certa né? Pois bem, crie no seu evento, condições por eventos mesmo, dentro da condição coloque script e coloque Graphics.frame_count % == 0, esse comando vai gerar uma condição de atualização, o deve ser um número de 1 a 20 sendo que:
    1 = atualiza a cada frame (20x por segundo)
    5 = atualiza a cada 5 frames (4x por segundo)
    10 = atualiza a cada 10 frames (2x por segundo)
    20 = atualiza a cada 20 frames (1x por segundo)
    Crie blocos de código por evento dentro dessas condições conforme a sua necessidade de atualização, explore o comando que mostrei para ter resultados ainda melhores!

    Lags causados por muitos eventos
    Para quem usa uma montanha de eventos, a dica é mesmo criar mapas pequenos, eles minimizam o impacto do volume de eventos. Também use antilags com o recurso de atualização "in-screen", esse recurso atualiza apenas os eventos que estão na tela.

    Imagem Postada


    Imagem Postada

    HUDs
    Sem dúvida nenhuma, uma das maiores causadoras de lag em jogos são as huds, mas existem dezenas de meios não explorados que reduzem esses lags, não é um bicho de 7 cabeças, até quem não sabe nada de scripts pode fazer alguma coisa.

    Atualização de variáveis
    Se você tem uma hud que só mostra variáveis na tela, faça da seguinte forma, no initialize, crie um atributo para cada variável que você vai usar e inicialize com valores diferentes das variáveis, use negativos ou 0, depois no refresh coloque todos os comandos dentro de um bloco condicional onde só haverá atualização se o valor do atributo é diferente do valor da variável, veja um exemplo simples:

    class HUD_BASIC <Window_Base   def initialize     <configuração da janela>     @lv=0     refresh   end   def refresh     if@lv!= $game_party.actors[0].level       @lv= $game_party.actors[0].level       self.contents.clear       self.contents.draw_text(0,0,45,32,"Level:"+@lv     end   endend

    Note a simplicidade e a funcionalidade desse truque, sem o "if", essa hud seria recriada 20 vezes por segundo, com o if, ele só vai recriar quando o personagem mudar de lv! oO É muita diferença!

    Atualização de huds complexas
    Caso sua hud seja muito complexa, não vale a pena utilizar a dica a cima pois teriam muitas condições (ou uma só, mas imensa). O mais correto nessas situações é criar uma condição simples usando o frame_count como nos eventos comuns, veja:

    class HUD_GIGANTIC <Window_Base   def initialize     <configuração da janela>     refresh   end   def refresh     ifGraphics.frame_count %10==0       <comandos de atualização>     end   endend

    Veja que a hud será executada 2 vezes por segundo, esse é um bom valor, caso suas batalhas sejam muito ativas, deixe em um valor entre 5 e 10 conforme a necessidade. Isso causará atualizações desnecessárias, mas vai reduzir o lag pela metade.

    Atualização de huds cheias de imagens
    Se sua HUD possue uma imensa gama de imagens e várias delas são estáticas, ou seja, só ficam la paradas, você tem duas possibilidades, junte tudo pelo photoshop ou outro editor e crie sua hud ou então crie duas huds, uma estática e outra dinâmica, como assim? Basta criar duas janelas(classes) para a hud, na de baixo(a com Z menor), coloque todas as imagens e não utilize o refresh no alias do Scene_Map para atualizá-la, assim ela será criada cada vez que entrar no mapa e não será mais mechida, enquanto isso, crie outra hud com os dados dinâmicos, variáveis e etc, atualize ela normalmente, assim não tem que redesenhar as imagens toda a hora!

    Imagem Postada


    Imagem Postada

    Scripts
    Para os usuários avançados que consideram cada ciclo de processamento e querem deixar seus jogos/scripts mais técnicos e otimizados, vamos a algumas dicas avançadas, elas não reduzem visivelmente o lag, mas se todos os sistemas forem assim otimizados, a diferença fica visível.

    Os loops
    Uma coisa que dá muita dor de cabeça aos scripters são os loops pois normalmente eles forçam bastante o processamento causando lags, se você não tem como evitar usá-los tente substituir o "loop do" por um "while", a diferença se da pois loop é um método, ou seja, ele utiliza vários comandos, ja o while ja é o comando, lembre-se que no loop você usa uma condição de parada no break e no while(quer dizer enquanto) a condição é de funcionamento e não parada e você usa logo depois do comando, por exemplo while a == true.

    Condições: and ou or?
    Quando o processador executa um &&(and) ele gasta menos processamento que quando executa o ||(or), entenda o porquê:
    Para o and ser válido, todas as premissas envolvidas devem ser válidas, por exemplo @hud.visible == true and @cont > 5, se ao verificar que @hud.visible é falso, o processador nem passa pela 2ª verificação, porém se você usar um or, o processador precisa verificar as duas. Agora você vai pensar: "Mas or a and são diferentes, não da pra substituir". Normalmente não tem mesmo, até eu poderia mostrar uma fórmula, mas ela não facilita muito a vida, então se der pra usar and no lugar do or, então use! (acho que essa ficou mais a caráter informativo do que prático ^^)

    Condições: quem vem primeiro?
    Se você esta usando um or, não importa qual verificação colocar 1º, mas se for um and, não pense duas vezes, coloque antes as mais simples, métodos e comandos complexos usam mais do processador.

    Atualizando apenas o necessário
    La vem eu novamente falar de atualização, fazer o que, esse é o motivo central do lag! ^^ Se você criou uma Scene ou algum script que causa muito lag no jogo, use a dica das huds para diminuir a taxa de atualização por segundos do seu script, para isso basta colocar o conteúdo do update em um bloco de código condicional usando o Graphics.frame_count do exato mesmo geito das huds!

    Ifs para todos os lados
    Imagine a condição, se a vale 5 retorna true, se não, retorna false, veja como a maioria faria:

    if a == 5
      return true
    else
      return false
    end

    return true if a == 5
    return false

    ...

    Esse tipo de condição pode ser simplificada em uma linha, veja só:
    return a == 5
    Moleza né, esse tipo de otimização deixa o código bem melhor.

    Quantos menos linhas melhor
    sempre tente deixar o seu código o mais enxuto possível, em casos por exemplo de condições simples, para impedir que uma variável fique negativa por exemplo, ao invés de por:

    if a < 0
      a = 0
    end

    Use:
    a = 0 if a < 0
    ou
    if a < 0 then a = 0 end

    Na prática, não muda nada, mas deixa o código mais limpo e isso também é um meio de otimização, afinal procurar um método em um código gigante é fogo né ^^

    Imagem Postada


    Tags de Busca

    • Lag
    • otimização
    • frames