Sujet n°2986
Posté par Newtiteuf le 24 Fév - 14:11 (2009)
Titre : [Tuto] AntiLag :: Le + simple et Le + performant
[Tuto] AntiLag :: Le + simple et Le + performant
[ 4G+ - 0.7 / - / Testé ]

.:: Introduction ::.

  Je na partage pas souvent les "astuces" de mon projet, mais vu que la ça ma grandement aidé ... je compte le partager ! Cet Antilag, ne stop pas les évent en dehors de la zone de jeu, ne tu pas la priorité de superposition en dehors de l'écran, n'arrête pas les animations des autotiles inutiles... Cet Antilag, "Fluidifie" votre jeu ... . En fait le rafraichissement de votre jeu sera plus fréquent ... donc au lieu des sacadement vos aurez un déplacement plus ... doux ! Par suite vous aurez + de frames par secondes ... . Inconvénient, avec un rafraichissement trop fréquent les images seront affichées plus rapidement et l'écrantitre sera ... plus rapide.

.:: Comment faire ? ::.

  Vous savez que si vous rencontrer un lag ultime, ce n'est pas un script complet qui vas vous sauver, pas non plus deux, ni même trois scripts ... mais simplement une ligne que voici:
Code:

  Graphics.frame_rate = XX

XX doit etre remplacé par un nombre (a deux chiffres) Je vous conseille 60 puis 80 ... essayé et vous verrez !

Cette ligne est à placer dans le script "Main" apres le "Begin":
Code:

 #==============================================================================
# ■ Main
#------------------------------------------------------------------------------
#  各クラスの定義が終わった後、ここから実際の処理が始まります。
#==============================================================================

begin
  Graphics.frame_rate = 80  #ICI VOUS PLACER LA LIGNE ...
  $style = "DP"
  # Change the $fontface variable to change the font style
  $fontface = ["Pokemon DP", "Pokemon FRLG", "Pokemon RS", "Trebuchet MS"]
  $fontfacebis = ["Pokemon RS", "Pokemon DP"]


Je n'ai rien d'autre a ajouter ^^


 
  

Posté par Ace Attorney Man le 24 Fév - 14:26 (2009)
NT  ...
Bravo *0*
C'est super, le déplacement est vraiment fluide ...
Je t'aime x'D

Posté par Newtiteuf le 24 Fév - 14:35 (2009)
Tu as testé ? ... je voudrais savoir ... ton ordi avais combien de FPS a la base ? 20 ou 40 ... quelle fréquence (nombres) de rafraichissement utilise-tu ? 60 ou 80 ?

C'est pour que je vois chez qui ca marche Lordork chez mémé

Posté par Ace Attorney Man le 24 Fév - 14:37 (2009)
je sais pas xD

J'ai jamais fait attention mais mon ordi est assez puissant(je crois que c'est 30 si c possible xD)
J'ai pris 60 (80 les combats sont insuivables XD)

Posté par Newtiteuf le 24 Fév - 14:39 (2009)
Ok, parceque le le miens déscend a 20 en temps normal et à 5 avec tous mes script !

Posté par Ace Attorney Man le 24 Fév - 14:43 (2009)
ah oui, je met à 40 le truc et je tombe sur ma vitesse de d'habitude.
Donc je suis en 40 fps alors xP

Posté par Newtiteuf le 24 Fév - 18:33 (2009)
40 frames ? Donc tu es dans ce sue j'appelle la catégorie "supérieur" , c'est la meilleur pour tester des jeux, mais pas pour les créer car on ne peux pas savoir si ceux faisant parti de la catégorie "inferieur" pourront y jouer sans lag ou bug !

A l'inverse la catégorie "inferieur" ne peux lire que des projets adapter pour des ordi 'inferieurs" , par contre quand ce type d'ordi crée un jeu, les 2 catégories pourront le lire sans problème (a part que les 'supérieurs" aurons surement un décalage musique/images a caus de la commande "attendre X frames")

Voila... a vous les studios :mrgreen:

