Eigener Gadget.

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

Mathias-Kwiatkowski

Betreff: Eigener Gadget.

BeitragMo, Okt 07, 2013 11:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi Leute, ich bin ja immer noch dabei mein Chat zu Programmieren, diesmal möchte ich in Sachen Performance etwas basteln, ohne ein Image zu nutzen. Ich habe mir da eine Möglichkeit ausgedacht, und möchte bitten diese euch anzusehen, und zu beurteilen wie ihr diese Methode findet. Kern ist das Rendern vom Chat Text.

Der Code hier lässt sich Kopieren und in Max einfügen um ein Test durchlaufen zu können, es werden keine Bilder benötigt.

Danke im Voraus, nett wäre es wenn ihr mir mitteilen könntet ob CPU mäßig so Ok ist. Oder ob dennoch alle Ressourcen verbraucht werden.

Code: [AUSKLAPPEN]
SuperStrict
Import maxgui.drivers

Global ChatGadgetList:TList = New TList
Type TChat
   Field X:Int, Y:Int, W:Int, H:Int
   Field TX:Int, TY:Int, TW:Int, TH:Int
   Field Canvas:TGadget
   
   Field Text:TList
   Field Child:TChat
   
   Field Render:Int, TempRender:Int
   
   Field BackgroundColor:Int[3], RahmenColor:Int[3]
   Field AbZeile:Int
   
   Method GadgetLayout(X:Int, W:Int, Y:Int, H:Int)
      SetGadgetLayout(Self.Canvas, X, W, Y, H)
   End Method
   
   Method ADDText(von:String, Text:String, Datum:String, Uhrzeit:String, TextR:Int = 0, TextG:Int = 0, TextB:Int = 0, NameR:Int = 0, NameG:Int = 0, NameB:Int = 255, DatumUhrR:Int = 255, DatumUhrG:Int = 0, DatumUhrB:Int = 0)
      Local E:TChatText = New TChatText
      E.von = von
      E.Text = Text
      E.Datum = Datum
      E.Uhrzeit = Uhrzeit
      E.TextColor[0] = TextR
      E.TextColor[1] = TextG
      E.TextColor[2] = TextB
      E.NameColor[0] = NameR
      E.NameColor[1] = NameG
      E.NameColor[2] = NameB
      E.DatumUhr[0] = DatumUhrR
      E.DatumUhr[1] = DatumUhrG
      E.DatumUhr[2] = DatumUhrB
      Self.Text.AddLast E
      Self.Render = 1
   End Method
End Type
Type TChatText
   Field Von:String, Datum:String, Uhrzeit:String, Text:String, TextColor:Int[3], NameColor:Int[3], DatumUhr:Int[3]
End Type

Function CreateTChat:TChat(X:Int, Y:Int, W:Int, H:Int, Gadget:TGadget, BG_R:Int = 0, BG_G:Int = 0, BG_B:Int = 0, Rahmen_R:Int = 255, Rahmen_G:Int = 255, Rahmen_B:Int = 255)
   Local C:TChat = New TChat
   C.X = X
   C.Y = Y
   C.W = W
   C.H = H
   C.BackgroundColor[0] = BG_R
   C.BackgroundColor[1] = BG_G
   C.BackgroundColor[2] = BG_B
   C.RahmenColor[0] = Rahmen_R
   C.RahmenColor[1] = Rahmen_G
   C.RahmenColor[2] = Rahmen_B
   C.Canvas = CreateCanvas(X, Y, W, H, Gadget)
   SetGadgetLayout (C.Canvas, 1, 1, 1, 1)
   C.Text = New TList
   C.Child = C
   C.Render = 1
   ChatGadgetList.AddLast C
   Return C
End Function

