[OS X]Window Server sehr hohe last.

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

 

FWeinb

ehemals "ich"

Betreff: [OS X]Window Server sehr hohe last.

BeitragDo, Mai 10, 2012 17:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe ein komisches Verhalten des WindowServers beobachtet, wenn ich ein Programm mithilfe der MaxGUI schreibe, dann kommt es zu einer sehr hohen last.

Hier der Code:
BlitzMax: [AUSKLAPPEN]
SuperStrict

Import maxgui.drivers

SetGraphicsDriver(GLMax2DDriver())

Local window:TGadget = CreateWindow("Test", 100,100,400,400,Null, WINDOW_CLIENTCOORDS | WINDOW_TITLEBAR)
Local canvas:TGadget = CreateCanvas(0,0,400,400,window)

SetGraphics CanvasGraphics(canvas)


CreateTimer(60)
Repeat
Cls
WaitEvent()
Select CurrentEvent.id
Case EVENT_APPTERMINATE
End
End Select

DrawRect 20,20,100,100
Flip
Forever



Wenn das ganze ohne die MaxGUI gemacht wird läuft alles OK.

BlitzMax: [AUSKLAPPEN]
Graphics 800,600,0


CreateTimer(60)
Repeat
Cls
WaitEvent()
Select CurrentEvent.id
Case EVENT_APPTERMINATE
End
End Select

DrawRect 20,20,100,100
Flip
Forever



Ich denke mal, das es daran liegt, das bei jedem Flip irgendwie das komplette Fenster erneuert wird. Ich weiß aber leider nicht wie ich das beheben könnte.

Wäre dankbar für jede Hilfe.


MfG
ich
"Wenn die Menschen nur über das sprächen, was sie begreifen, dann würde es sehr still auf der Welt sein." Albert Einstein (1879-1955)
"If you live each day as if it was your last, someday you'll most certainly be right." Steve Jobs

BladeRunner

Moderator

BeitragDo, Mai 10, 2012 18:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Du solltest nur repainten lassen wenn ein Anlass dafür vorliegt.
Siehe dazu unter EVENTS (EVENT_GADGETPAINT).
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

FWeinb

ehemals "ich"

BeitragDo, Mai 10, 2012 19:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Doch leider ist das nicht möglich, da auf dem Canvas ein Spiel laufen soll, also müsste dies schon wirklich 60 mal die Sekunde aktualisiert werden.

In dem mit Graphics erzeugen Fenster ist das ja auch möglich.

MfG
ich
"Wenn die Menschen nur über das sprächen, was sie begreifen, dann würde es sehr still auf der Welt sein." Albert Einstein (1879-1955)
"If you live each day as if it was your last, someday you'll most certainly be right." Steve Jobs

Holzchopf

Meisterpacker

BeitragDo, Mai 10, 2012 19:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Der App-Aufbau so ist nicht ideal. So zeichnest du nach jedem Event, das ankommt. Nötig wäre das Neuzeichnen allerdings nur 60x die Sekunde.

BlitzMax: [AUSKLAPPEN]
SuperStrict

Import maxgui.drivers

SetGraphicsDriver(GLMax2DDriver())

Local window:TGadget = CreateWindow("Test", 100,100,400,400,Null, WINDOW_CLIENTCOORDS | WINDOW_TITLEBAR)
Local canvas:TGadget = CreateCanvas(0,0,400,400,window)

CreateTimer(60)
Repeat
WaitEvent()
Select CurrentEvent.id
' timer tickt, also zeichnen wir neu
Case EVENT_TIMERTICK
' grafik-kontext setzen,
SetGraphics CanvasGraphics(canvas)
' ... drauf los zeichnen
Cls
DrawRect 20,20,100,100
' ... und Flip async aufrufen
Flip 0
Case EVENT_APPTERMINATE, EVENT_WINDOWCLOSE
End
End Select
Forever


Oh - und Flip 0 nicht vergessen Wink

mfG
Holzchopf
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm

ZEVS

BeitragDo, Mai 10, 2012 19:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
SetGraphicsDriver(GLMax2DDriver())

Windows + OpenGL = evtl. suboptimal.
Dein Graphics-Programm stellt keinen Graphiktreiber ein, deshalb wird DX9 genommen, was auf Windows evtl. schneller ist. So wirst du natürlich kein realistisches Ergebnis erhalten.

ZEVS
 

FWeinb

ehemals "ich"

BeitragDo, Mai 10, 2012 19:52
Antworten mit Zitat
Benutzer-Profile anzeigen
@ZEVS
Da auf dem Mac kein DX9 zur Verfügung steht, macht das keinen Unterschied.

@Holzchopf
Auch diese Änderung lässt den WindowServer immer noch bei 10-15% CPU last pendeln.

Danke für die Hilfe.

[Edit]
Selbst das Beispiel aus der Doku für CreateCanvas erzeugt 50% WindowServer last.
BlitzMax: [AUSKLAPPEN]
Import MaxGui.Drivers

SuperStrict



SetGraphicsDriver(GLMax2DDriver())



