Réccupérer le framerate d'un jeu en VB.NET

Résolu
tinux Messages postés 244 Date d'inscription mercredi 13 avril 2005 Statut Membre Dernière intervention 21 octobre 2013 - 8 mai 2008 à 19:13
tinux Messages postés 244 Date d'inscription mercredi 13 avril 2005 Statut Membre Dernière intervention 21 octobre 2013 - 9 mai 2008 à 16:16
Bonjour, j'aimerais réccupérer le framerate d'un jeu.. je pense pas qu'on puisse le faire nativement, en revanche, je pense que l'on peut réutiliser des dll (comme par exemple celle de FRAPS, ou Tatski).

Pour Fraps j'ai essayé d'importer la dll qui contient la Fonction FrapsSharedData qui permet de retourner CurrentFPS qui est la valeur du Framerate actuelle calculée par FRAPS. Le problème est que l'on ne peut l'importer :

Une référence à 'monprog\fraps.dll' n'a pas pu être ajoutée. Assurez-vous que le fichier est accessible et qu'il s'agit
d'un assembly valide ou d'un composant COM.

Donc si quelqu'un à déjà réussi à faire ce genre de chose, par cette méthode ou une autre, je suis preneur ;)

16 réponses

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
9 mai 2008 à 15:19
ne donnes-tu jamais de type à aucune variable, fonction ?

essaies avec ce genre de choses...

Declare Function FrapsSharedData Lib "fraps.dll" () As Integer
Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByRef Cible As Integer, ByVal pointeurSource As integer, ByVal byteLen As Integer)

Function ActualFPS() As UInteger
Dim Pointeur As Integer= FrapsSharedData()
If Pointeur<>0 Then
CopyMemory(ActualFPS, Pointeur,4)
End If
End Function
3
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
9 mai 2008 à 07:31
il a raison, cette dll est une dll d'api, qui exporte ta fonction.

j'ai tapé FrapsSharedData sur google, il me l'a dit:

http://www.yofx-nrw.de/bilder/yofx_demos/Fraps/README.HTM

(exemples de code tout en bas)

en VB, tu fera donc un Declare function ...
0
tinux Messages postés 244 Date d'inscription mercredi 13 avril 2005 Statut Membre Dernière intervention 21 octobre 2013
9 mai 2008 à 12:00
Merci Renfield ;)

Mais maintenant j'ai un peu de mal encore (j'aime pas trop ça les API).

J'ai le message : Restriction PInvoke : impossible de retourner des variants

et le code que j'ai fait :

    Structure FRAMERATE
        Dim sizeOfStruc As Decimal
        Dim currentFPS As Decimal
        Dim totalFrames As Decimal
        Dim timeOfLastFrame As Decimal
        Dim gameName As String
    End Structure

   Declare Function FrapsSharedData Lib "fraps.dll" (ByVal lpFrame As FRAMERATE)

    Function ActualFPS()
        Dim nActualFPS As FRAMERATE
        FrapsSharedData(nActualFPS)
        ActualFPS = nActualFPS.currentFPS
    End Function
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
9 mai 2008 à 12:17
Aïe...
ta déclaration d'API ne convient pas...

une fonction qui ne retourne rien (donc un variant, d'ou ton message d'erreur)
une structure dont les types ne conviennent pas... DWORD c'est un UINT, c'est pas décimal...
ton gameName qui n'a pas de taille spécifiée (32 caractères)...

difficile de prévoir ce que ton code va nous générer.

l'API alloue ta structure et t'en renvoie un pointeur (donc Integer, en .NET)
(je ne connais pas Fraps, je ne fais que lire le code)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
tinux Messages postés 244 Date d'inscription mercredi 13 avril 2005 Statut Membre Dernière intervention 21 octobre 2013
9 mai 2008 à 12:20
En faisant

   Declare Function FrapsSharedData Lib "fraps.dll" (ByVal lpFrame As FRAMERATE) As quelquechose..

Je n'ai plus le message d'erreur mais ça retourne 0 alors que FRAPS est lancé avec une visualisation wmp (60fps)
0
tinux Messages postés 244 Date d'inscription mercredi 13 avril 2005 Statut Membre Dernière intervention 21 octobre 2013
9 mai 2008 à 13:20
Erf ça me renvoie toujours 0.

    Function ActualFPS()
        Dim nActualFPS As FRAMERATE
        FrapsSharedData(nActualFPS)
        ActualFPS = nActualFPS.totalFrames
    End Function

