Apprendre


Vous êtes
nouveau sur
Oniromancie?

Visite guidée
du site


Découvrir
RPG Maker

RM 95
RM 2000/2003
RM XP
RM VX/VX Ace
RM MV

Apprendre
RPG Maker

Guides
Tutoriels
Making-of

Dans le
Forum

Section Entraide

Jeux: Beetle Ninja / Jeux: Le Miroir de Philéas / Tutos: Améliorer les rencontres (...) / Tutos: Quelques tests géométriques (...) / Programmes: LiceCAP / Chat

Bienvenue
visiteur !




publicité RPG Maker!

Statistiques

Liste des
membres


Contact

Mentions légales

81 connectés actuellement

10795629 visiteurs
depuis l'ouverture

7 visiteurs
aujourd'hui



Barre de séparation

Partenaires

Indiexpo

Akademiya RPG Maker

Hellsoft

Planète Glutko

Lunae - le bazar d'Emz0

Alex d'Or

Lumen

Tous nos partenaires

Devenir
partenaire



Module T
Script pour RPG Maker XP
Ecrit par Zeus81
Publié par zeus81 (lui envoyer un message privé)
Signaler un script cassé

Une version améliorée est disponible ici.

Parfois quand on a besoin de tester les performances d'un bout de code la classe Time se montre trop imprécise, voilà pourquoi j'ai créé le module T :

Portion de code : Tout sélectionner

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
module T
  QueryPerformanceCounter   = Win32API.new('kernel32', 'QueryPerformanceCounter', 'p', 'i')
  QueryPerformanceFrequency = Win32API.new('kernel32', 'QueryPerformanceFrequency', 'p', 'i')
  QueryPerformanceFrequency.call(@buffer = "\0"*8)
  @frequency = @buffer.unpack('Q')[0].to_f
  def self.t
    t = @buffer.unpack('Q')[0]
    QueryPerformanceCounter.call(@buffer)
    @buffer.unpack('Q')[0] - t
  end
  def self.s()  t / @frequency end
  def self.ms() t * 1000 / @frequency end
  def self.us() t * 1000000 / @frequency end
  def self.ns() t * 1000000000 / @frequency end
end


Avec le module T on peut mesurer des temps allant jusqu'à quelques nanosecondes (même si ça sert à rien).
Pour l'utiliser il faut appeller T.t avant ce qu'on veut mesurer pour l'initialiser puis après pour récupérer le temps écoulé.
Exemple :

Portion de code : Tout sélectionner

1
2
3
4
5
6
7
8
9
10
s = Sprite.new
b = s.bitmap = Bitmap.new(100, 20)
loop do
  Graphics.update
  T.t
  do_something
  t = T.t
  b.clear
  b.draw_text(b.rect, t.to_s)
end


T.t donne un résultat en nombre de ticks (m'fin je crois :doute2 ), pour récupérer un temps en seconde on peut utiliser T.s, en millisecondes T.ms, en microsecondes T.us et en nanosecondes T.ns.



zou - posté le 25/09/2011 à 20:05:22 (2197 messages postés)

❤ 0

Trop pratique plus besoin de faire des 10000.times do pour tester les perfs :)


Zeus81 - posté le 27/09/2011 à 19:39:33 (11071 messages postés)

❤ 0

Par contre le 10000.times do peut toujours servir à voir si tu crées pas trop de déchets par rapport au Garbage Collector.

Edit 3 :
Bon je l'ai complètement modifié et ça ne s'appelle même plus le module T. :F

