See site in english Voir le site en francais
Website skin:
home  download  forum  link  contact

Welcome, Guest. Please login or register.
Did you miss your activation email?

Login with username, password and session length

Author Topic: [tutorial] Posez vos question sur les DLL C++ (no 2)  (Read 40260 times)

0 Members and 1 Guest are viewing this topic.

Offline Papyref

  • Legend
  • ******
  • Posts: 4896
  • Country: France fr
  • Karma: 223
  • Je suis dans la Lune ne pas me déranger
Reply #125 - 07 July 2008, 16:36:10
Merci les amis,

J'ai examiné déjà le code d'Atlantis mais je n'ai pas encore trouvé la solution.
Je connais le bras de Kulch mais mon but est d'animer le mien pour apprendre et je ne veux pas l'utiliser.

L'animation du bras n'est pas un problème mais c'est le grap qui en est un.
Je vais continuer à méditer.

Papyref


Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15002
  • Karma: 178
  • Hein, quoi !?
    • FsPassengers
Reply #126 - 07 July 2008, 19:04:31
J'irais jetter un oeil cette nuit et détaillerais un peu la partie cruciale... enfin , je vais voir quoi...

Dan


Offline Coussini

  • Legend
  • ******
  • Posts: 3069
  • Country: Canada ca
  • Karma: 15
Reply #127 - 12 August 2008, 13:26:56



HO HE.... Ca m'intéresse vraiment d'avoir ce type d'information sur VS2005.... Comment faire pour voir tous les liens pour
les include, fichiers bibliothèques

BREF: Avec ce type de panneau, peut-on voir les répertoires pour:

1-Les DLL
2-Les fichiers H de ces DLL
3-Le LIB
4-Le includes (que je comprends pas ce que fait ces choses)
5-les BIN (je ne comprend pas ce choses également et j'aimerais en savoir plus)
6-les DEF (je ne comprend pas ce choses également et j'aimerais en savoir plus)

Si vous avez un schéma ou une doc permettant de comprendre 'visuellement parlant' les différents objets qui peuvent
graviter autour d'un exécutable (DLL, H, LIB,....) et quel sont les associations indispensables commes DLL+H, LIB (qui doit être seul car il sont linker....)


MERCI....



Message modifié ( 12-08-2008 13:30 )

Coussini "Maître des liens"


Offline Schimz

  • Legend
  • ******
  • Posts: 1598
  • Karma: 1
Reply #128 - 26 February 2009, 21:36:09
Hellooo :)
Je perd 20% de fps avec les effets sur les moteurs du DGex :badsmile:   
Je veux exclure le code de chaque moteur si son level ne change pas de step en step. Je me doute que c'est une histoire de
Pre/Post Step. Mais à part le if(do==true) DoStuff();, je sèche :damn:



Message modifié ( 26-02-2009 21:41 )


Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15002
  • Karma: 178
  • Hein, quoi !?
    • FsPassengers
Reply #129 - 26 February 2009, 23:10:08
Hello ;)

No problemo mais je vois pas ou ce situe ton prob exactement pour l'instant.

Comment implementer le callback post/pre step ou comment exclure du code tant qu'il n'y a pas de changements ?
T'a un bout de code, un contexte, plus de précisions ?

A peluche

Dan



Message modifié ( 26-02-2009 23:47 )


Offline Schimz

  • Legend
  • ******
  • Posts: 1598
  • Karma: 1
Reply #130 - 27 February 2009, 07:02:22
Quote
exclure du code tant qu'il n'y a pas de changements
That's it.

C'est la mise à jour de ma variable à tester et le dit test que je sais pas où mettre.

ça :
previousThrusterLevel = GetThrusterLevel(th);

et ça :
do = true;
if ( GetThrusterLevel(th) == previousThrusterLevel )
do = false;



Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15002
  • Karma: 178
  • Hein, quoi !?
    • FsPassengers
Reply #131 - 27 February 2009, 10:05:45
ok,

Optimisation par désactivation dynamique de code redondant (wow le titre :badsmile: )

Il te faut une variable permanente dans ta classe (le h en principe) Autant de variables qu'il y a de moteurs -qui
peuvent avoir différentes valeurs-  dans l'exemple je suppose trois.  Par convention j'utilise toujours le prefixe "old"
(vieux) je sais qu'elle contient la valeurs de la dernière execution valide.

Code: [Select]
// dans le header de la class vessel
float fOldEngineLevel1;
float fOldEngineLevel2;
float fOldEngineLevel3;


Dans clbkSetClassCap on initialise les variables c'est très important j'insiste toujours la dessus.  