Function Draw_TChat()
   For Local TC:TChat = EachIn ChatGadgetList
      If GadgetX(TC.Canvas) <> TC.tX Then TC.Render = 1
      If GadgetY(TC.Canvas) <> TC.ty Then TC.Render = 1
      If ClientWidth(TC.Canvas) <> TC.tw Then TC.Render = 1
      If ClientHeight(TC.Canvas) <> TC.th Then TC.Render = 1
      
      If TC.Render = 1 Then
         SetGraphics CanvasGraphics(TC.Canvas)
         SetViewport 0, 0, ClientWidth(TC.Canvas), ClientHeight(TC.Canvas)
         SetBlend ALPHABLEND
         SetAlpha 1
         Cls
         
         SetColor TC.RahmenColor[0], TC.RahmenColor[1], TC.RahmenColor[2]
         DrawRect 0, 0, ClientWidth(TC.Canvas), ClientHeight(TC.Canvas)
         SetColor TC.BackgroundColor[0], TC.BackgroundColor[1], TC.BackgroundColor[2]
         DrawRect 1, 1, ClientWidth(TC.Canvas) - 2, ClientHeight(TC.Canvas) - 2
         
         SetColor 255, 255, 255
         
         'So nun wird erst einmal vorgerandert ( Die Chat ausgabe )
         Local Wort:String, Buchstabe:String, Position:Int, ZeigeAbZeile:Int = tc.AbZeile, Lange:Int, Weite:Int = 2, YText:Int = -(TextHeight("W") * tc.AbZeile), TempWeite:Int, Zeilen:Int, MaxZeilen:Int = ClientHeight(tc.Canvas) / TextHeight("W"), ColorT:Int = 0
         Local UhrWeite:Int = TextWidth("[ XX:XX:XX ]")
         Local DatWeite:Int = TextWidth("( XXXXXXXXXXX )")
         For Local T:TChatText = EachIn TC.Text
            Position = 1
            Lange = Len(T.Text)
            Weite = 2
            
            SetColor 120, 120, 120
            If ColorT = 0 Then SetAlpha 0.1
            If ColorT = 1 Then SetAlpha 0.0
            DrawRect (1, YText + 1, ClientWidth(TC.Canvas) - 2, TextHeight("W"))
            
            'DrawLine 0, YText - 1, ClientWidth(TC.Canvas), YText - 1
            SetAlpha 0.8
            SetColor T.NameColor[0], T.NameColor[1], T.NameColor[2]
            DrawText T.Von, 2, YText
            SetColor T.DatumUhr[0], T.DatumUhr[1], T.DatumUhr[2]
            SetAlpha 0.5
            DrawText "[ " + T.Uhrzeit + " ]", ClientWidth(TC.Canvas) - UhrWeite - 2, YText
            DrawText "( " + T.Datum + " )", ClientWidth(TC.Canvas) / 2 - DatWeite / 2, YText
                                                
            YText = YText + TextHeight("W") Zeilen = Zeilen + 1
            
            SetColor 120, 120, 120
            If ColorT = 0 Then SetAlpha 0.1
            If ColorT = 1 Then SetAlpha 0.0
            DrawRect (1, YText + 1, ClientWidth(TC.Canvas) - 2, TextHeight("W"))
                  
            Repeat
               Buchstabe = Mid(T.Text, Position, 1)
               Wort = Wort + Buchstabe
               TempWeite = Weite + TextWidth(Wort)
   
               If TempWeite > ClientWidth(TC.Canvas) - 4 Then
                  Weite = 2
                  Zeilen = Zeilen + 1
                  YText = YText + TextHeight("W")
                  
                  SetColor 120,120,120
                  If ColorT = 0 Then SetAlpha 0.1
                  If ColorT = 1 Then SetAlpha 0.0
                  DrawRect (1, YText + 1, ClientWidth(TC.Canvas) - 2, TextHeight("W"))
               End If
               
               If Buchstabe = " " Or Buchstabe = "" Then
                  SetAlpha 0.6
                  SetColor T.TextColor[0], T.TextColor[1], T.TextColor[2]
                  DrawText Wort, Weite, YText
                  Weite = Weite + TextWidth(Wort)
                  Wort = ""
               End If
               
               If Position > Lange Then Exit
               Position = Position + 1
            Forever
            YText = YText + TextHeight("W")
            Zeilen = Zeilen + 1
         
            If ColorT = 0 Then
               ColorT = 1
            Else
               ColorT = 0
            End If
         Next
         
                  
         Flip
         If TC.TempRender >= 2 Then TC.Render = 0 TC.TempRender = 0
         TC.TempRender = TC.TempRender + 1
         TC.TX = GadgetX(TC.Canvas)
         TC.TY = GadgetY(TC.Canvas)
         TC.TW = ClientWidth(TC.Canvas)
         TC.TH = ClientHeight(TC.Canvas)
         Durchgang = Durchgang + 1
         
         TC.AbZeile = Zeilen - MaxZeilen
         If TC.AbZeile < 0 Then TC.AbZeile = 0
      EndIf
   Next
End Function

Function Redraw_TChat()
   For Local TC:TChat = EachIn ChatGadgetList
      RedrawGadget TC.Canvas
   Next
End Function


Local MainWindow:TGadget = CreateWindow("Chat_Test", 0, 0, 640, 480, Desktop(), WINDOW_TITLEBAR | WINDOW_RESIZABLE)
Local ChatAnzeige:TChat = createtchat(10, 10, 600, 420, mainwindow, 200, 190, 230, 128, 128, 192)

For Local TMP:Int = 0 To 15
ChatAnzeige.ADDText("Mathias", "Hallo das wird ein langer testeintrag, um zu sehen ob es wirklich funktioniert, also auch der Zeilenumbruch muss richtig klappen, ansonsten nützt das ganze nicht wirklich viel ;) nun bin ich mal gespannt.", CurrentDate(), CurrentTime(), 0, 0, 0, 0, 128, 192, 255, 0, 0)
ChatAnzeige.ADDText("Mathias", "Scheinbar hat das ganze schon hand und Fuß.", CurrentDate(), CurrentTime(), 0, 0, 0, 0, 128, 192, 255, 0, 0)
Next
ChatAnzeige.ADDText("Mathias", "ENDE.", CurrentDate(), CurrentTime(), 0, 0, 0, 0, 128, 192, 255, 0, 0)
Global Durchgang:Int = 0


