Day.png);">
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/MZ

Apprendre
RPG Maker

Tutoriels
Guides
Making-of

Dans le
Forum

Section Entraide

Sorties: Dread Mac Farlane - episode 7 / Jeux: Ce qui vit Dessous / News: Quoi de neuf sur Oniromancie (...) / Sorties: Dread Mac Farlane - episode 6 / News: Quoi de neuf sur Oniromancie (...) / Chat

Bienvenue
visiteur !




publicité RPG Maker!

Statistiques

Liste des
membres


Contact

Mentions légales

267 connectés actuellement

29352883 visiteurs
depuis l'ouverture

8107 visiteurs
aujourd'hui



Barre de séparation

Partenaires

Indiexpo

Akademiya RPG Maker

Blog Alioune Fall

Fairy Tail Constellations

Zarok

Guelnika & E-magination

Eclipso

Tous nos partenaires

Devenir
partenaire



Module T

Compteur précis à la nanoseconde pour mesurer les performances de RPG Maker.

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

❤ 0

Auteur : Zeus81
Logiciel : RPG Maker XP
Nombre de scripts : 1

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 image ), 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 | 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/Plugins | Ressources graphiques / sonores | Packs de ressources | Midis | Eléments séparés | Sprites
Jeux: Au hasard | Notre sélection | Sélection des membres | Tous les jeux | Jeux complets | 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