tinux
Messages postés244Date d'inscriptionmercredi 13 avril 2005StatutMembreDernière intervention21 octobre 2013
-
8 mai 2008 à 19:13
tinux
Messages postés244Date d'inscriptionmercredi 13 avril 2005StatutMembreDernière intervention21 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 ;)
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 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
tinux
Messages postés244Date d'inscriptionmercredi 13 avril 2005StatutMembreDernière intervention21 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
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 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)
Vous n’avez pas trouvé la réponse que vous recherchez ?
tinux
Messages postés244Date d'inscriptionmercredi 13 avril 2005StatutMembreDernière intervention21 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
tinux
Messages postés244Date d'inscriptionmercredi 13 avril 2005StatutMembreDernière intervention21 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
tinux
Messages postés244Date d'inscriptionmercredi 13 avril 2005StatutMembreDernière intervention21 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)
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 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...
tinux
Messages postés244Date d'inscriptionmercredi 13 avril 2005StatutMembreDernière intervention21 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 ;)