Eigener Gadget.
Übersicht

![]() |
Mathias-KwiatkowskiBetreff: Eigener Gadget. |
![]() Antworten mit Zitat ![]() |
---|---|---|
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: 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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: 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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
|
||
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe |
![]() |
Mathias-Kwiatkowski |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group