Code: [Select]
void clbkSetClassCap()
{
    fOldEngineLevel1=-999.0f;
    fOldEngineLevel2=-999.0f;
    fOldEngineLevel3=-999.0f;

pourquoi -999 ? :)

Dans ces variables faut toujours mettre une valeurs qui ne peut pas être atteinte par le truc à controller, sinon on
risque d'avoir un bug ( "même valeur ? oh ben je fais rien" si y avait besoin la premier fois!). La c'est pas si
important puisque à zéro on n'a pas d'effet, mais j'attire l'attention la dessus si tu veux appliquer cette technique
ailleurs.


Dans clbkPreStep (ou PostStep dépend ou tu applique ton effet) on fais le boulot, je ne le montre que pour l'engine1
pour plus de clarté.


Code: [Select]
void clbkPreStep()
{
       // Phase un on lis la valeur courante dans une variable locale (pas besoin ailleurs)
       float fCurrentEngineLevel1=GetThrusterLevel(th);

      // Phase deux on procède à la comparaison, pour un float ou une simple
      // variation de 0.0000001 est considéré comme non égal on dois le faire
      // par fourchette et ajuster la fourchette pour n'avoir une activation de code
      // que pour des différences significative. (le code ne tournera que quand vraiment nécessaire)
      // ici une fourchette de 0.1, si ca ce voit trop on peut affiner (0.005)

      if(fCurrentEngineLevel1 < fOldEngineLevel1+0.05 && fCurrentEngineLevel1 > fOldEngineLevel1-0.05)
      {
             // le code qui applique l'effet.
             DoEffect();

             // Et pour finir on ce souvient de la valeurs du moteur la dernière fois
             // que l'effet a été appliqué. Une différence de 0.1 assurera
             // un déclenchement de l'effet la prochaine fois.

             fOldEngineLevel1=fCurrentEngineLevel1;
      }

Résultat: ton effet ne sera executé que si le moteur à eu une variation de 0.1 avec la dernière fois.

Tout ca c'est très bien si ton Code "DoEffect() l'applique pour cette boucle seulement (défini un niveau de fumée?). Mais il faut du code en plus si c'est une fonction qui fais on/off (active désactive les particules? je sais pas ce que tu fais exactement)


J'utilise cette technique pour énormément de trucs. ca assure qu'une chose qui ne change pas ne soit pas mise à jours chaque loop. Ca permet aussi de réduire les maj pour des différences non significatives.
Exemple typique le volume d'un son, une variation de 1 sur 255 ne s'entend pas, donc j'applique cette technique avec "5" comme fourchette. (OrbiterSound l'utilise énormément que ce soit pour le volume la fréquence etc etc)

A++

Dan



Message modifié ( 27-02-2009 16:25 )


Offline Schimz

  • Legend
  • ******
  • Posts: 1598
  • Karma: 1
Reply #132 - 27 February 2009, 17:09:32
Super :)
:wor:

Quote
Tout ca c'est très bien si ton Code "DoEffect() l'applique pour cette boucle seulement (défini un niveau de fumée?).
Mais il faut du code en plus si c'est une fonction qui fais on/off (active désactive les particules? je sais pas ce que tu
fais exactement)
Oui, il y a plein de code à zapper. C'est pour qu'en plus de mes vars fHaeLvlPrec, j'avais préparé 4 booléens
bHaeDoFX :eek:

Aleyyy, c'est partit pour le W.E. :zzz:



Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15002
  • Karma: 178
  • Hein, quoi !?
    • FsPassengers
Reply #133 - 27 February 2009, 18:46:12
Bon week-end alors :)

Hésite pas !

Dan


Offline Schimz

  • Legend
  • ******
  • Posts: 1598
  • Karma: 1
Reply #134 - 27 February 2009, 21:03:58
Ça marche :)

'tin, c'était tout con en fait :bug:

Par contre, ça marche pas si je fais pas mon if comme ça :wonder:

if (plasma_lvl < plasma_lvlPrec || plasma_lvl > plasma_lvlPrec) {
    plasmaDoFX = true;
    plasma_lvlPrec=plasma_lvl;
} else {
   plasmaDoFX = false;
}

Pour tester, j'ai rajouté un dong windows dans mes fonctions Fx, c'était rigolo :)

edit :
Quote
Hésite pas !
Un orbiterSound pour 09β :siffle:



Message modifié ( 27-02-2009 21:04 )


Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15002
  • Karma: 178
  • Hein, quoi !?
    • FsPassengers
