Toon posts:

c# ticker met timer

Pagina: 1
Acties:
  • 104 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ik heb een tekst ticker gemaakt en deze werkt goed alleen zit ik met een gedachte die me niet helemaal lijkt te kloppen.

Ik heb een aparte load functie voor de tekst dus die zal je hier niet zien.
Verder heb ik een timer met interval 1, waar mij dus het probleem lijkt te zitten. 1 ms is denk ik iets te veel van het goede. Maar alleen wanneer ik deze op 1 zet is de snelheid een beetje acceptabel. Anders is hij veel te laat en duurt het veel te lang eer de tekst over het scherm is geweest.
Verder heb ik een override onpaint die de boel plaatst.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
        public TickerControl()
        {            
            //  override the paint
            this.InitializeComponent();
            this.Position = this.Size.Width;
            this.Paint += new PaintEventHandler(overridePaint);

            //  set the timers
            this.TimerTicker = new Timer();
            this.TimerTicker.Tick += new System.EventHandler(this.TimerTickerTick);
            this.TimerTicker.Interval = 1;
            this.TimerTicker.Start();

            //  set the style
            this.SetStyle(
                        ControlStyles.UserPaint |
                        ControlStyles.AllPaintingInWmPaint |
                        ControlStyles.OptimizedDoubleBuffer, true);
        }

        private void overridePaint(object sender, PaintEventArgs e)
        {
            //  Get Graphics Object
            Graphics g = e.Graphics;

            //  Set Font and Color and Brush Object
            Font font = new Font(this.Font.Name, this.Font.Size);
            SolidBrush brush = new SolidBrush(this.ForeColor);

            //  Draw the incoming string
            g.DrawString(this.TextTicker, font, brush, this.Position, 6);
            SizeF s = g.MeasureString(this.TextTicker, font);
            this.TextLength = Convert.ToInt32(s.Width);
        }

        private void TimerTickerTick(object sender, EventArgs e)
        {
            //  check position
            if (this.Position == -25 - this.TextLength) this.TextTicker = "";

            if (this.TextTicker.Length > 0)
            {
                this.Position--;
                this.Invalidate();
            }
            else
            {
                //  check to get content
                if (!this.LoadTicker)
                {
                    this.TextTicker = this.TextLoadTicker;
                    this.Position = this.Size.Width;
                }
                //  load the content
                else
                {
                    this.LoadTickerFeed();
                }
            }
        }


hoe krijg ik nu de tekst sneller laten scrollen zonder dat hij gaat haperen, dit gaat hij doen wanneer ik hem meerdere posities gelijk laat opschuiven.
Of klopt dit toch en kan hij makkelijk de interval van 1 aan.
ben benieuwd...

Verwijderd

code:
1
2
3
//  Set Font and Color and Brush Object
            Font font = new Font(this.Font.Name, this.Font.Size);
            SolidBrush brush = new SolidBrush(this.ForeColor);

offtopic:
Het kan de moeite waard zijn bij functies die vaak worden aangeroepen en waar dit soort objecten nooit veranderen ze ergens te cachen (bijv. als member variabele van je class).


Wat is de cpu load als je dit doet? Timer resolutie onder windows is een stuk lager dan per milliseconde. Meerdere posities opschuiven en een timer gebruiken van 100ms zou realistischer zijn qua systeembelasting. Met die 1ms zou je 1000x per seconde willen hertekenen, en dat lukt natuurlijk nooit.

Verwijderd

Topicstarter
mijn cpu load blijft gelijk aan wat hij was, komt niet boven de 15% uit. Wanneer ik meerdere pixels ga verschuiven krijg je echt stapjes wat ik eigenlijk niet wil. Wil eigenlijk dat hij vloeiend loopt.

  • Flard
  • Registratie: Februari 2001
  • Laatst online: 20-02 21:36
Ik vind het ook wel érg strakke timings die je gebruikt...

Een menselijk oog kijkt normaal volgens mij met iets van 30 fps, en jij wilt iets tekenen met 1000fps...

een interval van 70ms tot 100ms lijkt me meer dan voldoende (zowiezo maak je gebruik van invalidate, waardoor je toch geen enkele garantie hebt dat je maar in de buurt komt van die 1000fps, en werkt het eerder in je nadeel).

Ook kan ik het me heel erg moeilijk voorstel dat je bij een wat hoger fps het verschil kunt zien of je in één frame je tekst één pixel of 3 pixels opschuift. Volgens mij is het zelfs de enige oplossing in een Windows Form.

Verder: als je een cpu-load van gemiddeld 15% hebt doe je denk ik sowiezo al iets goed fout, ik vind meer als 1% al veel voor een simpel tickertje...

Met wat cachen zal het trouwens ook nog wel een fractie sneller gaan... (ik denk alleen niet merkbaar ;) )

Verwijderd

Flard schreef op vrijdag 19 mei 2006 @ 14:32:
Ik vind het ook wel érg strakke timings die je gebruikt...

Een menselijk oog kijkt normaal volgens mij met iets van 30 fps, en jij wilt iets tekenen met 1000fps...

een interval van 70ms tot 100ms lijkt me meer dan voldoende (zowiezo maak je gebruik van invalidate, waardoor je toch geen enkele garantie hebt dat je maar in de buurt komt van die 1000fps, en werkt het eerder in je nadeel).

Ook kan ik het me heel erg moeilijk voorstel dat je bij een wat hoger fps het verschil kunt zien of je in één frame je tekst één pixel of 3 pixels opschuift. Volgens mij is het zelfs de enige oplossing in een Windows Form.
Die 1000fps haalt 'ie ook niet. De timer post een event op de message queue van je applicatie, die na het tekenen gewoon weer in slaap is gevallen. Pas bij de eerst volgende process schedule komt je proces weer aan de beurt voor een teken ronde. In het meest gunstige geval gebeurt dat (volgens mij) hooguit honderd keer per seconde en meestal nog een heel stuk minder.

Zolang je gebruik maakt van GDI+ (en windows forms gebruikt dat) zal je nooit perfect soepele animatie kunnen krijgen en hoe sneller je wilt gaan, hoe meer het op valt dat de timing niet helemaal regelmatig is (en ook hoe onregelmatiger de timing zal zijn). Met een timer van 100ms heb je een update rate van 10 frames per seconde; dat is iets wat je PC makkelijk bij houdt en als het goed is heel regelmatig kan afhandelen. Je moet dan inderdaad wel je ticker met stapjes laten werken, maar als alle stapjes even groot zijn geloof ik nooit dat dat heel storend is. Misschien dat je timers ook nog regelmatiger werken als je een meervoud neemt van windows' eigen timer resolutie maar dat weet ik niet zeker.
Verder: als je een cpu-load van gemiddeld 15% hebt doe je denk ik sowiezo al iets goed fout, ik vind meer als 1% al veel voor een simpel tickertje...
Idem.
Pagina: 1