Global GAME_WIDTH:Int=320
Global GAME_HEIGHT:Int=240

' create a centered window with client size GAME_WIDTH,GAME_HEIGHT

Local wx:Int=(ClientWidth(Desktop())-GAME_WIDTH)/2
Local wy:Int=(ClientHeight(Desktop())-GAME_HEIGHT)/2

Local window:TGadget=CreateWindow("My Canvas",wx,wy,GAME_WIDTH,GAME_HEIGHT,Null,WINDOW_TITLEBAR|WINDOW_CLIENTCOORDS)

' create a canvas for our game

Local canvas:TGadget=CreateCanvas(0,0,320,240,window)

' create an update timer

CreateTimer 60

While WaitEvent()
Select EventID()
Case EVENT_TIMERTICK
RedrawGadget canvas

Case EVENT_GADGETPAINT
SetGraphics CanvasGraphics(canvas)
SetOrigin 160,120
SetLineWidth 5
Cls
Local t:Int=MilliSecs()
DrawLine 0,0,120*Cos(t),120*Sin(t)
DrawLine 0,0,80*Cos(t/60),80*Sin(t/60)
Flip

Case EVENT_MOUSEMOVE
Print "MOVE!"

Case EVENT_WINDOWCLOSE
FreeGadget canvas
End

Case EVENT_APPTERMINATE
End
End Select
Wend



MfG
ich
 

jsp

BeitragDo, Mai 10, 2012 21:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du
Case EVENT_TIMERTICK
RedrawGadget canvas

ausführst wird bei jedem event das Gadget neu gezeichnet, aber eigentlich soll nur der Inhalt upgedatet werden.

So wie Holzchopf das im Beispiel hatte war das eleganter.

Ich würde die Befehle unter Gadgetpaint in eine Funktion schreiben und diese dann je nötigen Event aufrufen.
Unter: SetGraphics CanvasGraphics(canvas)
fehlt mir eigentlich auch ein: SetViewport 0,0,GadgetWidth( Canvas ),GadgetHeight( Canvas )

Probier doch mal ob das besser läuft

Code: [AUSKLAPPEN]
Import MaxGui.Drivers

SuperStrict



SetGraphicsDriver(GLMax2DDriver())



Global GAME_WIDTH:Int=320
Global GAME_HEIGHT:Int=240

' create a centered window with client size GAME_WIDTH,GAME_HEIGHT

Local wx:Int=(ClientWidth(Desktop())-GAME_WIDTH)/2
Local wy:Int=(ClientHeight(Desktop())-GAME_HEIGHT)/2

Local window:TGadget=CreateWindow("My Canvas",wx,wy,GAME_WIDTH,GAME_HEIGHT,Null,WINDOW_TITLEBAR|WINDOW_CLIENTCOORDS)

' create a canvas for our game

Global canvas:TGadget=CreateCanvas(0,0,320,240,window)

' create an update timer

CreateTimer 60

While WaitEvent()
   Select EventID()
      Case EVENT_TIMERTICK
         Redraw()

      Case EVENT_GADGETPAINT
         Redraw()
      Case EVENT_MOUSEMOVE
         Print "MOVE!"

      Case EVENT_WINDOWCLOSE
         FreeGadget canvas
         End

      Case EVENT_APPTERMINATE
         End
   End Select
Wend

Function Redraw()
   SetGraphics CanvasGraphics(canvas)
   SetViewport 0,0,GadgetWidth( Canvas ),GadgetHeight( Canvas )
   SetOrigin 160,120
   SetLineWidth 5
   Cls
   Local t:Int=MilliSecs()
   DrawLine 0,0,120*Cos(t),120*Sin(t)
   DrawLine 0,0,80*Cos(t/60),80*Sin(t/60)
   Flip

End Function
Logic Gui Professional a Gui Designer for MaxGui
 

FWeinb

ehemals "ich"

BeitragDo, Mai 10, 2012 22:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Das macht leider auch keinen Unterschied. Meine einzige Vermutung ist, das OS X irgend welche Events feuert wenn die Grafik im Canvas aktualisiert wird, den bei der Variante nur mit Graphics liegt der WindowServer bei c.a. 2-4% last. Bei der mit der MaxGUI bei 10-20%

MfG
ich
"Wenn die Menschen nur über das sprächen, was sie begreifen, dann würde es sehr still auf der Welt sein." Albert Einstein (1879-1955)
"If you live each day as if it was your last, someday you'll most certainly be right." Steve Jobs

AnniXa

BeitragDo, Mai 10, 2012 23:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Alternativ geht es auch mit peekevent() anstelle eines timerevents:

Code: [AUSKLAPPEN]

Repeat
    while PeekEvent()
    WaitEvent()
    Select CurrentEvent.id
            Case EVENT_APPTERMINATE
         End
      End Select      
    EndSelect
    Wend

    DrawRect 20,20,100,100
    Flip(1)

Forever

End


wird sicher auch nicht besser sein, aber ein versuch ist es ja wert
|moonForge|
Ich bin Pokémon Meisterin seit 1998!

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group