vendredi 31 mai 2013

LibraryTimer (II) [fr]

En regardant de plus près le source de la W3D_AvengerLEMU.library, je m'aperçois que les fonctions internes sont appelées directement par des bsr et non par la FunctionTable :

Or, LibraryTimer patch la table des fonctions de la librairie afin d'y insérer un compteur et même une mesure de temps. Avec ce bsr, et bien LibraryTimer ne pourra l'ajouter dans ses statistiques. La solution est simple, il suffit de le remplacer par un jsr en étant sûr qu'a6 soit bien l'adresse de base de la W3D_AvengerLEMU.library :

Il y avait moins d'une dizaine d'appel bsr en tout et pour tout. Maintenant, nous allons obtenir des statistiques plus complètes et plus précises avec LibraryTimer :

La fonction -$3C fait alors son apparition comme étant la plus utilisée : il va falloir ruser comme un sioux afin de diminuer au maximum ses instructions nécessaires. Ici donc, chaque cycle gagné est très important.

Voici les nouvelles statistiques :
  • fonction -$24 : 382 fois
  • fonction -$36 : 1 fois
  • fonction -$3C : 367 558 fois
  • fonction -$5A : 110 fois
  • fonction -$90 : 23 fois
  • fonction -$AE : 1 fois
  • fonction -$B4 : 845 fois
  • fonction -$BA : 884 fois
  • fonction -$D8 : 2 357 fois
  • fonction -$DE : 452 fois
  • fonction -$E4 : 383 fois
  • fonction -$EA : 228 fois
  • fonction -$108 : 10 fois
  • fonction -$10E : 382 fois
  • fonction -$114 : 383 fois
  • fonction -$144 : 5 054 fois
  • fonction -$14A : 1 fois
  • fonction -$162 : 354 fois
  • fonction -$180 : 1 fois
  • fonction -$198 : 24 233 fois
  • fonction -$19E : 113 013 fois
  • fonction -$1B6 : 150 286 fois
  • fonction -$1C2 : 6 524 fois

Maintenant, très exactement la même méthode pour la Warp3D.library, avec toujours le même jeu Quake 2 :
  • W3D_SetState : 7 932  fois
  • W3D_LockHardware : 387 fois
  • W3D_UnLockHardware : 386 fois
  • W3D_WaitIdle : 386 fois
  • W3D_AllocTexObj : 1 fois
  • W3D_SetFilter : 3 fois
  • W3D_SetTexEnv : 2 318 fois
  • W3D_SetWrapMode : 1 fois
  • W3D_SetBlendMode : 1 011 fois
  • W3D_SetDrawRegion : 387 fois
  • W3D_ClearZBuffer : 387 fois
  • W3D_SetZCompareMode : 387 fois
  • W3D_SetCurrentColor : 4 257 fois
  • W3D_DrawTriFanV : 68 170 fois
  • W3D_DrawTriStripV : 19 480 fois
  • W3D_DrawArray : 142 166 fois

Voilà, le travail de re-programmation peut commencer sérieusement, le codeur sait avec précision par où débuter de façon à obtenir des résultats en terme de vitesse visibles à l'oeil nu.
      

2 commentaires:

  1. Hello

    Tu devrais demander à Matt Hey pour les fonctions spécifiques aux .library de drivers

    Tu peut utiliser Wazp3D (dasn winUAE) pour avoir la liste des appels à Warp3D d'un prog
    Wazp3D-prefs:
    >>> Enable Debugger >>>
    Debug Calls

    En mettant toutes ces options tu obtiens un simili-listing du prog qui tourne il suffit de rediriger l'output vers un fichier
    monprog > debug.txt

    Wazp3D-prefs:
    >>> Enable Debugger >>>
    Debug Function
    Debug Calls
    Debug Adresses
    JSR Debug as JSR
    Debug Var name
    Debug Var value
    Debug Var doc
    Debug State
    DebugPoint Debug Point
    DebugError Debug Error
    Debug SOFT3D


    Alain thellier - Wazp3D

    RépondreSupprimer

Laissez vos commentaires ici :