Posté par Aten974 le 24 Fév - 18:39 (2009)
Ca sert à quoi la ligne de script ? pas bien compris ^^" ?

Je suis en 20 FPS quand mon pc est content ...

Posté par Newtiteuf le 24 Fév - 18:45 (2009)
A diminuer le Lag, enlever le sacadement et augmenter le rafraichissement par seconde ( ou FPS)

Posté par Aten974 le 24 Fév - 18:52 (2009)
J'ai compris ça mais, le chiffre signifie quoi en lui même ? la fréquence de rafraichissement ?

Posté par Newtiteuf le 24 Fév - 18:53 (2009)
Exact ... la fréquence de rafraichissement (les frames si tu préfère ^^) 

Posté par Draco le 24 Fév - 19:29 (2009)
Super, génial, que dire de plus ?
Déjà que tu as une bonne place dans mes crédits avec tous les charasets DP, alors en plus de ça, je te jure que tu vas avoir une place d'or :mrgreen: Bouche extensiblek:

Posté par Rbzproject le 24 Fév - 19:31 (2009)
Merçi Newtiteuf je t'adore Bouche extensiblek:

C'était vraiment bien penser.

Posté par Newtiteuf le 24 Fév - 20:02 (2009)
XD, je suis content de vous avoir aidée (en même temps ca m'aidera a ne plus voir des projets qui lag  :mrgreen: )

Posté par KnightLink le 24 Fév - 20:05 (2009)
C'est vrai que c'est simple, mais je suis décu, en tant que programmeur amateur, de ne pas
avoir connu cette fonction ^^" (C'est dans les scripts de base ?)

Posté par PiVa le 24 Fév - 20:05 (2009)
^O^ J'ai une question mon ordi tourne à 4O, si je met la ligne indiquer avec la valeur 40 alors les "inférieurs" seront égal au "supérieur" ?
Si oui c'est cool ^o^

Posté par Newtiteuf le 24 Fév - 20:53 (2009)
Pas forcéments ... pichu tu as remarqué que tes FPS peuvent etre divisés par deux ... si tu passe de 40 à 20, tu passeras de 60 a 30 ou encore de 80 a 40 ^^

Mais a partir d'un certains nombre (au dessus de 80) cela ralenti le jeu !

Posté par Pαlвσlѕку le 24 Fév - 21:05 (2009)
Je test de suite. J'éditerais mon post.

EDIT ---> Rien à dire, ça marche nickel, j'ai poussé les FPS jusqu'à 120 (valeur maximum supporté par RMXP, même si ont met 150, cela fera 120 (c'est ce que j'ai fais)), et même pas de lag (on va même dire que le jeu aller plus tôt bien vite)
Cette ligne reflète un script entier :shock:

Posté par PiVa le 24 Fév - 23:14 (2009)
Ok j'ai une question, on peut pas scripté des conditions ? et faire en sorte d'être à 40 non stop ? ^o^

Posté par Newtiteuf le 24 Fév - 23:20 (2009)
Je ne sais pas ... il faudrais qu'une variable est pour valeur le nombre de FPS acruel ... mais ca ... cela ne releve plus de ma juridiction  :mrgreen:


Palbolsky a écrit:

Je test de suite. J'éditerais mon post.

EDIT ---> Rien à dire, ça marche nickel, j'ai poussé les FPS jusqu'à 120 (valeur maximum supporté par RMXP, même si ont met 150, cela fera 120 (c'est ce que j'ai fais)), et même pas de lag (on va même dire que le jeu aller plus tôt bien vite)
Cette ligne reflète un script entier :shock:

T'inquiète, j'ai même essayé avec 50000 ... ca redescend a 120 (enfin a 60 sur mon ordi puisque c'est un 20 FPS a la base !)

Posté par PiVa le 25 Fév - 00:20 (2009)
Bah et ça c'est quoi " Graphics.frame_rate" ? On doit bien pouvoir faire avec, non ?

Posté par Dark' le 25 Fév - 11:27 (2009)
Si on rajoute la même ligne avec un chiffre plus... réaliste, un bon 40 ou 20 frames, au début des différents scripts de combats... Les combats devraient garder une allure normale, non ?


Sinon, bien trouvé NT !

Posté par Newtiteuf le 25 Fév - 12:27 (2009)
Oui, surement, mais je n'es suis pas sur a 100% il faudrait mieux faire un truc du genre:
Graphics.frame_rate = $game_variables[431]

Comme ca il serait possible de changer le refraichissement via un event (ou un script) en changeant la valeur de $game_variables[431] !

Posté par PiVa le 25 Fév - 12:31 (2009)
Si on peut mettre dans une variable alors on peut faire des conditions pour rester à 40 fps ?

Posté par Dark' le 25 Fév - 12:33 (2009)
NT : Sur, et suffirait de mettre une Maj de cette variable dans les scripts de combats.

Posté par Lén le 25 Fév - 12:49 (2009)
Heu ... si y'en a qui ce plaignent du script de  temps réel de mousspsp qui lag ... je vous previens qu'enregistrer la valeur de fps dans une var qui se rafraichit toute les frames ... arg
Mais c'est tout a fait possible je pense avec une boucle.

Posté par Newtiteuf le 25 Fév - 12:57 (2009)
Non, c'est impossible pichu !

Graphics.frame_rate définit un nombre fixe de FPS ... or le nb de FPS est changeant et instable !

Si Graphics.frame_rate = 60 au début  alors Graphics.frame_rate = 60 a la fin !

Alors que si FPS = 60 au debut (valeur de Graphics.frame_rate) elle varie en fonction de comment la map est chargée ou autre !

Posté par Ace Attorney Man le 25 Fév - 14:02 (2009)
Lén a écrit:

Heu ... si y'en a qui ce plaignent du script de  temps réel de mousspsp qui lag ... je vous previens qu'enregistrer la valeur de fps dans une var qui se rafraichit toute les frames ... arg
Mais c'est tout a fait possible je pense avec une boucle.
Oui, faire F1 pendant le jeu et coché la première case fait passer en 40 fps Clin d'œil foireux(la décocher en 20 Clin d'œil foireux )

Posté par Lén le 26 Fév - 13:36 (2009)
Heu Ace Attorney Man Tu voulais pas quoter mon autres messages desfois ^^.
Mais oui effectivement c'est avec cette methode la.

Posté par Ace Attorney Man le 26 Fév - 14:30 (2009)
Oo
Je me suis trompé de topic x'D

Posté par Aten974 le 27 Fév - 10:25 (2009)
Super ! ca marche !

Merci, je peux enfin utilisé mon script ! Imbécile heureux

Posté par Dark' le 1 Mar - 05:33 (2009)
Je me posais une question... On n'arrête pas de dire depuis le début "faudrait remettre a la normale pendant les combats sinon c'est trop rapide... Et bien, pourquoi ne pas tout simplement placé lanligne sur Scene_Map plutôt que sur Main ? Comme ça, seule la carte, et donc le plus gros lieu de lag, sera concernée

Posté par Aten974 le 1 Mar - 16:01 (2009)
Au fait, ça lag toujours xD même à 120, ça repasse à 5 fps =="

Posté par swiip le 1 Mar - 17:54 (2009)
faudrait que j'essaie,sa a l'air pas mal.

après,pour adapter,au début du jeu et de chargement de sauvegarde,on pourrait demander le type de rafraichissement,et mettre une option pour la réglée quand on veut via le menu.

ainsi,les personnes pouront choisir en fonction des compétences de leur ordinateur.^^

Posté par Dark' le 11 Mai - 15:00 (2009)
Bon, alors, je n'ai aps envie de voler la vedette à NT par la création d'un nouveau topic, donc je rajoute juste ici quelques infos.

D'abord, je ne sais pas si ça a déjà été dit ici, mais il faut le préciser : dans le système de base de RPG Maker XP, les FPS (Frames Per Second) son gérées en fonctions de l'ordinateur hote. Ainsi tout les ordinateurs lisent les jeux "a leur manière".

Cependant, la fonction présenté ici à un inconvénient notable : elle fige les FPS en une valeure donnée. Donc ? Et bien, simplement, mettons que Monsieur A est un ordi 20 FPS, et Monsieur B un 40 FPS. A produit une démo de jeux, avec dedans cette ligne d'antilag :

Code:
Graphics.frame_rate = 60


Que ce passe-t-il ? Et bien, A, en jouant à son jeu, a un lag réduit du tiers (vitesse X3, 60 = 20x3), ce qui lui remet son jeu en état de marche. Il donne sa démo à B. Le jeu se lance, adapte les fps (20 ==> 40), puis lis la ligne. Que se passe-t-il ? Les FPS sont remis à 60. C'est à dire vitesse X1.5 (60 = 1.5x40). Le lag n'est donc pas bien contré. Encore, ici, ce n'est pas trop grave. La différence est minime.

Mais A, dans sa démo, avait eu un problème : lors des combats, la cadence était montée à 60 fps ! Ce qui donnait des combats insuivable !

Il avait donc rajouté cette ligne au bon endroit :

Code:
Graphics.frame_rate = 20


Et le problème était réglé. Monsieur B, en jouant, fait un combat. Le jeu passe sur cette ligne, met les FPS à 20. Sur un ordi de 40. Les combats sont donc ralentis de 2X ! Le jeu devient dès lors injouable.


_________________________________


Voici désormais la solution. Simple, claire et nette, mais mieux vaut l'écrire, certains ne sont pas aptes à le faire d'eux mêmes, et c'est normal. Dans le script Scene_Map de PSP, cherchez :

Code:
class Scene_Map
  attr_reader :spriteset

Ce sont normalement les deux premières lignes qui ne sont pas des commentaires.

ajoutez après :

Code:
def frames_rate
  if $game_switches[ZZ] == false
    Graphics.frame_rate = XX
  else
    Graphics.frame_rate = YY
  end
end

Où ZZ est le numéro d'un interupteur choisi, XX un nombre de frames désiré, et YY le même nombre multiplié par deux. De cette manière, au début du jeu, dans la scene d'intro, vous demandez au joueur s'il joue sur un 20 ou un 40 fps. par défaut, c'est un 20. S'il répond 40, activez l'interrupteur.
Toujours dans ce script, cherchez le dernier "end" de "def update". je ne sais pas où il est, je n'ai plus ce script depuis longtemps (trop modifié). Juste avant, ajoutez
Code:
frames_rate


Maintenant, dans le script Pokemon_Battle_Core_1, cherchez
Code:
  class Pokemon_Battle_Core
    attr_accessor :z_level
    attr_accessor :actor_status
    attr_accessor :actor
    attr_accessor :actor_sprite
   
    #------------------------------------------------------------ 
    # ------------------- Squelette Général ---------------------
    #------------------------------------------------------------
   
    #------------------------------------------------------------ 
    # main
    #------------------------------------------------------------
    def main


Juste après, ajoutez ce code :

Code:
    if $game_switches[ZZ] == false
      Graphics.frame_rate = 20
    else
      Graphics.frame_rate = 40
    end


Avec ZZ le numéro de l'interrupteur, comme plus haut.


Et voilà !

Posté par Lunatic le 11 Mai - 15:44 (2009)
Merci beaucoup Imbécile heureux

Bon, je voulais juste savoir si j'ai bien placé "frames_rate"

 
Code:

  def update
    loop do
      $game_map.update
      $game_system.map_interpreter.update
      $game_player.update
      $game_system.update
      $game_screen.update
      unless $game_temp.player_transferring
        break
      end
      transfer_player
      if $game_temp.transition_processing
        break
      end
      frames_rate  
    end 

Mollasse enragé
Et puis, comment connaitre la vitesse en FPS de notre PC (ou de celui de quelqu'un d'autre) ?

Posté par Dark' le 11 Mai - 15:49 (2009)
Non, je ne sais pas si ça va amrcher.

ici tu l'as placer avant le "end" de "do". Il faut le placer avant le "end" de "def update"

Posté par Lunatic le 11 Mai - 16:17 (2009)
Là :


 
Code:
  def update
    loop do
      $game_map.update
      $game_system.map_interpreter.update
      $game_player.update
      $game_system.update
      $game_screen.update
      unless $game_temp.player_transferring
        break
      end
      transfer_player
      if $game_temp.transition_processing
        break
      frames_rate
      end
    end  


ou là :


 
Code:
  def update
     loop do
       $game_map.update
       $game_system.map_interpreter.update
       $game_player.update
       $game_system.update
       $game_screen.update
       unless $game_temp.player_transferring
         break
      frames_rate
       end
       transfer_player
       if $game_temp.transition_processing
         break
       end
     end  

Posté par Dark' le 11 Mai - 16:21 (2009)
Code:
  def update
    loop do
      $game_map.update
      $game_system.map_interpreter.update
      $game_player.update
      $game_system.update
      $game_screen.update
      unless $game_temp.player_transferring
        break
      end
      transfer_player
      if $game_temp.transition_processing
        break
      end
    end
   
    @spriteset.update
    @message_window.update
   
    if $game_temp.gameover
      $scene = Scene_Gameover.new
      return
    end
   
    if $game_temp.to_title
      $scene = Scene_Title.new
      return
    end
   
    if $game_temp.transition_processing
      $game_temp.transition_processing = false
      if $game_temp.transition_name == ""
        Graphics.transition(20)
      else
        Graphics.transition(40, "Graphics/Transitions/" +
          $game_temp.transition_name)
      end
    end
   
    if $game_temp.message_window_showing
      return
    end
   
    # Comptage Rencontre aléatoire
    if $random_encounter != [0] and $game_player.encounter_count == 0
      tag = $game_player.terrain_tag
      unless $game_system.map_interpreter.running? or
              $game_system.encounter_disabled or
              tag == 0
       
        enemy_list = $random_encounter[tag]
        if enemy_list != nil and enemy_list.length > 1
          $game_temp.battle_calling = true
        end
      end
    end
   
    if Input.trigger?(Input::B)
      unless $game_system.map_interpreter.running? or
             $game_system.menu_disabled
        $game_temp.menu_calling = true
        $game_temp.menu_beep = true
      end
    end
   
    if $DEBUG and Input.press?(Input::F9)
      $game_temp.debug_calling = true
    end
   
    # Map monde
    if $game_map.map_id == POKEMON_S::_WMAPID
      $game_temp.menu_calling = false
      $game_temp.menu_beep = false
      $game_temp.debug_calling = false
      if Input.trigger?(Input::B)
        $game_temp.back_calling = true
      end
      if Input.dir4 == 2 or Input.dir4 == 4 or Input.dir4 == 6 or
          Input.dir4 == 8
        $game_temp.world_map_event_checking = true
      end
      unless $game_player.moving?
        $game_player.check_world_map
      end
    end
   
    unless $game_player.moving?
      if $game_temp.battle_calling
        call_battle
      elsif $game_temp.shop_calling
        call_shop
      elsif $game_temp.name_calling
        call_name
      elsif $game_temp.menu_calling
        call_menu
      elsif $game_temp.save_calling
        call_save
      elsif $game_temp.debug_calling
        call_debug
      elsif $game_temp.back_calling
        call_back_world_map
      end
    end
#------------------------
# LA
#------------------------
frames_rate
#------------------------
# LA
#------------------------
  end


Là.

Posté par Lunatic le 11 Mai - 16:25 (2009)
Ok merci  :D

Posté par Dark' le 11 Mai - 16:34 (2009)
`^^

Je l'ai tellement modifié, je pouvais pas savoir qu'originellement, il faisait déja 104 lignes ^^

Posté par Lén le 11 Mai - 17:30 (2009)
Dark' je n'ai pas envie de te dire que tu es un dieu, car on te l'a trop  dit et je veux préserver tes cheville, mais je doit avouer que comme sphynx, tu as le talent d'expliquer ce qu'il faut et clairement !

Posté par Pαlвσlѕку le 11 Mai - 17:36 (2009)
Moi aussi je sais très bien expliquer. Mais bizarrement, je ne suis pas un dieu. Clin d'œil foireux

Palbolsky est jaloux.

Posté par Aten974 le 11 Mai - 18:02 (2009)
 
Citation:

 ajoutez après :


|+Agrandir|-Réduire|version texte|copier le code|imprimer|?

  1. def frames_rate  
  2.   if $game_switches[ZZ] == false  
  3.     Graphics.frame_rate = XX  
  4.   else  
  5.     Graphics.frame_rate = YY  
  6.   end  
  7. end  


def frames_rate
  if $game_switches[ZZ] == false
    Graphics.frame_rate = XX
  else
    Graphics.frame_rate = YY
  end
end

Où ZZ est le numéro d'un interupteur choisi, XX un nombre de frames désiré, et YY le même nombre multiplié par deux. De cette manière, au début du jeu, dans la scene d'intro, vous demandez au joueur s'il joue sur un 20 ou un 40 fps. par défaut, c'est un 20. S'il répond 40, activez l'interrupteur.
Toujours dans ce script, cherchez le dernier "end" de "def update". je ne sais pas où il est, je n'ai plus ce script depuis longtemps (trop modifié). Juste avant, ajoutez



C'est pas plutôt :

Où ZZ est le numéro d'un interupteur choisi, XX un nombre de frames désiré, et YY le même nombre multiplié par deux. De cette manière, au début du jeu, dans la scene d'intro, vous demandez au joueur s'il joue sur un 20 ou un 40 fps. par défaut, c'est un 40. S'il répond 20, activez l'interrupteur.
Toujours dans ce script, cherchez le dernier "end" de "def update". je ne sais pas où il est, je n'ai plus ce script depuis longtemps (trop modifié). Juste avant, ajoutez

??

Posté par PiVa le 11 Mai - 18:45 (2009)
Aten : On s'en fiche un peu, car pour toi tu as 40 mais qui sait que Dark' à pas 20 ? Clin d'œil foireux Donc pour lui c'est plus logique de mettre 20 si c'est son cas !


Très bon boulot Dark' ! Bouche extensiblek:  

Posté par Sphinx le 11 Mai - 21:56 (2009)
Clin d'œil foireux de tte facon, si XX = nbre de frames & YY = XX * 2, alors il est logique de l'écrire comme dark' Clin d'œil foireux


>> mais ce n'est pas le sujet je crois =) on s'égare xD

>> gg darkounet ^o^

Posté par Van Pokamon le 11 Mai - 22:23 (2009)
Moi cela allait trop vite lol je crois que je ne m'attendais pas a une telle vitesse :mdr: . En plus j'utilise un "anti-lag" et donc combiné avec ton script (j'ai mis quand même 40), cela redonne une intensité ... Exaltante! Si éclatante que je te mets dans mes crédits de " légende du triangle" et même plus si je le réutilise ! Merci beaucoup :+1: .
note: cela marche sur l'rpg maker classique ^^.

Posté par Dark' le 12 Mai - 12:38 (2009)
Non, c'est 20 par défaut, Aten. Regarde :

Condition : interrupteur == False.

Or, un interrupteur est par défaut désactivé.

Lorsque désactivé, ça nous donne un nombre ; sinon, ça nous le donne X2. Donc bien 20 par défaut.

je suis sur un 40, mais mettre 40 par défaut génère un bug de Scene_Title. Laisser 20 ne pose pas de problème. J'en déduit que RMXP est plus fait pour tourner sur 20 que sur 40 ^^

Merci pour les bons coms' !

Posté par Van Pokamon le 13 Mai - 15:25 (2009)
ca marche chez moi ... sans laguer ni trop rapide non plus