Je pense que ça vient du fait que nActual est souligné me disant qu'une référence de type null peut se produire du fait qu'aucune valeur ne lui est assignée.

Pourtant sur la même structure ceci marche impec :

    Structure MEMORYSTATUS
        Dim dwLength As Long
        Dim dwMemoryLoad As Long
        Dim dwTotalPhys As Long
        Dim dwAvailPhys As Long
        Dim dwTotalPageFile As Long
        Dim dwAvailPageFile As Long
        Dim dwTotalVirtual As Long
        Dim dwAvailVirtual As Long
    End Structure

    Declare Sub GlobalMemoryStatus Lib "kernel32" (ByVal lpBuffer As MEMORYSTATUS)

    Function GetRamSize() As String
        Dim RamStats As MEMORYSTATUS
        GlobalMemoryStatus(RamStats)
        GetRamSize = FormatNumber((RamStats.dwTotalPhys / 1024 ^ 2), -1) ' pour un résultat en Mo
    End Function
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
9 mai 2008 à 13:25
la fonction FrapsSharedData ne prend aucun argument et renvoie un pointeur vers une structure FRAMERATE qu'elle alloue.

Declare Function FrapsSharedData Lib "fraps.dll" () As Integer
0
tinux Messages postés 244 Date d'inscription mercredi 13 avril 2005 Statut Membre Dernière intervention 21 octobre 2013
9 mai 2008 à 13:39
D'accord mais alors comment intercepter chaque variable du pointeur ?
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
9 mai 2008 à 14:01
CopyMemory
0
tinux Messages postés 244 Date d'inscription mercredi 13 avril 2005 Statut Membre Dernière intervention 21 octobre 2013
9 mai 2008 à 15:12
Bon, ça n'avance pas trop.

J'ai essayé d'utiliser CopyMemory comme suit :

    Declare Function FrapsSharedData Lib "fraps.dll" () As UInteger
    Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal variable, ByVal pointeur, ByVal byteLen)

    Function ActualFPS()
        Dim currentFPS As UInteger
        Dim Pointeur As UInteger
        Pointeur = FrapsSharedData()
        CopyMemory(currentFPS, Pointeur,4)
        ActualFPS = currentFPS
    End Function

Retourne toujours 0.
0
tinux Messages postés 244 Date d'inscription mercredi 13 avril 2005 Statut Membre Dernière intervention 21 octobre 2013
9 mai 2008 à 15:49
Effectivement, c'est bien mieux comme ça !

Sauf que la fonction FrapsSharedData(), contient plusieurs valeurs et le fait de la déclarer en int restreint juste à la première valeur. Il ne me revoie que sizeOfStruct qui est la première valeur, il y a ensuite currentFPS, totalFrames etc..

C'est un problème de déclaration, ou ça se règle en faisant une boucle.. (je dis sans doute de grosses bêtises)
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
9 mai 2008 à 15:52
de grosses bétises, oui ^^

le déclarer en Integer fait que tu récupères.... un Integer
comme je te l'ai dit, cette fonction renvoie un pointeur vers une zone mémoire qui contient les differents champs de ta structure.
tu récupères ici le premier champ de cette structure.
il te suffit donc de décaler le pointeur...

CopyMemory(ActualFPS, Pointeur+4,4)

pour lire le deuxième champ (4 octets plus loin)
0
tinux Messages postés 244 Date d'inscription mercredi 13 avril 2005 Statut Membre Dernière intervention 21 octobre 2013
9 mai 2008 à 15:57
D'accord, et comment savoir combien d'octets prend chaque champ ?
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
9 mai 2008 à 16:02
....
c'est précisément ce que tu décrit dans ta structure....
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
9 mai 2008 à 16:03
DWORD => 2 octets
0
tinux Messages postés 244 Date d'inscription mercredi 13 avril 2005 Statut Membre Dernière intervention 21 octobre 2013
9 mai 2008 à 16:16
D'accord un Grand Merci ;)

Je vais me documenter un peu plus sur les API, les adresses mémoires, histoire de combler un peu ces défaillances.
En tout cas meri pour le dépannage Renfield ;)
0
Rejoignez-nous