Ik ben bezig om een Terminal Emulator te maken om onze applicatie in te draaien.
Het communicatie protocol is Pick PC console welke helaas maar door enkele emulators wordt ondersteund.
We bouwen de emulator zodat we meer windows windows elementen kunnen toevoegen zonder dat we de gebruikers storen met andere applicaties.
De emulatie zelf is geen probleem dit is reeds voor elkaar.
Ook het weergeven / opbouwen van het scherm werkt tegen een acceptable snelheid echter het CPU gebruikt is erg hoog als er meerdere scherm wijzigingen zijn in korte tijd.
In het hoofdmenu van onze applicatie waar een klok en een ticker lopen loopt het cpu gebruik op tot 30%.
Na wat zoek werk blijkt het puur in het scherm opbouwen te zitten. Zet ik de paints uit zakt het verbruik naar 0-2 %.
Wat code die we gebruiken:
We gebruiken path om de letters mooi te laten aansluiten, met drawstring is dit bijna niet te doen.
Echter zit daar ook het probleem, het gebruik van Paths op deze manier is erg zwaar.
Is er een manier om dit te versnellen?
Kan ik het rekenwerk verplaatsen naar de GPU?
Iedere letter wordt appart getekend omdat elke letter een verschillende voor en achtergrond kleur kan hebben.
Elke scherm wijziging krijgt bijbehorende invalidate region meegestuurd.
Om een beeld te vormen van de applicatie:
De omcircelde stukken worden 2x per seconde vernieuwt.
"Û" is een effe gekleurd blokje
Het communicatie protocol is Pick PC console welke helaas maar door enkele emulators wordt ondersteund.
We bouwen de emulator zodat we meer windows windows elementen kunnen toevoegen zonder dat we de gebruikers storen met andere applicaties.
De emulatie zelf is geen probleem dit is reeds voor elkaar.
Ook het weergeven / opbouwen van het scherm werkt tegen een acceptable snelheid echter het CPU gebruikt is erg hoog als er meerdere scherm wijzigingen zijn in korte tijd.
In het hoofdmenu van onze applicatie waar een klok en een ticker lopen loopt het cpu gebruik op tot 30%.
Na wat zoek werk blijkt het puur in het scherm opbouwen te zitten. Zet ik de paints uit zakt het verbruik naar 0-2 %.
Wat code die we gebruiken:
Visual Basic .NET:
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
61
62
63
64
65
66
67
| Protected Overloads Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs) Dim bt As DateTime = Now Me.Redraw(e.Graphics, e.ClipRectangle) Me.ShowCaret(e.Graphics) Console.WriteLine(Now.ToString("HH:mm:ss:fffff") & " " & (e.ClipRectangle.IsEmpty) & " " & Now.Subtract(bt).TotalMilliseconds & " " & e.ClipRectangle.Width & " X " & e.ClipRectangle.Height) MyBase.OnPaint(e) End Sub Private Sub Redraw(ByVal CurGraphics As System.Drawing.Graphics, ByVal rect As Rectangle) Dim CurPoint As System.Drawing.PointF Dim CurChar As System.Char For Y As System.Int32 = 0 To Me._rows - 1 For X As System.Int32 = 0 To Me._cols - 1 CurChar = Me.charGrid(Y)(X) If CurChar = ControlChars.NullChar Then CurChar = " " End If CurPoint = New System.Drawing.PointF(X * Me.CharSize.Width, Y * Me.CharSize.Height) If not rect.IsEmpty Then If Not rect.Contains(Point.Ceiling(CurPoint)) Then Continue For End If Me.ShowChar(CurGraphics, CurChar, CurPoint.Y, CurPoint.X, Me.attribGrid(Y)(X)) Next Next End Sub Private Sub ShowChar(ByVal CurGraphics As System.Drawing.Graphics, ByVal CurChar As System.Char, ByVal Y As System.Single, ByVal X As System.Single, ByVal CurAttribs As uc_CharAttrib) If CurChar = ControlChars.NullChar Then CurChar = " " End If Dim CurFGColor As System.Drawing.Color = System.Drawing.Color.White Dim CurBGColor As System.Drawing.Color = System.Drawing.Color.Black Dim blink As Boolean = False If CurAttribs IsNot Nothing Then CurFGColor = CurAttribs.foreColor CurBGColor = CurAttribs.backColor blink = CurAttribs.isBlinking End If Dim sFormat As New StringFormat(StringFormat.GenericTypographic) sFormat.Alignment = StringAlignment.Near sFormat.LineAlignment = StringAlignment.Near sFormat.Trimming = StringTrimming.None Dim path As New Drawing2D.GraphicsPath path.AddString("Û", Me.Font.FontFamily, 0, Me.Font.Size, New PointF(X - Me.drawStringOffset.X, Y - Me.drawStringOffset.Y), sFormat) CurGraphics.DrawPath(New Drawing.Pen(CurBGColor), Path) CurGraphics.FillPath(New SolidBrush(CurBGColor), Path) If blink And Me._BlinkVisible = False Then Exit Sub Path.Reset() Path.AddString(CurChar.ToString(), Me.Font.FontFamily, 0, Me.Font.Size, New PointF(X - Me.drawStringOffset.X, Y - Me.drawStringOffset.Y), sFormat) CurGraphics.FillPath(New SolidBrush(CurFGColor), Path) Threading.Thread.Sleep(0) End Sub |
We gebruiken path om de letters mooi te laten aansluiten, met drawstring is dit bijna niet te doen.
Echter zit daar ook het probleem, het gebruik van Paths op deze manier is erg zwaar.
Is er een manier om dit te versnellen?
Kan ik het rekenwerk verplaatsen naar de GPU?
Iedere letter wordt appart getekend omdat elke letter een verschillende voor en achtergrond kleur kan hebben.
Elke scherm wijziging krijgt bijbehorende invalidate region meegestuurd.
Om een beeld te vormen van de applicatie:

De omcircelde stukken worden 2x per seconde vernieuwt.
"Û" is een effe gekleurd blokje
Heeft uw auto pijn? Ga dan naar de onderdelenlijn
Het bedrijf waar ik met veel plezier werk - Mijn eigen vertrouwde domein