Reply #135 - 27 February 2009, 23:17:08
C'est la version égalité parfaite la, tu pourrais remplacer par

Code: [Select]
if (plasma_lvl !=plasma_lvlPrec)
{
  //etc etc

L'inconvénient de cette méthode c'est qu'entre   0.0455 et 0.0672 si tu incrémente lentement (cas possible de pilote
automatique) t'auras pratiquement un lancement d'effet chaque loop alors qu'avec l'autre methode tu en aura que le
stricte necessaire= meilleurs optimisation.

Pour ton projet franchement (je ne sais pas l'impact de ton effet?) ca ne fais peut-être pas une grand différence, pour
des trucs plus gros ca plus ca plus ca= framerate pourri.

Peut être mon code était mal ficelé (fais de tête) essaie juste de remplacer la première ligne:

Code: [Select]
if (plasma_lvl < plasma_lvlPrec || plasma_lvl > plasma_lvlPrec){

Par :

Code: [Select]
if (plasma_lvl < plasma_lvlPrec-0.05 || plasma_lvl > plasma_lvlPrec+0.05){

Oui en fait je crois que je me suis gouré la première fois. Mauvaise logique. Pour optimiser après tu peux essayer
de changer la valeurs par incrément de 0.05 jusqu'a trouver la valeur maximale ou tu vois pas de "saut" dans ton
effet. Le lancement sera fais juste le nombre de fois nécessaire.

A++

Dan



Message modifié ( 27-02-2009 23:19 )


Offline Schimz

  • Legend
  • ******
  • Posts: 1598
  • Karma: 1
Reply #136 - 27 February 2009, 23:36:31
Quote
DanSteph a écrit:
Pour ton projet franchement (je ne sais pas l'impact de ton effet?) ca ne fais peut-être pas une grand différence, pour
des trucs plus gros ca plus ca plus ca= framerate pourri.
Dan
Oué ben en fait, oué, pas de changement de FPS, c'est juste les effets en eux mêmes qui bouffent :ptdr:



Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15002
  • Karma: 178
  • Hein, quoi !?
    • FsPassengers
Reply #137 - 27 February 2009, 23:48:12
C'est l'effet particule ?

Si oui faut optimiser l'effet lui-même (martin), de notre coté on peut juste l'afficher ou pas (il me semble), ca change
rien :)

Dan


Offline Schimz

  • Legend
  • ******
  • Posts: 1598
  • Karma: 1
Reply #138 - 28 February 2009, 09:46:14
Quote
DanSteph a écrit:
C'est l'effet particule ?
Non, pour ça j'utilise le truc normal. Les FX, c'est le son (j'ai pas de MAIN sound, je fais tout à la mano) et le mélange de
surface (la lumière des moteurs).



Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15002
  • Karma: 178
  • Hein, quoi !?
    • FsPassengers
Reply #139 - 28 February 2009, 10:08:14
C'est peut être bien un probleme de fill rate, truc que orbiter gêre pas nickel. (affichage de texture transparente en
empilement)

Dans ce cas rien que tu puisse faire à part optimiser les textures ou les réduires.

Dan


Offline Schimz

  • Legend
  • ******
  • Posts: 1598
  • Karma: 1
Reply #140 - 28 February 2009, 10:57:58
Boaf, ça tournait correctement sur la trapanelle du boulot, je verrais mieux la différence en testant lundi.

Bon... faut que je vire les vieilles lampes... :zzz:

Je vais aussi zapper quelques trucs pas nécessaires actuellement, pour avancer la release.



Offline tofitouf

  • Legend
  • ******
  • Posts: 1380
  • Karma: 0
Reply #141 - 07 June 2009, 02:54:05
Quote
Coussini a écrit:



HO HE.... Ca m'intéresse vraiment d'avoir ce type d'information sur VS2005.... Comment faire pour voir tous les liens pour
les include, fichiers bibliothèques

BREF: Avec ce type de panneau, peut-on voir les répertoires pour:

1-Les DLL
2-Les fichiers H de ces DLL
3-Le LIB
4-Le includes (que je comprends pas ce que fait ces choses)
5-les BIN (je ne comprend pas ce choses également et j'aimerais en savoir plus)
6-les DEF (je ne comprend pas ce choses également et j'aimerais en savoir plus)

Si vous avez un schéma ou une doc permettant de comprendre 'visuellement parlant' les différents objets qui peuvent
graviter autour d'un exécutable (DLL, H, LIB,....) et quel sont les associations indispensables commes DLL+H, LIB (qui doit
être seul car il sont linker....)


MERCI....

si la question peux intéresser encore du monde, demandez moi, je peux poster un ptit cours complet sur la question...
C'est vrai que ce problème est universel. Je vais essayer de poster tout ca bientot


---------------------------------------------

PC en rade, codage en panne.... Nom de Zeus

Offline simon50

  • Jr. Member
  • **
  • Posts: 43
  • Karma: 0
Reply #142 - 17 June 2009, 18:29:31
Salut tout le monde.
Moi aussi, avec les vacances je me met à bricoler les DLL... ;)

Au début, pas trop de problème. Mais pour animer mon train, je veut faire tourner une tige tout en faisant une translation...
Seulement dans ce cas là, le centre de rotation bouge avec la translation...

En cherchant un peu, je pense qu'une animation avec parent pourrait être la solution. Je recopie donc les exemples de la doc
de la SDK à ma sauce. Ca me donne :
Quote
ANIMATIONCOMPONENT_HANDLE parent;
   static UINT RessortARGGRP[2] = {GRP_RessortARGG, GRP_RessortARGD};
   static MGROUP_ROTATE RessortRot (0, RessortARGGRP, 2, _V(3.9, 0.1, 2.05), _V(1,0,0), (float)(0.43*PI));
   trans = new MGROUP_TRANSLATE (0, RessortARGGRP, 2, _V(0,0,-0.8));
   parent = AddAnimationComponent (anim_Gear, 0, 0.6, &RessortRot);
   AddAnimationComponent (anim_Gear, 0, 0.6, trans, parent);

Seulement, à la compilation il me dit que la variable trans n'est pas déclarée... :sunk:   
Alors ma question est la suivante : où faut-il déclarer cette variable et comment ?
Merci.


______________________________________________________________

     "You can't always get what you want"

Offline MartySpaceLines

  • Legend
  • ******
  • Posts: 1096
  • Karma: 0
Reply #143 - 17 June 2009, 19:03:08
Ca répond pas directement à ta question, mais regarde la "méthode" de Dan (
http://orbiter.dansteph.com/forum/index.php?topic=6337.msg95356#msg95356 )!!!

-> ouvre le projet de la sdk, puis clique droit sur la variable -> "atteindre la déclaration"...


@++

MSL  


Offline no matter

  • Legend
  • ******
  • Posts: 2826
  • Karma: 1
Reply #144 - 17 June 2009, 20:23:24
Quote
simon50 a écrit:
Seulement, à la compilation il me dit que la variable trans n'est pas déclarée... :sunk:   
Alors ma question est la suivante : où faut-il déclarer cette variable et comment ?
Merci.
Où : dans ton header
comment : en écrivant MGROUP_TRANSFORM *trans;
Et puisque new il y a, delete tu n'oubliras pas ! :prof:



Message modifié ( 17-06-2009 20:26 )

------------

no matter.

Offline simon50

  • Jr. Member
  • **
  • Posts: 43
  • Karma: 0
Reply #145 - 18 June 2009, 01:14:03
Quote
no matter a écrit:
Où : dans ton header
comment : en écrivant MGROUP_TRANSFORM *trans;
Et puisque new il y a, delete tu n'oubliras pas ! :prof:

OK, merci. :top:   
Je teste ça demain. ;)


______________________________________________________________

     "You can't always get what you want"

Offline siriusfett

  • Legend
  • ******
  • Posts: 967
  • Country: France fr
  • Karma: 5
Reply #146 - 13 October 2009, 18:32:20
J'ai installé VC2008 pour recompilé les dll de mes stations Ceres et ESS qui semblent ne pas vouloir fonctionné sur une
installe qui comporte le XR2, et voir si c'est mieux.

Au moment de la compilation je rencontre le problème :

 
Quote
1>.\Ceres.rc(10) : fatal error RC1015: cannot open include file 'afxres.h'.

J'ai fait des recherches et trouvé ça sur Wiki :

Quote
cannot open include file 'afxres.h'
Error: fatal error RC1015: cannot open include file 'afxres.h'.
Solution: add the 'include\mfc\' folder of the Platform SDK (default C:\Program Files\Microsoft Platform SDK\include\mfc) to
"Configuration Properties/Resources/Additional Include Directories"

Je pense avoir compris qu'il faut inclure Program Files\Microsoft Platform SDK\include\mfc

 ma question est, ou exactement ?



Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15002
  • Karma: 178
  • Hein, quoi !?
    • FsPassengers
Reply #147 - 13 October 2009, 18:37:33
Regarde le poste 4:

"4-Regler Visual C++ express pour qu'il retrouve les ressources"

De ce fil:

http://orbiter.dansteph.com/forum/index.php?topic=6334.msg95341#msg95341

Hope it help ?

Dan


Offline siriusfett

  • Legend
  • ******
  • Posts: 967
  • Country: France fr
  • Karma: 5
Reply #148 - 13 October 2009, 18:55:21
Quote
DanSteph a écrit:
Regarde le poste 4:

"4-Regler Visual C++ express pour qu'il retrouve les ressources"

De ce fil:

http://orbiter.dansteph.com/forum/index.php?topic=6334.msg95341#msg95341

Hope it help ?

Dan

Merci tonton Dan



Le chemin le plus courant :

C:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2\Include\mfc



Offline MartySpaceLines

  • Legend
  • ******
  • Posts: 1096
  • Karma: 0
Reply #149 - 15 October 2009, 20:17:40
Bien le bonjour! ;)

Alors... Comme beaucoup de monde ici, je connais à-peu-près le langage C++, mais lorsqu'il s'agit de configurer Visual et de
farfouiller dans toutes ces librairies au nom obscure (msvcrt et autres), alors là ça se corse!!
Pour quelqu'un qui s'y connaît, c'est surement un problème easy à résoudre, mais pour moi...no comment!

Ma sortie du debug:
Quote
1>------ Début de la génération : Projet : MSLJ_Gemini, Configuration : Debug Win32 ------
1>Édition des liens en cours...
1>   Création de la bibliothèque .\Debug/MSLJ_Gemini.lib et de l'objet .\Debug/MSLJ_Gemini.exp
1>Config_Stage1.obj : error LNK2001: symbole externe non résolu "public: virtual void __thiscall MFD::Update(struct HDC__ *)"
(?Update@MFD@@UAEXPAUHDC__@@@Z)
1>MSLJ_Gemini.obj : error LNK2001: symbole externe non résolu "public: virtual void __thiscall MFD::Update(struct HDC__ *)"
(?Update@MFD@@UAEXPAUHDC__@@@Z)
1>Config_Stage1.obj : error LNK2019: symbole externe non résolu "void * __cdecl operator new[](unsigned int,struct
std::_DebugHeapTag_t const &,char *,int)" (??_U@YAPAXIABU_DebugHeapTag_t@std@@PADH@Z) référencé dans la fonction "public:
char * __cdecl std::_DebugHeapAllocator<char>::allocate(unsigned int,void const *)"
(?allocate@?$_DebugHeapAllocator@D@std@@QAAPADIPBX@Z)
1>MSLJ_Gemini.obj : error LNK2001: symbole externe non résolu "void * __cdecl operator new[](unsigned int,struct
std::_DebugHeapTag_t const &,char *,int)" (??_U@YAPAXIABU_DebugHeapTag_t@std@@PADH@Z)
1>Config_Stage1.obj : error LNK2019: symbole externe non résolu "struct std::_DebugHeapTag_t const & __cdecl
std::_DebugHeapTag_func(void)" (?_DebugHeapTag_func@std@@YAABU_DebugHeapTag_t@1@XZ) référencé dans la fonction "public: char
* __cdecl std::_DebugHeapAllocator<char>::allocate(unsigned int,void const *)"
(?allocate@?$_DebugHeapAllocator@D@std@@QAAPADIPBX@Z)
1>MSLJ_Gemini.obj : error LNK2001: symbole externe non résolu "struct std::_DebugHeapTag_t const & __cdecl
std::_DebugHeapTag_func(void)" (?_DebugHeapTag_func@std@@YAABU_DebugHeapTag_t@1@XZ)
1>.\..\..\..\Modules/MSLJ_Gemini.dll : fatal error LNK1120: 3 externes non résolus
1>Le journal de génération a été enregistré à l'emplacement
"file://c:\Users\Marty\Desktop\Orbiter_Gemini\Orbitersdk\samples\GeminiSpirit\Debug\BuildLog.htm"
1>MSLJ_Gemini - 7 erreur(s), 0 avertissement(s)
========== Génération : 0 a réussi, 1 a échoué, 0 mis à jour, 0 a été ignoré ==========


Sinon, mon visual est configuré comme dans le tuto de Dan, j'ai pas mis de "dépendances supplémentaires" (j'ai essayé avec
quelques-unes: aucun résultat mais bon...c'était du tatonnage) et j'ai dû exclure  msvcrt.lib et libcpmtd.lib (sinon il me
dit qu'elles font conflict...)

Merci beaucoûp à ceux qui oseront jeter un coup d'oeil là-dessus!


@++

MSL