Ecran en mode portrait lague d'un ticker texte

Résolu
cs_tigroux Messages postés 105 Date d'inscription mardi 16 mars 2004 Statut Membre Dernière intervention 22 octobre 2008 - 29 juil. 2008 à 09:01
cs_tigroux Messages postés 105 Date d'inscription mardi 16 mars 2004 Statut Membre Dernière intervention 22 octobre 2008 - 30 juil. 2008 à 16:39
Bonjour,
J'ai developper un Ticker Text mais j'ai quelques petits soucies.
Mon code semble parfaitement fonctionner avec mon ecran dans sa position normal, mais dès que je fais pivoter mon ecran à 90°, le texte se met à laguer c'est affreux, c'est completement inexploitable.

Quelqu'un a deja eu ce genre de probleme?

A premiere vu cela semble venir de la gestion de la rotation d'ecran mais je ne sais pas si y a une autre solution.

Merci d'avance

12 réponses

leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
30 juil. 2008 à 13:13
Tu as beau utiliser le double buffering du framework, tu effectue le DrawString a chaque appel. Je te parlais plutot d'un double buffer ou tu dessine ta string une seule fois dans un buffer, et tu flush ce buffer dans le OnPaint. Pas pour éviter le flickering, mais plutot pour éviter de rerendre la font et redessiner la string a chaque fois.
Pour le blitting, cest un algorithme de combinaison d'images optimisé (comment combiner uniquement telle partie de telle image avec telle partie de telle autre image dans des zones non carrées, par exemple). en GDI cest le hardware qui va sen occuper si un hard dédié au graphisme est présent (a priori ca doit pas etre ton cas, mais cest pas bien grave). Dans les cas ca pourrait être plus rapide que ton string. Bref, l'idée de rendre une fois ton texte, puis de le blitter sur la zone ou le dessiner, ca serait probablement plus performant que drawstring, si le "double buffer" comme je te l'ai dis (ok le terme est pas vraiment exact) ne fonctionne pas. Regarde du coté de l'API Win32 BitBlt
3
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
29 juil. 2008 à 12:52
sans code ca va etre difficile de dire quoi que ce soit... je dirais que ton code bouffe trop de ressources, qu'en mode normal ca se voit pas et que tu es à la limite mais qu'en mode portrait tu dépasse les limites et la ca se voit. faudrait voir au moins les parties pertinentes du code
0
cs_tigroux Messages postés 105 Date d'inscription mardi 16 mars 2004 Statut Membre Dernière intervention 22 octobre 2008 16
29 juil. 2008 à 14:38
En fait je fais un draw string toutes les 10 ms à une position X.
Et j'ai un background worker qui incremente cette position X.
Rien de bien compliqué.
0
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
30 juil. 2008 à 10:23
mmmmmmh....je dirais que drawstring est un rendering plutot long, et que si ton appli fait un peu de traitements derrière (ou que ton device a un petit proc et dautres applis qui tournent, etc), ca pourrait être normal. Le fond est-il uni? si oui, fait plutot ton DrawString une seule fois dans un buffer, et ensuite redessine uniquement la partie utile du buffer au bon endroit, tu devrais plus avoir le problème. Apres il existe des moyens plus compliqués mais qui n'en valent pas la peine, un double buffering devrait etre efficace je pense
0

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

Posez votre question
cs_tigroux Messages postés 105 Date d'inscription mardi 16 mars 2004 Statut Membre Dernière intervention 22 octobre 2008 16
30 juil. 2008 à 10:52
Merci pour cette première reponse.
Le probleme est que le fond n'est pas uni, en fait il peux etre personnalisable :(
J'ai bien definit le double buffer aussi mais rien n'y fait en mode portrait c'est vraiment moche.
0
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
30 juil. 2008 à 11:24
Bon bah il te reste le blitting (en utilisant le GDI donc api native BitBlt)...t'auras un algo sous-jacent très performant, mais j'imagine pas de support hardware externe au proc...m'enfin tu devrais quand même y gagner. Mais ca m'étonne...tu n'as pas une tache de fond qui te bouffe toutes tes ressources? fais quand meme voir ton code du dessin (double buffer et drawstring, si tu as les deux)
0
cs_tigroux Messages postés 105 Date d'inscription mardi 16 mars 2004 Statut Membre Dernière intervention 22 octobre 2008 16
30 juil. 2008 à 11:50
Ben dans la même appli j'ai une video et un flash qui tourne en plus du ticker text

alors pour le double buffer je le fais pas à la main j'utilise celui du framework

this.SetStyle(

ControlStyles.UserPaint
|

ControlStyles.AllPaintingInWmPaint
|

ControlStyles.OptimizedDoubleBuffer,
true);

Et dans mon OnPaint je fais:

if (
this.BackgroundImage
!=
null)e

.Graphics
.DrawImage(
this.BackgroundImage, 0, 0);

e

.Graphics
.DrawString(fullTickerText,
this.Font, solid, tickerTextX, tickerTextY);

Je ne connais pas du tout le blitting, tu peux m'eclairer un peu
0
cs_tigroux Messages postés 105 Date d'inscription mardi 16 mars 2004 Statut Membre Dernière intervention 22 octobre 2008 16
30 juil. 2008 à 13:49
En fait mon probleme est que le texte doit appraitre de la facon suivante:
Prenant l'exemple de Hello World:

Hello World - Hello World - ....
Comme tu le vois je dois separer les occurences par des - du coup dans ce que tu me dis il faudrait que je dessine une succession d'image de ma string à la suite.
0
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
30 juil. 2008 à 14:22
non pas forcément, il te suffit d'une image contenant les concaténations, le seul problème étant à quel moment jouer sur l'optique pour faire semblent de faire défiler l'affichage. Par exemple : si les -- représentent ta zone d'affichage (jespere que ca va etre clair) :

-------------
hello- hello - hello
puis
-------------
hello- hello - hello
puis
-------------
hello- hello - hello

-------------
hello- hello - hello

-------------
hello- hello - hello

-------------
hello- hello - hello

-------------
hello- hello - hello

-------------
hello- hello - hello

et enfin, le moment difficile a coder, détecter quand faire semblant d'avoir avancé, alors qu'en fait on a reculé :
-------------
hello- hello - hello

je sais pas si c'est suffisement clair, le tout est davoir ta concaténation suffisament longue pour rentrer entièrement sans bug d'affichage quel que soit le positionnement, et de reculer ta chaine au lieu de l'avancer lorsque tu n'as plus le choix (enfin si jai bien compris ton pb)
0
cs_tigroux Messages postés 105 Date d'inscription mardi 16 mars 2004 Statut Membre Dernière intervention 22 octobre 2008 16
30 juil. 2008 à 15:04
Oui c'est exactement ca.
Je vais tester
Sinon on est bien d'accord pour toi la meilleur solution est de dessiné la string une fois dans une image et ensuite venir la dessiner par dessus quand il faut
0
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
30 juil. 2008 à 15:39
oui, et potentiellement de blitter (mais cest un peu long a mettre en oeuvre, surtout si tu las jamais fait en win32, l'utilisation d'une image buffer en redessinant juste les bonnes zones devrait suffire)
0
cs_tigroux Messages postés 105 Date d'inscription mardi 16 mars 2004 Statut Membre Dernière intervention 22 octobre 2008 16
30 juil. 2008 à 16:39
Ca marche je vais tester ca merci :)
0
Rejoignez-nous