GLMax2dDriver() oder doch ganz anders?

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

 

OldSkool90

Betreff: GLMax2dDriver() oder doch ganz anders?

BeitragMo, Feb 22, 2010 22:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hätte da mal eine kleine bescheidene Frage.
Und zwar würde ich gerne wissen, ob es eine Alternative zum BMax OpenGL treiber gibt? Vielleicht irgendein Modul das um einiges schneller ist? Ich such mich dumm und dämlich, aber finde leider nichts =/
Hoffe ihr könnt mir da weiterhelfen^^

BladeRunner

Moderator

BeitragMo, Feb 22, 2010 22:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hatte mit dem OGl-Treiber als solches noch keine Performanceprobleme. Die Implementierung von Max2D ist recht grottig, aber der Treiber selbst ist doch okay.
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
 

OldSkool90

BeitragMo, Feb 22, 2010 22:17
Antworten mit Zitat
Benutzer-Profile anzeigen
hmm dann muss es mein sourcecode sein, der so langsam is...ich versuche immernoch meine schatten"berechnung" voranzutreiben, aber bei 50 schatten und schattenquellen sinken die fps unter 30...bei einer auflösung von 1680x1050
und bei 200 hängt sich das programm auf.

mpmxyz

BeitragMo, Feb 22, 2010 22:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich wiederhole mich mal:
Es liegt an der "DrawPoly"-Funktion.
Die ist ziemlich lahm und kaum optimierbar.
Wenn man einige Aufrufe davon in deinem Code auskommentiert, wird dieser spürbar schneller.
mfG
mpmxyz
leichtes Offtopic: Ich finde die Implementierung von GLMax2D bis auf die Tatsache mit der glBegin/glEnd- und der Texturenverschwendung ganz Ok.
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

BladeRunner

Moderator

BeitragMo, Feb 22, 2010 22:33
Antworten mit Zitat
Benutzer-Profile anzeigen
ja, aber diese kleinigkeiten sind es die max total ausbremsen, was sehr schade ist.
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
 

OldSkool90

BeitragMo, Feb 22, 2010 22:37
Antworten mit Zitat
Benutzer-Profile anzeigen
hä? achja kannst du ja garnicht wissen. ich habe drawpoly durch gl_quads ersetzt...quad_strips wären natürlich schneller aber die versteh ich irgendwie nich ganz^^
und ich frage jetz immer ab an welcher position sich das licht relativ zum objekt befindet und lasse nur relevante quads zeichnen.

trotzdem kaum schneller o.O

BladeRunner

Moderator

BeitragMo, Feb 22, 2010 22:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Ohne Code...
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
 

OldSkool90

BeitragMo, Feb 22, 2010 22:42
Antworten mit Zitat
Benutzer-Profile anzeigen
ja ich weiss xD moment...is aber alles ziemlich wirr Very Happy
EDIT:sry das war der alte code^^
Code: [AUSKLAPPEN]
SuperStrict

Global gx:Int,gy:Int,a:Int
Global LineToggle:Int = 0

gx = 1024
gy = 768

Global WallList:TList = CreateList()

