Tps d'exécution, Timer, graphique..... Au secours...
13 réponses
TouTi
Héo...
Cela fait trois jours que je suis sur un problème que je modèle de toute
part sans aboutir à un résultat stable.
Je résume mon projet :
* J'ai un cercle (horloge) dont le nombre de graduation peut aller de 1 à 50
(ces graduations ont une épaisseur importante)
* J'ai une aiguille(épaisseur importante) qui doit tourner à une vitesse
définie (8, 9, ... 60 s par tour) dans un sens ou dans l'autre
* J'ai cinq boutons :
- deux doivent permettre de faire un tour complet à l'aiguille dans un sens
ou dans l'autre
- deux doivent permettre de décaler l'aiguille d'une seule graduation dans
un sens ou dans l'autre
- le dernier doit stopper le mouvement de l'aiguille mais lorsqu'elle se
trouvera juste devant une graduation
Dans le timer réglé à 10ms,
* J'appelle une sub d'affichage de l'anneau et des graduations
* puis j'appelle une sub d'affichage de l'aiguille(avec calcul sin et cos et
sub "trace")
et tout cela(dans le cas le plus défavorable) pour qu'au bout de 8s
l'aiguille est fait un tour complet
J'utilise pour le traçage graphique des API pour obtenir des extrémités
plates pour les lignes d'épaisseur importante
Sub trace(XD, YD, XF, YF, col, DW)
Dim ExtendedPen&, di&
Dim Brushinfo As LOGBRUSH
Brushinfo.lbColor = col
Brushinfo.lbStyle = BS_SOLID
ExtendedPen = ExtCreatePen(PS_GEOMETRIC Or PS_ENDCAP_FLAT Or
PS_JOIN_ROUND, DW, Brushinfo, 0, ByVal 0&)
OldPen = SelectObject(pic.hdc, ExtendedPen&)
di = BeginPath(pic.hdc)
pic.Line (XD, YD)-(XF, YF)
di = EndPath(pic.hdc)
di = StrokePath(pic.hdc)
di = SelectObject(pic.hdc, OldPen)
di = DeleteObject(ExtendedPen)
End Sub
Je réalise le projet sur une machine cadencée à 1.67 GHz avec une carte
graphique rapide : Tout fonctionne impeccable
Je teste sur une machine ancienne 348 MHz, carte graphique S3 : Le temps
d'exécution est presque multiplié par deux
Je teste sur une machine récente >2.5Ghz, carte graphique intégrée : Le
temps d'exécution à un retard de deux secondes
Que pourrais-je encore faire pour aboutir au résultat conforme quelque soit
la situation???????
Un grand... mais Grand merci d'avance pour votre aide
Et c'est là aussi que le bas blesse, car je dois réafficher à chaque fois la base de "l'horloge" (anneau et graduations). Pour éviter ce problème j'avais pensé à superposer deux pictures : * Une inférieur qui affichera la base (on l'affiche qu'une seule fois) * Une supérieure(superposée à la base) qui affichera l'aiguille : Traçage puis mise en transparence autour de son contour. La question du temps d'éxécution reste peut être un problème (j'ai pas encore essayé)
Bonjour,
Pour ce genre d'animation, tu peux essayer de dessiner en mode XOR (instructions PSet, Line). L'effacement de l'aiguille se fait ainsi en la redessinant par dessus elle-même. Et cela restitue les pixels qui avaient été recouverts. Par contre tu auras une différence de couleur sur ton aiguille aux endroits où elle recouvre quelque chose. À voir. Cela a l'avantage d'être rapide.
J'ai utilisé cela pour une appli qui devaient afficher des courbes et les effacer sans que cela laisse des «trous» au niveau des intersections entre les courbes.
-- Fred http://www.cerbermail.com/?3kA6ftaCvT
Dans : news:43e325e9$0$18304$8fcfb975@news.wanadoo.fr,
TouTi disait :
Et c'est là aussi que le bas blesse, car je dois réafficher à chaque
fois la base de "l'horloge" (anneau et graduations). Pour éviter ce
problème j'avais pensé à superposer deux pictures :
* Une inférieur qui affichera la base (on l'affiche qu'une seule fois)
* Une supérieure(superposée à la base) qui affichera l'aiguille :
Traçage puis mise en transparence autour de son contour. La question
du temps d'éxécution reste peut être un problème (j'ai pas encore
essayé)
Bonjour,
Pour ce genre d'animation, tu peux essayer de dessiner en mode XOR
(instructions PSet, Line).
L'effacement de l'aiguille se fait ainsi en la redessinant par dessus
elle-même.
Et cela restitue les pixels qui avaient été recouverts.
Par contre tu auras une différence de couleur sur ton aiguille aux
endroits où elle recouvre quelque chose. À voir.
Cela a l'avantage d'être rapide.
J'ai utilisé cela pour une appli qui devaient afficher des courbes et
les effacer sans que cela laisse des «trous» au niveau des intersections
entre les courbes.
Et c'est là aussi que le bas blesse, car je dois réafficher à chaque fois la base de "l'horloge" (anneau et graduations). Pour éviter ce problème j'avais pensé à superposer deux pictures : * Une inférieur qui affichera la base (on l'affiche qu'une seule fois) * Une supérieure(superposée à la base) qui affichera l'aiguille : Traçage puis mise en transparence autour de son contour. La question du temps d'éxécution reste peut être un problème (j'ai pas encore essayé)
Bonjour,
Pour ce genre d'animation, tu peux essayer de dessiner en mode XOR (instructions PSet, Line). L'effacement de l'aiguille se fait ainsi en la redessinant par dessus elle-même. Et cela restitue les pixels qui avaient été recouverts. Par contre tu auras une différence de couleur sur ton aiguille aux endroits où elle recouvre quelque chose. À voir. Cela a l'avantage d'être rapide.
J'ai utilisé cela pour une appli qui devaient afficher des courbes et les effacer sans que cela laisse des «trous» au niveau des intersections entre les courbes.
-- Fred http://www.cerbermail.com/?3kA6ftaCvT
TouTi
Bah je crois que je tiens la solution (à 10ms près)
J'ai remanillé la partie graphique : * Je n'affiche qu'une fois la base de l'horloge en la créant dans un autre picture et la réintégre dans la picture visible par la propriété picture * Je nettoye la picture (cls) et dessine l'aiguille
Je reste sur la base du temps pour le calcul de déplacement. Le temps total d'un tour est régulièrement réajuster selon le temps d'exécution du tracage. J'ai essayé les APIs timerSetEvent() et timerKillEvent() mais posent quelques problèmes. Par contre GetTickCount() (bien que moins peut précis) apporte une facilité de mise en oeuvre....
Il me reste plus qu'à finioler
Ouff....
Bon WE -- Guy
Bah je crois que je tiens la solution (à 10ms près)
J'ai remanillé la partie graphique :
* Je n'affiche qu'une fois la base de l'horloge en la créant dans un autre
picture et la réintégre dans la picture visible par la propriété picture
* Je nettoye la picture (cls) et dessine l'aiguille
Je reste sur la base du temps pour le calcul de déplacement. Le temps total
d'un tour est régulièrement réajuster selon le temps d'exécution du tracage.
J'ai essayé les APIs timerSetEvent() et timerKillEvent() mais posent
quelques problèmes. Par contre GetTickCount() (bien que moins peut précis)
apporte une facilité de mise en oeuvre....
Bah je crois que je tiens la solution (à 10ms près)
J'ai remanillé la partie graphique : * Je n'affiche qu'une fois la base de l'horloge en la créant dans un autre picture et la réintégre dans la picture visible par la propriété picture * Je nettoye la picture (cls) et dessine l'aiguille
Je reste sur la base du temps pour le calcul de déplacement. Le temps total d'un tour est régulièrement réajuster selon le temps d'exécution du tracage. J'ai essayé les APIs timerSetEvent() et timerKillEvent() mais posent quelques problèmes. Par contre GetTickCount() (bien que moins peut précis) apporte une facilité de mise en oeuvre....
Il me reste plus qu'à finioler
Ouff....
Bon WE -- Guy
TouTi
Bonjour Fred
Pour ce genre d'animation, tu peux essayer de dessiner en mode XOR (instructions PSet, Line). L'effacement de l'aiguille se fait ainsi en la redessinant par dessus elle-même.
Je vais essayer... merci
-- Guy
Bonjour Fred
Pour ce genre d'animation, tu peux essayer de dessiner en mode XOR
(instructions PSet, Line).
L'effacement de l'aiguille se fait ainsi en la redessinant par dessus
elle-même.
Pour ce genre d'animation, tu peux essayer de dessiner en mode XOR (instructions PSet, Line). L'effacement de l'aiguille se fait ainsi en la redessinant par dessus elle-même.