Local Timer:Int = MilliSecs(), WeitererEintrag:Int = 0
Local Durchlauf:Int
CreateTimer(60)
Repeat
   If MilliSecs () - Timer > 999 * 5 Then
      Timer = MilliSecs()
      WeitererEintrag = WeitererEintrag + 1
      ChatAnzeige.ADDText("Mathias", "Und wieder sind 5 Sekunden Rum, das bedeutet das nun ein eintrag erfolgen kann oder? Eintrag: " + WeitererEintrag, CurrentDate(), CurrentTime(), 0, 0, 0, 0, 128, 192, 255, 0, 0)
   End If
   Local tmpGadget:Tgadget
   Select WaitEvent()
      Case EVENT_MENUACTION
         
      Case EVENT_MOUSEDOWN
         tmpGadget = TGadget(EventSource())
         'TRoom.MDown(tmpGadget)
      Case EVENT_MOUSEUP
         'TRoom.MUp
      Case EVENT_MOUSEMOVE
           tmpGadget = TGadget(EventSource())
         'TRoom.MouseUpdate(tmpGadget)
      Case EVENT_TIMERTICK
         Redraw_TChat
         
      Case EVENT_GADGETPAINT
         Draw_TChat
         
      Case EVENT_GADGETACTION                  ' interacted with gadget
         'TRoom.GadgetAction
      Case EVENT_GADGETSELECT
         
      Case EVENT_WINDOWCLOSE                  ' close gadget
         tmpGadget = TGadget(EventSource())
         If tmpGadget = MainWindow Then Exit
   End Select
   
   
   
   If Durchgang <> Durchlauf Then Print Durchgang Durchlauf = Durchgang
Forever

End
Skype: Anarchie1984
http://projektworks.de/maxbase/
Icq - Erneuert am 21.08.2017
Yahoo - Erneuert am 21.08.2017

Midimaster

BeitragMo, Okt 07, 2013 16:06
Antworten mit Zitat
Benutzer-Profile anzeigen
diesmal ist ein keine "großer wurf". Du sparst hier nur "scheinbar" Performance, weil du kein regelmäßiges Redrawen erlaubst. Zieh mal kurz ein anderes Fenster über das Chatfenster....

Ergo... Du musst auch bei Events neu Redrawen können. Dann aber dauert deine Routine zulange. Denn Du schreibst bei jedem Redraw doch wieder alles neu. Auch ein sanftes Scrollen wäre so unmöglich.

Ich habe sowas ähnliches unter Monkey schon gemacht. Auch hier ist jeder Textblock ein eigener Typ. Allerdings grabbe ich den neu hinzukommenden Block und erzeuge daraus ein eigenes kleines Image.

In allen FLIPS, wo nichts neues hinzukommt, lasse ich dann nur diese Images untereinander malen.
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

Mathias-Kwiatkowski

BeitragMo, Okt 07, 2013 18:20
Antworten mit Zitat
Benutzer-Profile anzeigen
also. bei mir passiert nichts wenn ich fenster drüber ziehe oder sowas...
redraw wird immer erlaubt, ich rander nur nicht ewig neu.

-Fazit Redraw = Immer
-FLip =Nicht immer, so nach dem motto wenn einmal alles gerandert ist, warum neu randern lassen

kleines bsp was demnach auch möglich wäre unabhängig von der maxgui

Code: [AUSKLAPPEN]
Graphics 800,600

Cls
SetColor 255,0,0
DrawRect 50,50,150,300

Flip

WTimer=CreateTimer(60)
Repeat
   WaitTimer WTimer
Until AppTerminate()
End


immer wenn sich im gadget etwas verändert wird einmal neu gerandert. bzw 2 mal, aber denke das ist auszuhalten Wink

problem wird dabei sein, wenn ein anderes DirectX vollbild oder programm drüber gelagert wird demnach müsste ich es auch einmalig neu randern lassen wenn das programm vom inaktiven stand wieder zum aktiven stand wechselt
seh ich das richtig?

dann müsste ich nur herrausfinden wie ich es meistere abzufragen ob mein prog grad aktiv oder inaktiv ist
Skype: Anarchie1984
http://projektworks.de/maxbase/
Icq - Erneuert am 21.08.2017
Yahoo - Erneuert am 21.08.2017

Midimaster

BeitragMo, Okt 07, 2013 19:58
Antworten mit Zitat
Benutzer-Profile anzeigen
user posted image
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

Mathias-Kwiatkowski

BeitragDi, Okt 08, 2013 6:33
Antworten mit Zitat
Benutzer-Profile anzeigen
oh okey, passiert bei mir aus irgendwelchen gründen nicht.
.-.
Skype: Anarchie1984
http://projektworks.de/maxbase/
Icq - Erneuert am 21.08.2017
Yahoo - Erneuert am 21.08.2017

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group