Type LightSource
   Field x1:Int
   Field x2:Int
   Field y1:Int
   Field y2:Int
   Field xSrc:Float
   Field ySrc:Float
   Field xDir1:Float
   Field yDir1:Float
   Field xDir2:Float
   Field yDir2:Float
   Field VertexLO1:Int
   Field VertexRO1:Int
   Field VertexRU1:Int
   Field VertexLU1:Int
   Field VertexLO2:Int
   Field VertexRO2:Int
   Field VertexRU2:Int
   Field VertexLU2:Int
      
   Method DrawLightSource()
      DrawOval x1,y1,(x2-x1),(y2-y1)
   EndMethod
   
   Method DrawLightDirection()
      For Local Entity:Wall = EachIn WallList
         xDir1 = Entity.x1
         yDir1 = Entity.y1
         xDir2 = Entity.x2
         yDir2 = Entity.y2
                  
      If LineToggle = 1
      If (xSrc >= xDir1 And ySrc <= yDir1) Or (xSrc <= xDir1 And ySrc >= yDir1)
         DrawLine xSrc,ySrc,(xDir1+(xDir1-xSrc)*500),(yDir1+(yDir1-ySrc)*500)
      EndIf
      If (xSrc <= xDir2 And ySrc <= yDir1) Or (xSrc >= xDir2 And ySrc >= yDir1)
         DrawLine xSrc,ySrc,(xDir2+(xDir2-xSrc)*500),(yDir1+(yDir1-ySrc)*500)
      EndIf
      If (xSrc >= xDir2 And ySrc <= yDir2) Or (xSrc <= xDir2 And ySrc >= yDir2)
         DrawLine xSrc,ySrc,(xDir2+(xDir2-xSrc)*500),(yDir2+(yDir2-ySrc)*500)
      EndIf
      If (xSrc <= xDir1 And ySrc <= yDir2) Or (xSrc >= xDir1 And ySrc >= yDir2)
         DrawLine xSrc,ySrc,(xDir1+(xDir1-xSrc)*500),(yDir2+(yDir2-ySrc)*500)
      EndIf
      EndIf
      
      If LineToggle = 0
      SetBlend (ALPHABLEND)
      SetAlpha 0.5
         glColor3f(0.35,0.35,0.35)
      glBegin (GL_QUADS)
      If (xSrc >= xDir2 And ySrc <= yDir1)
         glVertex2f xDir1,yDir1
         glVertex2f xDir1+(xDir1-xSrc)*500,yDir1+(yDir1-ySrc)*500
         glVertex2f xDir1+(xDir1-xSrc)*500,yDir2+(yDir2-ySrc)*500
         glVertex2f xDir1,yDir2
         
         glVertex2f xDir1,yDir2
         glVertex2f xDir1+(xDir1-xSrc)*500,yDir2+(yDir2-ySrc)*500
         glVertex2f xDir2+(xDir2-xSrc)*500,yDir2+(yDir2-ySrc)*500
         glVertex2f xDir2,yDir2
      EndIf
      If (xSrc <= xDir1 And ySrc <= yDir1)
         glVertex2f xDir2,yDir1
         glVertex2f xDir2+(xDir2-xSrc)*500,yDir1+(yDir1-ySrc)*500
         glVertex2f xDir2+(xDir2-xSrc)*500,yDir2+(yDir2-ySrc)*500
         glVertex2f xDir2,yDir2
         
         glVertex2f xDir2,yDir2
         glVertex2f xDir2+(xDir2-xSrc)*500,yDir2+(yDir2-ySrc)*500
         glVertex2f xDir1+(xDir1-xSrc)*500,yDir2+(yDir2-ySrc)*500
         glVertex2f xDir1,yDir2
      EndIf
      If (xSrc <= xDir1 And ySrc >= yDir2)
         glVertex2f xDir1,yDir1
         glVertex2f xDir1+(xDir1-xSrc)*500,yDir1+(yDir1-ySrc)*500
         glVertex2f xDir2+(xDir2-xSrc)*500,yDir1+(yDir1-ySrc)*500
         glVertex2f xDir2,yDir1
         
         glVertex2f xDir2,yDir2
         glVertex2f xDir2+(xDir2-xSrc)*500,yDir2+(yDir2-ySrc)*500
         glVertex2f xDir2+(xDir2-xSrc)*500,yDir1+(yDir1-ySrc)*500
         glVertex2f xDir2,yDir1
      EndIf
      If (xSrc >= xDir2 And ySrc >= yDir2)
         glVertex2f xDir1,yDir1
         glVertex2f xDir1+(xDir1-xSrc)*500,yDir1+(yDir1-ySrc)*500
         glVertex2f xDir2+(xDir2-xSrc)*500,yDir1+(yDir1-ySrc)*500
         glVertex2f xDir2,yDir1
         
         glVertex2f xDir1,yDir2
         glVertex2f xDir1+(xDir1-xSrc)*500,yDir2+(yDir2-ySrc)*500
         glVertex2f xDir1+(xDir1-xSrc)*500,yDir1+(yDir1-ySrc)*500
         glVertex2f xDir1,yDir1
      EndIf
      If (xSrc >= xDir1 And xSrc <= xDir2 And ySrc <= yDir1)
         glVertex2f xDir1,yDir1
         glVertex2f xDir1+(xDir1-xSrc)*500,yDir1+(yDir1-ySrc)*500
         glVertex2f xDir2+(xDir2-xSrc)*500,yDir1+(yDir1-ySrc)*500
         glVertex2f xDir2,yDir1
      EndIf
      If (xSrc >= xDir1 And xSrc <= xDir2 And ySrc >= yDir2)
         glVertex2f xDir1,yDir2
         glVertex2f xDir1+(xDir1-xSrc)*500,yDir2+(yDir2-ySrc)*500
         glVertex2f xDir2+(xDir2-xSrc)*500,yDir2+(yDir2-ySrc)*500
         glVertex2f xDir2,yDir2
      EndIf
      If (xSrc <= xDir1 And ySrc <= yDir2 And ySrc >= yDir1)
         glVertex2f xDir1,yDir1
         glVertex2f xDir1+(xDir1-xSrc)*500,yDir1+(yDir1-ySrc)*500
         glVertex2f xDir1+(xDir1-xSrc)*500,yDir2+(yDir2-ySrc)*500
         glVertex2f xDir1,yDir2
      EndIf
      If (xSrc >= xDir2 And ySrc <= yDir2 And ySrc >= yDir1)
         glVertex2f xDir2,yDir1
         glVertex2f xDir2+(xDir2-xSrc)*500,yDir1+(yDir1-ySrc)*500
         glVertex2f xDir2+(xDir2-xSrc)*500,yDir2+(yDir2-ySrc)*500
         glVertex2f xDir2,yDir2
      EndIf



      SetAlpha 1
      glEnd()
      
      EndIf
         
      SetColor 255,255,255   
      Next
   EndMethod
