Vi Esta Aula No Aprendiz RPG É Vou Disponibilizar Aqui. Criador: Lucaswf1
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!
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.
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
@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
end
end
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
refresh
end
def refresh
if Graphics.frame_count % 10 == 0
end
end
end
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!
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é
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!
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.
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
@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
end
end
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
refresh
end
def refresh
if Graphics.frame_count % 10 == 0
end
end
end
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!
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é