[RPG-MAKER.FR] Oniromancie: tout l'univers de RPG Maker en français - Astuces - [Ruby] module T

Oniromancie: Astuces - [Ruby] module T


Découvrir
RPG Maker

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

Apprendre
RPG Maker

Guides
Tutoriels
Astuces
Making-of


Comment ça marche?

Aëdemphia
Par Sylvanor

Fighting Robots Quest
Par Boulon

Geex
Par roys

Inexistence
Par Falco

La Légende d'Ibabou
Par Zaitan

Nylu
Par NanakyTim

Sarcia
Par Kaëlar

Super Mario RPG - Lost Souls
Par Omegabowser

News: Game design: ouvrir son jeu aux (...) / News: Des jeux et des screens / News: Alex 2019 : tests et nominations (...) / Jeux: Wendy Whedon / Sorties: Wendy Whedon /

Chat  

Bienvenue
visiteur !




publicité RPG Maker!

Statistiques

Liste des
membres


Contact

Mentions légales

120 connectés actuellement

10212383 visiteurs
depuis l'ouverture

839 visiteurs
aujourd'hui

Groupe Facebook

Barre de séparation

Partenaires






TOP
GAMEMAKING


Les 5 plus
visités

Akademiya RPG Maker

Alex d'Or

Blog of Chaos17

BloGecko

ConsoleFun

Au hasard

Zarok

Le bazar à Omega

Tashiroworld

Les deux derniers

Zarok

Akademiya RPG Maker

Nos autres partenaires

Devenir
partenaire


Barre de séparation

Un site du réseau
War Paradise

Annuaires référenceurs




[Ruby] module T
Ecrit par Zeus81

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)

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)

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 | News | Forum | Flash-news | Sorties | Chat | Commentaires | Galerie | Blogs | Articles perso | Screen de la semaine | Palmarès | Livre d'or | Recherche | Interviews | OST | L'Annuaire | Divers
Apprendre: Le Wiki | Tutoriels | Guides | Gaming-Live | Tests | Making-of
Télécharger: Programmes | Scripts | Packs de ressources | Midis | Eléments séparés | Sprites
Jeux: Index jeux séparés | Top Classiques | Top Originaux | Les autres | Collection Oniro | RPG Maker 95 | RPG Maker 2000 | RPG Maker 2003 | RPG Maker XP | RPG Maker VX | RPG Maker VX Ace | RPG Maker MV | Autres | Jeux complets | Proposer
Hébergés: Aëdemphia | Fighting Robots Quest | Geex | Inexistence | La Légende d'Ibabou | Nylu | Sarcia | Super Mario RPG - Lost Souls
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