EndType


Type Wall
   
   Field x1:Int
   Field x2:Int
   Field x3:Int
   Field x4:Int
   Field y1:Int
   Field y2:Int
   Field y3:Int
   Field y4:Int
      
   Method DrawWall()
      DrawRect x1,y1,(x2-x1),(y2-y1)
   EndMethod   
EndType


Local Light:LightSource = New LightSource

For a = 0 To 25
   Local Entity:Wall = New Wall
      Entity.x1 = Rnd(gx)
      Entity.x2 = Entity.x1+gx/10
      Entity.y1 = Rnd(gy)
      Entity.y2 = Entity.y1+gy/10
      ListAddLast WallList, Entity
Next

SetGraphicsDriver GLMax2DDriver()
Graphics gx,gy,32,60
SetClsColor 155,155,155
HideMouse()
While Not KeyHit(key_escape)
Cls

If KeyHit(key_q)
   LineToggle = 1 - LineToggle
EndIf

Light.x1 = MouseX()-10
Light.x2 = Light.x1 + 20
Light.y1 = MouseY()-10
Light.y2 = Light.y1 + 20
Light.xSrc = MouseX()
Light.ySrc = MouseY()

Light.DrawLightSource()

For Local Entity:Wall = EachIn WallList
   Light.DrawLightDirection()
Next
For Local Entity:Wall = EachIn WallList
   Entity.DrawWall()
Next

Flip
Wend
End


is nur unwesentlich schneller als vorher =/

mpmxyz

BeitragMo, Feb 22, 2010 22:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Was hast du geändert?
Du nutzt jetzt DirectX...
So viel zur Optimierung...
mfG
mpmxyz
Edit: Das hat sich jetzt erübrigt.
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

BladeRunner

Moderator

BeitragMo, Feb 22, 2010 23:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Code nutzt weiter DrawPoly. Nebenbei liegt dein Fehler ein klein wenig woanders Wink
Du rufst das Einzeichnen so auf:
Code: [AUSKLAPPEN]
For Local Entity:Wall = EachIn WallList
   Light.DrawLightDirection()
Next

Fällt Dir da was auf?

Noch dazu rufst du ja schon in deiner Methode alle Einträge in WallList auf, es ist also unnötig ausserhalb durchzuiterieren.
entferne die For next und schwupp rennt die Sauce.
Selbst bei 1000 Elementen flutscht es noch - du hattest halt nur jedes Polygon xmal eingezeichnet.
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

HackerBoyZ

BeitragMo, Feb 22, 2010 23:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Ein simples
BlitzMax: [AUSKLAPPEN]
Global fpsTimer:TTimer = CreateTimer( 60 )
WaitTimer( fpsTimer )