Portion de code : Tout sélectionner

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
class PerformanceCounter < Sprite
  QueryPerformanceCounter   = Win32API.new('kernel32', 'QueryPerformanceCounter'  , 'p', 'i')
  QueryPerformanceFrequency = Win32API.new('kernel32', 'QueryPerformanceFrequency', 'p', 'i')
  QueryPerformanceFrequency.call(buf = "\0"*8)
  @@frequency = buf.unpack('Q')[0].to_f
  attr_accessor :display_type, :refresh_rate
  def initialize(display_type=0, refresh_rate=1)
    super()
    self.z, self.bitmap = 0x7FFFFFFF, Bitmap.new(200,20)
    bitmap.font.color.set(255,255,0)
    @a,@b,@t,@display_type,@refresh_rate = "\0"*8,"\0"*8,-1,display_type,refresh_rate
  end
  def refresh
    i = @b.unpack('Q')[0] - @a.unpack('Q')[0]
    @t = i if @refresh_rate==0 ? @t<0 || @t>i : Graphics.frame_count%@refresh_rate==0
    bitmap.clear
    bitmap.draw_text(bitmap.rect, case @display_type
                                  when 1; "%.3f ns" % ns
                                  when 2; "%.3f µs" % us
                                  when 3; "%.3f ms" % ms
                                  when 4; "%.3f s"  % s
                                  else    @t.to_s
                                  end)
  end
  def a()  QueryPerformanceCounter.call(@a) end
  def b()  QueryPerformanceCounter.call(@b)
           refresh                          end
  def c()  a; yield; b                      end
  def t()  @t                               end
  def ns() @t * 1000000000 / @@frequency    end
  def us() @t * 1000000 / @@frequency       end
  def ms() @t * 1000 / @@frequency          end
  def s()  @t / @@frequency                 end
end


Maintenant ça s'utilise comme ça :

Portion de code : Tout sélectionner

1
2
3
4
$t = PerformanceCounter.new
$t.a
do_something
$t.b


Ou alors comme ça :

Portion de code : Tout sélectionner

1
2
$t = PerformanceCounter.new
$t.c {do_something}


Maintenant le compteur est un sprite et affiche directement le résultat, et puis on peut en créer plusieurs aussi.
On peut choisir de quelle manière le temps est affiché et à quelle fréquence directement lors de l'initialisation :

Portion de code : Tout sélectionner

1
2
3
4
$t = PerformanceCounter.new(display_type, refresh_rate)
# Ou alors après avec les accesseurs du même nom :
$t.display_type = x
$t.refresh_rate = y


Pour display_type, 5 valeurs possibles, 0 pour afficher le résultat en nombre de ticks, 1 en nanosecondes, 2 en microsecondes, 3 en millisecondes et 4 en secondes.
Pour refresh_rate, bah c'est le taux de rafraichissement en frames, par exemple si on met 40 sur XP ça rafraichira toutes les secondes alors que si ont met 1 ça sera à chaque frame.
Si on met 0 ça affichera le résultat le plus petit, pour un code qui est constant ça devrait donner une valeur plus précise.

Suite à de nombreux abus, le post en invités a été désactivé. Veuillez vous inscrire si vous souhaitez participer à la conversation.

Haut de page

Merci de ne pas reproduire le contenu de ce site sans autorisation.
Contacter l'équipe - Mentions légales

Plan du site

Communauté: Accueil | Forum | Chat | Commentaires | News | Flash-news | Screen de la semaine | Sorties | Tests | Gaming-Live | Interviews | Galerie | OST | Blogs | Articles perso | Recherche
Apprendre: Visite guidée | RPG Maker 95 | RPG Maker 2003 | RPG Maker XP | RPG Maker VX | RPG Maker MV | Tutoriels | Guides | Making-of
Télécharger: Programmes | Scripts | Packs de ressources | Midis | Eléments séparés | Sprites
Jeux: Au hasard | Notre sélection | Sélection des membres | Jeux complets | Tous les jeux | Le cimetière | RPG Maker 95 | RPG Maker 2000 | RPG Maker 2003 | RPG Maker XP | RPG Maker VX | RPG Maker VX Ace | RPG Maker MV | Autres | Proposer
Ressources RPG Maker 2000/2003: Chipsets | Charsets | Panoramas | Backdrops | Facesets | Battle anims | Battle charsets | Monstres | Systems | Templates
Ressources RPG Maker XP: Tilesets | Autotiles | Characters | Battlers | Window skins | Icônes | Transitions | Fogs | Templates
Ressources RPG Maker VX: Tilesets | Charsets | Facesets | Systèmes
Ressources RPG Maker MV: Tilesets | Characters | Faces | Systèmes | Title | Battlebacks | Animations | SV/Ennemis
Archives: Palmarès | L'Annuaire | Livre d'or | Le Wiki | Divers