bewirkt bei mir schon wunder Smile
 

OldSkool90

BeitragDi, Feb 23, 2010 5:24
Antworten mit Zitat
Benutzer-Profile anzeigen
BladeRunner hat Folgendes geschrieben:
Der Code nutzt weiter DrawPoly. Nebenbei liegt dein Fehler ein klein wenig woanders Wink
Du rufst das Einzeichnen so auf:
Code: [AUSKLAPPEN]
For Local Entity:Wall = EachIn WallList
   Light.DrawLightDirection()
Next

Fällt Dir da was auf?

Noch dazu rufst du ja schon in deiner Methode alle Einträge in WallList auf, es ist also unnötig ausserhalb durchzuiterieren.
entferne die For next und schwupp rennt die Sauce.
Selbst bei 1000 Elementen flutscht es noch - du hattest halt nur jedes Polygon xmal eingezeichnet.


hmm hatte das tatsächlich nicht bemerkt...da hab ich dem rechner doch unsinnigerweise mehr arbeit aufgezwungen o.O
aber wieso drawpoly? ich benutz doch quads? drawpoly kann aber nur mit 3 koordinaten umgehen.
aber naja hab grad mal die unsinnige for...next schleife entfernt und siehe da: jetz sinken die fps erst bei 16850x1050 und 1000 auf ca 40

Aber du drückst das so aus, als würde mit Light.DrawLightDirection noch etwas nicht stimmen o.O

Midimaster

BeitragDi, Feb 23, 2010 9:21
Antworten mit Zitat
Benutzer-Profile anzeigen
na, das Äußere der Schleife hat rein gar nichts mit dem Inneren der Schleife zu tun!

Du rufst eine Schleife, die alle Wall.Entitys durchläuft:
BlitzMax: [AUSKLAPPEN]
...
Light.DrawLightSource()
For Local Entity:Wall = EachIn WallList
...
Next
...


und in der Aktion innerhalb dieser Schleife kommt dann dieser Wert Entity:Wall gar nicht vor. Hier wird nur von ...
BlitzMax: [AUSKLAPPEN]
...
Light.DrawLightDirection()
....

...gesprochen.

Warum dann alle Walls durchlaufen lassen? Die Aktion Light.DrawLightDirection() wird so unnötig oft aufgerufen.

Zumal innerhalb der Light.DrawLightDirection() sowieso nochmals alle Walls durchlaufen:
BlitzMax: [AUSKLAPPEN]
   Method DrawLightDirection()
For Local Entity:Wall = EachIn WallList
xDir1 = Entity.x1
....


Die äußere Schleife ist also Quatsch. Statt...
BlitzMax: [AUSKLAPPEN]
...
Light.DrawLightSource()
For Local Entity:Wall = EachIn WallList
Light.DrawLightDirection()
Next
...

..würde auch...
BlitzMax: [AUSKLAPPEN]
...
Light.DrawLightSource()

Light.DrawLightDirection()
...

...genügen, und hätte den gleichen Effekt.

Oder wolltest Du hier schon mal eine Scheife für mehrere Lichquellen schaffen?
BlitzMax: [AUSKLAPPEN]
...
Light.DrawLightSource()
For Local locLight:LightSource = EachIn LightListe
locLight.DrawLightDirection()
Next
...

BladeRunner

Moderator

BeitragDi, Feb 23, 2010 12:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Als ich auf deinen Code antwortete waren da noch die Drawpolys, oldskool. Du hast deinen Beitrag wohl noch bearbeitet.
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
 

OldSkool90

BeitragDi, Feb 23, 2010 19:29
Antworten mit Zitat
Benutzer-Profile anzeigen
@BladeRunner:
jop kurz darauf, als ich merkte, dass ich den code aus der falschen datei kopiert hab^^ naja egal jetzt läuft es ja schnell

@Midimaster:

nene...das war reine gewöhnungssache aus b3d xD da hab ich das ganze immer erst kurz vor ende der hauptschleife durchlaufen lassen und hab durch die gewohnheit nichtmal bemerkt, dass ich das bereits in einer method getan hab...klar, dass das viel performance frisst...statt 10 schatten errechnet er dann 100 (denke ich) xD was blödsinn is *schäm*

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group