SingleSurface Obtimierung ?

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

ToeB

Betreff: SingleSurface Obtimierung ?

BeitragMi, Jul 23, 2008 15:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab mir mal ne einfache und kleine Singlesurface-Paticleengine für mein Spiel geschrieben. Aber es fängt immer noch ab 1000 objecten an zu ruckeln. Habt ihr irgentwelche ideen, mit denen ich eine Speedobtimierung erreichen kann ? Ich hab echt kp... Also was man z.b weglassen kann oder hinzufügen, damits net ruckelt... Oder überflüssiges rausschmeißen...

Bitte .. ^^ !

mfg ToeB

Code: [AUSKLAPPEN]
Dim PATDATA#(0,0,16)

Global TURNPIVOT = 0
Global PCAMERA,PATANZ,SURFANZ
Global PR,PG,PB
Global PMESH = 0
Global GRAV_ON = 0,GRAV# = 0
Global UP_MS = 0


Function PAT_InitSystem(CAMERA_HANDLE,GON=1,GR#=-0.01,PATICLES=500,SURFACES=5)
   PATANZ = PATICLES
   SURFANZ =SURFACES
   PCAMERA =CAMERA_HANDLE
   GRAV_ON = GON
   GRAV#   = GR#
   UP_MS = MilliSecs()
   TURNPIVOT = CreatePivot()
   PMESH = CreateMesh()
   EntityBlend(PMESH,3)
   EntityFX(PMESH,18)
   Dim PATDATA#(SURFANZ,PATANZ,16)
End Function

Function PAT_OpenSurface(TEXTURE=0,PR=255,PG=255,PB=255)
   PP = 0
   For i = 1 To SURFANZ
      If PATDATA(i,0,0) = 0 Then PP = i:Exit
   Next
   If PP = 0 Return
   PATDATA(PP,0,0) = CreateSurface(PMESH)
   BRUSH = CreateBrush(PR,PG,PB)
   If TEXTURE <> 0 BrushTexture(BRUSH,TEXTURE)
   PaintSurface(PATDATA(PP,0,0),BRUSH)
   Return PP
End Function


Function PAT_AddPaticle(INDEX,xx#,yy#,zz#,SCALE#=1,al#=1,als#=-0.05,xs#=0,ys#=0.1,zs#=0,wikls#=0)
   PA = 0
   For i = 1 To PATANZ
      If PATDATA(INDEX,i,1) = 0 PA = i:Exit
   Next
   If PA = 0
      PA = PATANZ
      For i = 1 To PATANZ-1
         For d = 1 To 16
            PATDATA(INDEX,i,d) = PATDATA(INDEX,i+1,d)
         Next
      Next
      PAT_DeletePaticle(INDEX,PA)
   EndIf
   If PATDATA(INDEX,0,0) = 0 Return
   SU = PATDATA(INDEX,0,0)
   sc# = 0.1*SCALE#
   v1 = AddVertex(SU,xx#-sc,yy#+sc,zz#) : VertexTexCoords SU,v1,0,0
   v2 = AddVertex(SU,xx#+sc,yy#+sc,zz#) : VertexTexCoords SU,v2,1,0
   v3 = AddVertex(SU,xx#-sc,yy#-sc,zz#) : VertexTexCoords SU,v3,0,1
   v4 = AddVertex(SU,xx#+sc,yy#-sc,zz#) : VertexTexCoords SU,v4,1,1
   TRI1 = AddTriangle(SU,v1,v2,v3)
   TRI2 = AddTriangle(SU,v3,v2,v4)
   PATDATA(INDEX,PA,01) = 1   
   PATDATA(INDEX,PA,02) = v1
   PATDATA(INDEX,PA,03) = v2
   PATDATA(INDEX,PA,04) = v3
   PATDATA(INDEX,PA,05) = v4
   PATDATA(INDEX,PA,06) = xx
   PATDATA(INDEX,PA,07) = yy
   PATDATA(INDEX,PA,08) = zz
   PATDATA(INDEX,PA,09) = xs
   PATDATA(INDEX,PA,10) = ys
   PATDATA(INDEX,PA,11) = zs
   PATDATA(INDEX,PA,12) = al
   PATDATA(INDEX,PA,13) = als#
   PATDATA(INDEX,PA,14) = sc
   PATDATA(INDEX,PA,15) = 0
   PATDATA(INDEX,PA,16) = wikls
   Return PA
End Function

Function PAT_Update()
   If UP_MS <= MilliSecs()-25 Then
      For i = 1 To SURFANZ
         If PATDATA(i,0,0) <> 0
            SU = PATDATA(i,0,0)
            For p = 1 To PATANZ
               If PATDATA(i,p,1) = 1
                  v1 = PATDATA(i,p,02)
                  v2 = PATDATA(i,p,03)
                  v3 = PATDATA(i,p,04)
                  v4 = PATDATA(i,p,05)
                  xx#= PATDATA(i,p,06)
                  yy#= PATDATA(i,p,07)
                  zz#= PATDATA(i,p,08)
                  sc#= PATDATA(i,p,14)
                  al#= PATDATA(i,p,12)
                  w# = PATDATA(i,p,15)
                  VertexCoords(SU,v1,xx-1*sc,yy+1*sc,zz) : VertexColor(SU,v1,255,255,255,al#)
                  VertexCoords(SU,v2,xx+1*sc,yy+1*sc,zz) : VertexColor(SU,v2,255,255,255,al#)
                  VertexCoords(SU,v3,xx-1*sc,yy-1*sc,zz) : VertexColor(SU,v3,255,255,255,al#)
                  VertexCoords(SU,v4,xx+1*sc,yy-1*sc,zz) : VertexColor(SU,v4,255,255,255,al#)
               EndIf
            Next
         EndIf
      Next
      ;UpdateNormals(PMESH)
      UP_MS = MilliSecs()
   EndIf
   For i = 1 To SURFANZ
      If PATDATA(i,0,0) <> 0
         SU = PATDATA(i,0,0)
         For p = 1 To PATANZ
            If PATDATA(i,p,1) = 1
               PATDATA(i,p,6) = PATDATA(i,p,6) + PATDATA(i,p,9)
               PATDATA(i,p,7) = PATDATA(i,p,7) + PATDATA(i,p,10)
               PATDATA(i,p,8) = PATDATA(i,p,8) + PATDATA(i,p,11)   
               PATDATA(i,p,12)= PATDATA(i,p,12)- PATDATA(i,p,13)
               PATDATA(i,p,15)= PATDATA(i,p,15) + PATDATA(i,p,16)
               If PATDATA(i,p,15) < 0 Then PATDATA(i,p,15) = 360
               If PATDATA(i,p,15) > 360 Then PATDATA(i,p,15) = 0
               If PATDATA(i,p,12) <= 0 Then PAT_DeletePaticle(i,p)                        
            EndIf
         Next
      EndIf
   Next
End Function

Function PAT_DeletePaticle(INDEX,PAT)
   PATDATA(INDEX,PAT,1) = 0
   SU = PATDATA(INDEX,0,0)
   ClearSurface(SU)
   For i = 1 To PATANZ
      If PATDATA(INDEX,i,1) = 1   
         sc# = PATDATA(INDEX,i,14)
         xx#= PATDATA(INDEX,i,06)
         yy#= PATDATA(INDEX,i,07)
         zz#= PATDATA(INDEX,i,08)
         al#= PATDATA(INDEX,i,12)
         v1 = AddVertex(SU,xx#-sc,yy#+sc,zz#) : VertexTexCoords SU,v1,0,0 : VertexColor(SU,v1,255,255,255,al#)
         v2 = AddVertex(SU,xx#+sc,yy#+sc,zz#) : VertexTexCoords SU,v2,1,0 : VertexColor(SU,v2,255,255,255,al#)
         v3 = AddVertex(SU,xx#-sc,yy#-sc,zz#) : VertexTexCoords SU,v3,0,1 : VertexColor(SU,v3,255,255,255,al#)
         v4 = AddVertex(SU,xx#+sc,yy#-sc,zz#) : VertexTexCoords SU,v4,1,1 : VertexColor(SU,v4,255,255,255,al#)
         TRI1 = AddTriangle(SU,v1,v2,v3)
         TRI2 = AddTriangle(SU,v3,v2,v4)
         PATDATA(INDEX,i,02) = v1
         PATDATA(INDEX,i,03) = v2
         PATDATA(INDEX,i,04) = v3
         PATDATA(INDEX,i,05) = v4
      EndIf
   Next
End Function


Function PAT_Paticles(INDEX=-1)
   If INDEX = -1
      PA = 0
      For j = 1 To SURFANZ
         For i = 1 To PATANZ
            If PATDATA(j,i,1) = 1 PA = PA + 1
         Next
      Next
   Else
      PA = 0
      For i = 1 To PATANZ
         If PATDATA(INDEX,i,1) = 1 PA = PA + 1
      Next
   EndIf
   Return PA
End Function
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMi, Jul 23, 2008 16:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Also erstmal heisst es Particle... Wink

Ansonsten würde ich darauf tippen, dass zuviele Funktionsaufrufe bzw. das ewige aufrufen von PATDATA der Flaschenhals sein könnte. Denn 1000 Quads sollten locker drin sein, wenn diese nicht jeweils 1/4 oder mehr vom Bildschirm einnehmen.

Sonst noch ein guter Tipp ist der Profiler von BasicProgger. Dieser zeigt dir genau die Bearbeitungszeiten einzelner Funktionen an. https://www.blitzforum.de/foru...highlight=
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

Dreamora

BeitragMi, Jul 23, 2008 16:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Da hats unzählige Performance Killer drin:

1. Warum loopst du über das ganze zeug beim einfügen? Der rest kann dir schnurz sein, fügs einfach ein. wenn du loopst wirst du bei 1000 Partikeln bei 50 adds ma easy 800'000 loopdurchläufe durchpumpen

2. Deine Update Funktion loopt auch erheblich mehr als nötig weil du die Loops für eingebildete Optimierungen gesplittet hast.

3. Fehlt dir selbst die grobe Idee wie ein SingleSurface System läuft. Die ganze Zeit alles löschen, neu einfügen und so? Dann kannst du Sprites nehmen, wird schneller sein.
Ich habe grössere Zweifel das du auch nur einen einzigen Thread zum Thema SingleSurface gelesen hast geschweige denn Single Surface Partikelsystem
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

ToeB

BeitragMi, Jul 23, 2008 17:15
Antworten mit Zitat
Benutzer-Profile anzeigen
1.: Ich versteh in opunkten 1+2 keine wort Evil or Very Mad

2.: was mach ich denn falsch ? Warum ist das kein Single Surface ?

3.: @hectic : Das Prog krig ich nicht runnergeladen. Was schlägst du vor in bezug auf PATDATA ?

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMi, Jul 23, 2008 23:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Ehrlich gesagt, ist es für mich nicht ganz einfach zu verstehen, wie deine Funktionen aufeinander abgestimmt sind. Zum Beispiel die unterschiedlichen Surfaces deuten wohl auf unterschiedliche Texturen hin. Wie kann dann aber die PATANZ -Variable global sein? Somit müsste ja nach meiner Überlegung die Partikelanzahl auf alle Texturen (Surfaces) immer gleich sein. Also wenn 100 Rauchpartikel angezeigt werden sollen, werden auch 100 Feuserpartikel etc. angezeigt.

Das ganze ist für mich verwirrend, und weil kein startfähiger Code gepostet wurde auch schwer nachzuvollziehen.

Man sollte generell auf globale Variablen verzichten. Außer wenn diese unausweichlich sind, oder eben ''auch als solche gebraucht werden''.

Ich zu meinem Teil würde ein Partikelsystem generell auf Types aufbauen. Gerade Types passen für ein Partikelsystem wie die Faust aufs Auge.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

Dreamora

BeitragMi, Jul 23, 2008 23:44
Antworten mit Zitat
Benutzer-Profile anzeigen
ToeB hat Folgendes geschrieben:
1.: Ich versteh in opunkten 1+2 keine wort Evil or Very Mad

2.: was mach ich denn falsch ? Warum ist das kein Single Surface ?

3.: @hectic : Das Prog krig ich nicht runnergeladen. Was schlägst du vor in bezug auf PATDATA ?

mfg ToeB


1. Das ist das Problem. Du hast keinen Plan wie sowas funktioniert. Lies bitte die Artikel dazu hier und im englischen Board. Das Thema wurde, inkl Partikel Systeme, schon mehrfach detailiert besprochen, da ist solch eine Anti-Implementation eigentlich nur noch peinlich ...

2. Du hast mehr als eine Surface. Du löscht und füllst sie die ganze Zeit wieder, du kümmerst dich nen scheiss drum ob ein partikel überhaupt im sichtbereich ist (denn das gesamte mesh wird zum rendering geschickt wenn auch nur 1 partikel im sichtbereich ist!). Der haupt performancekiller ist das du die ganze zeit löscht und wieder einfügst. denn damit kannst du auf ner normalen grafikkarte mit 6000 triangles eigentlich das ganze schon auf 20-40 FPS runterkloppen.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

ToeB

BeitragDo, Jul 24, 2008 11:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja sry... Evil or Very Mad

Kennt denn jemand ein gutes Deutsches Tutorial was auch gut zu verstehn ist ? Ich hab jetzt 30 min klang geguckt, und keins gefunden...

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!
 

Dreamora

BeitragDo, Jul 24, 2008 13:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein eigentlich nicht.
Grafikprogrammierung ist halt ein internationales Thema. Von daher kannst du wählen zwischen: Ich lerne englisch oder ich suche mir ein Hobby was nicht voraussetzt das ich englisch kann wie 3D Spieleentwicklung.

das dafür notwendige englisch ist nicht sonderlich kompliziert. Voraussetzung ist halt, das du eine Ahnung vom 3D Vokabular hast. Single Surface Programmierung ist kein Anfängerthema sondern Fortgeschrittenenthema also darf / muss man da auch die notwendige Voraussetzungen verlangen können.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

ToeB

BeitragDo, Jul 24, 2008 13:25
Antworten mit Zitat
Benutzer-Profile anzeigen
mhm... ja okay...

Nochmal ne frage : Ich hab mich jetzt nochmals rangesetzt um das ein bissel zu obtimieren. Hab jetzt was kmplett neues gecodet. :
Code: [AUSKLAPPEN]
Graphics3D 800,600,16,2
SetBuffer BackBuffer()


Global CAM = CreateCamera()

Global M = CreateMesh(),SU = CreateSurface(M)
EntityFX M,18

Global AK_PAT = 0
Global AK_MS = MilliSecs()

Dim PAT#(10000,13)

Global Timer = CreateTimer(75)

Repeat
   MS=MilliSecs():FPSz=FPSz+1
     If MS>FPSt Then FPSt=MS+999:FPS=FPSz:FPSz=0
   If KeyDown(57) Then
      For i = 1 To 10
         CreatePAT(0,0,5,Rnd(-0.100,0.100),Rnd(-0.100,0.100),Rnd(-0.100,0.100),Rand(255),Rand(255),Rand(255))
      Next
   EndIf
   TurnEntity CAM,+MouseYSpeed()/3,0,0,0
   TurnEntity CAM,0,-MouseXSpeed()/3,0,1
   If KeyDown(17) Then MoveEntity(CAM,0,0,0.1)
   MoveMouse 400,300
   UpdatePAT()
   WaitTimer(TIMER)
   UpdateWorld()
   RenderWorld()
   Text 1,1,"FPS: "+FPS+"  PARTICLES: "+AK_PAT
   Flip
   Cls
Until KeyHit(1)
End

Function CreatePat(xx#,yy#,zz#,sx#,sy#,sz#,R,G,B,grenz=-1)
   If grenz = -1 grenz = 100+Rand(-10,10)
   Local RGB = 1*$1000000+R*$10000+G*$100+B
   Local SC# = 0.5
   PAT(AK_PAT,0 ) = 1
   PAT(AK_PAT,1 ) = AddVertex(SU,xx-sc,yy+sc,zz)
   PAT(AK_PAT,2 ) = AddVertex(SU,xx+sc,yy+sc,zz)
   PAT(AK_PAT,3 ) = AddVertex(SU,xx-sc,yy-sc,zz)
   PAT(AK_PAT,4 ) = AddVertex(SU,xx+sc,yy-sc,zz)
   PAT(AK_PAT,5 ) = xx
   PAT(AK_PAT,6 ) = yy
   PAT(AK_PAT,7 ) = zz
   PAT(AK_PAT,8 ) = sx
   PAT(AK_PAT,9 ) = sy
   PAT(AK_PAT,10) = sz
   PAT(AK_PAT,11) = RGB
   PAT(AK_PAT,12) = 0
   PAT(AK_PAT,13) = grenz
   AddTriangle(SU,PAT(AK_PAT,1),PAT(AK_PAT,2),PAT(AK_PAT,3))
   AddTriangle(SU,PAT(AK_PAT,3),PAT(AK_PAT,2),PAT(AK_PAT,4))
   AK_PAT = AK_PAT + 1
End Function

Function UpdatePAT()
   If AK_MS <= MilliSecs() - 30 ;30ms Update
      For i = 0 To AK_PAT
         If PAT(i,0) = 1
            v1 = PAT(i,1)
            v2 = PAT(i,2)
            v3 = PAT(i,3)
            v4 = PAT(i,4)
            xx# = PAT(i,5)
            yy# = PAT(i,6)
            zz# = PAT(i,7)
            RGB = PAT(i,11)
            R = (RGB And $FF0000) / $10000
            G = (RGB And $FF00  ) / $100
            B = (RGB And $FF    )
            SC#= 0.5
            ;TFormVector 1,1,0,CAM,0
            x2# = SC;TFormedX()+SC
            y2# = SC;TFormedY()+SC
            z2# = 0;TFormedZ()
            VertexCoords(SU,v1,xx+x2,yy+y2,zz+z2) : VertexColor(SU,v1,R,G,B,0.75)
            VertexCoords(SU,v2,xx-x2,yy+y2,zz+z2) : VertexColor(SU,v2,R,G,B,0.75)
            VertexCoords(SU,v3,xx+x2,yy-y2,zz+z2) : VertexColor(SU,v3,R,G,B,0.75)
            VertexCoords(SU,v4,xx-x2,yy-y2,zz+z2) : VertexColor(SU,v4,R,G,B,0.75)
            PAT(i,12) = PAT(i,12) + 1
            If PAT(i,12) => PAT(i,13) Then
               For m = 0 To 13
                  TEMP = PAT(i,m)
                  PAT(i,m) = PAT(AK_PAT,m)
                  PAT(AK_PAT,m) = TEMP
               Next
               VertexCoords(SU,v1,0,0,0)
               VertexCoords(SU,v2,0,0,0)
               VertexCoords(SU,v3,0,0,0)
               VertexCoords(SU,v4,0,0,0)
               AK_PAT = AK_PAT - 1
            EndIf
         EndIf    
      Next
      AK_MS = MilliSecs()
   EndIf
   For i = 0 To AK_PAT
      If PAT(i,0) = 1
         For m = 5 To 7
            PAT(i,m) = PAT(i,m)+PAT(i,m+3)
         Next
      EndIf
   Next 
End Function


Mal ne Frage dazu : Kann man jedem einzellnen Particle auc eine Texture zuordnen ? Also dass ich nicht nur Farben rumfliegen lassen kann sondern z.b. auf Feuer oder so ?

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!
 

Dreamora

BeitragDo, Jul 24, 2008 13:48
Antworten mit Zitat
Benutzer-Profile anzeigen
du kannst jedem partikel einen eigenen teil der textur zuweisen via UV
aber keine eigene textur, denn eine surface = 1 textur (ausser bei multitexture was man bei partikeln jedoch weniger hat)
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

ToeB

BeitragDo, Jul 24, 2008 13:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Heißt also ich muss meine ganzen Particle-Texturen in einem Großen Bild wie ein AnimImage speichern und dem Surface per Brush übergeben (Also bei Particle-größe 32x32 dann mit 4 Particlen ist das Bild 64x64pixel groß) Aber wie kann ich mit u/v den einzellnen Particlen einen Teil von dem Bild heraus finden, bzw. was muss ich eingeben ? Ist bei dem Befehl VertexTexCoords(o.a) die Parameter u/v in Prozent ? Also 0 = 0% und 1 = 100% ? Oder wie muss ich das anwenden ?

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

tft

BeitragDo, Jul 24, 2008 15:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo ....

zu deiner Frage ....... 0.0-1.0.

Aber ich denke damit wirst du nichts anfangen können. Wir könnten dir natürlich die grundlagen in langen Frage und Antwort spielen hir beibringen. Aber ich denke das ist nicht der richtige Weg. Alles was du zu den einzelnen Befehlen von B3D wissen must. Gibts auf der Deutschen Hilfe zu lesen. Davon gibt es eine Alte ..... die einfach nur Genial ist. Und eine Neue die einfach nur Actuell ist. Diese findest du in diesem Forum.

Singele Surface sachen sind recht kompliziert. Dabei geht es darum....... für fiele SubObjecte....... nur eine Texture zu verwenden. Es gibt etliche ansätze die zu einem guten bist Super guten ergebniss füren können. Dazu muss man wissen wozu man Singele Surface benötigt. Wenn du sowiso die Partikel die in einem Surface gesammelt sind. Auch noch andere Texturen verpassen möchtest. Bleib doch beim Entity System. Da must du nicht alles selber machen. Ist zwar je nach anwendung langsamer. Aber es funktioniert gut. Soll es eine SSE dann doch sein. Must du dir im vorfeld überlegen. Was du alles braucht, und was du weglassen kanst. BEsonders die Sichtbarkeits erkennung ist für die Pervormance entscheident. Damit du nicht jedesmal alle Triangle in die Pipline schickst. Dann must du noch nach bewegung optimieren. Sind nur Aufsteigende Bewegungen nötig..... Feuer steigt auf. (Lagerfeuer) oder brauchst du es in alle richtungen. (Antrieb/Feuerwerk/Licht effecte.) Es gibt da sofiel zu Optimieren.................

Fiel spass bei der Aufgabe. Ich drück dir die Daumen.

Gruss TFT
TFT
https://www.sourcemagic.ch
Monkey,HTML5,CSS3,W 10 64 Bit, 32 GB Ram, GTX Titan, W8 ist Müll !!!!!!

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDo, Jul 24, 2008 16:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn man mit Brushes arbeitet, kann man die UV-Skallierung selbst bestimmen. Das geht dann zum Beispiel über LoadBrush deren letzten beiden Parametern. Allerdings würde ich kein Partikelsystem mit Brushes machen, sondern mit reinen Texturen. Dann gilt: Pixel*(1/TextureWidth).
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

ToeB

BeitragDo, Jul 24, 2008 16:17
Antworten mit Zitat
Benutzer-Profile anzeigen
also ist 0-1(u) und 0-1(v) doch in Prozent ?

Also wenn ich jetzt vier Vertex habe und möchte eine Texture drauflegen...

Code: [AUSKLAPPEN]
If PAT(AK_PAT,1) = 0 PAT(AK_PAT,1 ) = AddVertex(SU,xx-sc,yy+sc,zz) : VertexTexCoords(SU,PAT(AK_PAT,1),0,1)
   If PAT(AK_PAT,2) = 0 PAT(AK_PAT,2 ) = AddVertex(SU,xx+sc,yy+sc,zz) : VertexTexCoords(SU,PAT(AK_PAT,2),1,1)
   If PAT(AK_PAT,3) = 0 PAT(AK_PAT,3 ) = AddVertex(SU,xx-sc,yy-sc,zz) : VertexTexCoords(SU,PAT(AK_PAT,3),0,0)
   If PAT(AK_PAT,4) = 0 PAT(AK_PAT,4 ) = AddVertex(SU,xx+sc,yy-sc,zz) : VertexTexCoords(SU,PAT(AK_PAT,4),1,0)


Ich hab eine Texture von 128x128 in der 4 Bilder je 64x64pixel groß sind
Will ich jetzt das erste haben, also an der Position 0,0->64,64 dann muss ich doch das so ausrechenen :
Code: [AUSKLAPPEN]
u1 = 0*(1/128):v1 = 0*(1*128);Obere linke ecke
u2 = 64*(1/128):v2 = 0*(1*128);Obere rechte ecke
u3 = 0*(1/128):v3 = 64*(1*128);Untere linke ecke
u4 = 64*(1/128):v4 = 64*(1*128);Untere rechte ecke

Und dann halt mit VertexTexCoords ??

Hab ich das so richtig verstanden ?

Auf jeden fall danke !

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDo, Jul 24, 2008 16:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie gesagt, wenn du mit Brushes arbeitest, kannst du die Skallierung selbst festlegen. Wenn du bei skalU# und skalV# jeweils 128 angibst, dann gehen die Texturen ab links/oben 0,0 bis rechts/unten 128,128. Größere Werte spulen das ganze dann immer wieder von neuem ab.

Ohne Brushes (vorzugsweise Nutzung), also mit reinen Texturen, geht jede UV-Koordiante links/oben 0,0 bis rechts/unten 1,1. Dann gilt also:

U#=GewünschteXPositionInPixel*(1/TextureWidth(Texture))

etc...

Deine 64*(1*128) bringen rein garnichts. Kannst dann ja gleich 64*128 machen.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

ToeB

BeitragDo, Jul 24, 2008 17:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Okay danke erstmal ..

Ich hab aba ein problem das das net funzt...

Code: [AUSKLAPPEN]
Function GetUV(Texture,x,y,bw,bh)
   Local w = 128;TextureWidth(Texture)
   Local h = 128;TextureHeight(Texture)
   Local p1 = (1/w),p2 = (1/h)
   u1 = x*p1:v1 = y*p2;Obere linke ecke
   u2 = (x+bw)*p1:v2 = y*p2;Obere rechte ecke
   u3 = x*p1:v3 = (y+bh)*p2;Untere linke ecke
   u4 = (x+bw)*p1:v4 = (y+bh)*p2;Untere rechte ecke
End Function


und dann :
Code: [AUSKLAPPEN]
GetUV(FS,0,0,64,64)
If PAT(AK_PAT,1) = 0 PAT(AK_PAT,1 ) = AddVertex(SU,xx-sc,yy+sc,zz) : VertexTexCoords(SU,PAT(AK_PAT,1),u1,v1)
   If PAT(AK_PAT,2) = 0 PAT(AK_PAT,2 ) = AddVertex(SU,xx+sc,yy+sc,zz) : VertexTexCoords(SU,PAT(AK_PAT,2),u2,v2)
   If PAT(AK_PAT,3) = 0 PAT(AK_PAT,3 ) = AddVertex(SU,xx-sc,yy-sc,zz) : VertexTexCoords(SU,PAT(AK_PAT,3),u3,v3)
   If PAT(AK_PAT,4) = 0 PAT(AK_PAT,4 ) = AddVertex(SU,xx+sc,yy-sc,zz) : VertexTexCoords(SU,PAT(AK_PAT,4),u4,v4)


Aber die werden nicht mehr angezeit... was mach ch falsch ?+

thx+mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDo, Jul 24, 2008 17:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Dein Programmierstil ist eine absolute Grausamkeit, aber egal.

Folgende Änderungen:

Local p1# = (1.0/w)
Local p2# = (1.0/h)


und

u1# = x*p1
v1# = y*p2
u2# = (x+bw)*p1
v2# = (y+bh)*p2


Du benötigst keine u3, u4, v3 und v4 da sowohl

u1=u3,
u2=u4,
v1=v2,
v3=v4 identisch sind

Also benutzt du jeweils jede Variable zweimal.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

ToeB

BeitragDo, Jul 24, 2008 18:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Okay danke erstmal...

Jetzt werden bei mir aber immer nur solche streifen angezeigt...

Code: [AUSKLAPPEN]
Graphics3D 800,600,16,1
SetBuffer BackBuffer()


Global CAM = CreateCamera()

Global CAMPIV = CreatePivot()
Global u1#,u2#,v1#,v2#

Global M = CreateMesh(),SU = CreateSurface(M)
EntityFX M,18


Global AK_PAT = 0
Global AK_MS = MilliSecs()

Dim PAT#(10000,13)

Global Timer = CreateTimer(75)

Global FS = LoadTexture("FS.png")
EntityTexture M,FS

CameraClsColor CAM,64,64,64

Repeat
   MS=MilliSecs():FPSz=FPSz+1
     If MS>FPSt Then FPSt=MS+999:FPS=FPSz:FPSz=0
   If KeyDown(57) Then
      For i = 1 To 10
         CreatePAT(0,0,5,Rnd(-0.100,0.100),Rnd(-0.100,0.100),Rnd(-0.100,0.100),255,255,200,Rand(100,1000))
      Next
   EndIf
   TurnEntity CAM,+MouseYSpeed()/3,0,0,0
   TurnEntity CAM,0,-MouseXSpeed()/3,0,1
   If KeyDown(17) Then MoveEntity(CAM,0,0,0.1)
   MoveMouse 400,300
   UpdatePAT()
   WaitTimer(TIMER)
   UpdateWorld()
   RenderWorld()
   Text 1,1,"FPS: "+FPS+"  PARTICLES: "+AK_PAT
   Flip
   Cls
Until KeyHit(1)
End

Function CreatePat(xx#,yy#,zz#,sx#,sy#,sz#,R,G,B,grenz=-1)
   If grenz = -1 grenz = 100+Rand(-10,10)
   Local RGB = 1*$1000000+R*$10000+G*$100+B
   Local SC# = 0.5
   GetUV(FS,0,0,64,64)
   PAT(AK_PAT,0 ) = 1
   If PAT(AK_PAT,1) = 0 PAT(AK_PAT,1 ) = AddVertex(SU,xx-sc,yy+sc,zz) : VertexTexCoords(SU,PAT(AK_PAT,1),u1,v1)
   If PAT(AK_PAT,2) = 0 PAT(AK_PAT,2 ) = AddVertex(SU,xx+sc,yy+sc,zz) : VertexTexCoords(SU,PAT(AK_PAT,2),u2,v2)
   If PAT(AK_PAT,3) = 0 PAT(AK_PAT,3 ) = AddVertex(SU,xx-sc,yy-sc,zz) : VertexTexCoords(SU,PAT(AK_PAT,3),u1,v1)
   If PAT(AK_PAT,4) = 0 PAT(AK_PAT,4 ) = AddVertex(SU,xx+sc,yy-sc,zz) : VertexTexCoords(SU,PAT(AK_PAT,4),u2,v2)
   PAT(AK_PAT,5 ) = xx
   PAT(AK_PAT,6 ) = yy
   PAT(AK_PAT,7 ) = zz
   PAT(AK_PAT,8 ) = sx
   PAT(AK_PAT,9 ) = sy
   PAT(AK_PAT,10) = sz
   PAT(AK_PAT,11) = RGB
   PAT(AK_PAT,12) = 0
   PAT(AK_PAT,13) = grenz
   AddTriangle(SU,PAT(AK_PAT,1),PAT(AK_PAT,2),PAT(AK_PAT,3))
   AddTriangle(SU,PAT(AK_PAT,3),PAT(AK_PAT,2),PAT(AK_PAT,4))
   AK_PAT = AK_PAT + 1
End Function

Function GetUV(Texture,x,y,bw,bh)
   Local w# = TextureWidth(Texture)
   Local h# = TextureHeight(Texture)
   Local p1# = (1.0/w#),p2# = (1.0/h#)
   u1 = x*p1
   v1 = y*p2
   u2 = (x+bw)*p1
   v2 = (y+bh)*p2   
End Function


Function UpdatePAT()
   If AK_MS <= MilliSecs() - 30 ;30ms Update
      For i = 0 To AK_PAT
         If PAT(i,0) = 1
            ;PositionEntity CAMPIV,PAT(i,5),PAT(i,6),PAT(i,7)
            ;If EntityInView(CAMPIV,CAM) And EntityVisible(CAM,CAMPIV) Then
               v1 = PAT(i,1)
               v2 = PAT(i,2)
               v3 = PAT(i,3)
               v4 = PAT(i,4)
               xx# = PAT(i,5)
               yy# = PAT(i,6)
               zz# = PAT(i,7)
               RGB = PAT(i,11)
               R = (RGB And $FF0000) / $10000
               G = (RGB And $FF00  ) / $100
               B = (RGB And $FF    )
               SC#= 0.5
               ;TFormVector 1,1,0,CAM,0
               x2# = SC;TFormedX()+SC
               y2# = SC;TFormedY()+SC
               z2# = 0;TFormedZ()
               VertexCoords(SU,v1,xx+x2,yy+y2,zz+z2) : VertexColor(SU,v1,R,G,B,0.75)
               VertexCoords(SU,v2,xx-x2,yy+y2,zz+z2) : VertexColor(SU,v2,R,G,B,0.75)
               VertexCoords(SU,v3,xx+x2,yy-y2,zz+z2) : VertexColor(SU,v3,R,G,B,0.75)
               VertexCoords(SU,v4,xx-x2,yy-y2,zz+z2) : VertexColor(SU,v4,R,G,B,0.75)
               PAT(i,12) = PAT(i,12) + 1
               If PAT(i,12) => PAT(i,13) Then
                  For m = 0 To 13
                     TEMP = PAT(i,m)
                     PAT(i,m) = PAT(AK_PAT,m)
                     PAT(AK_PAT,m) = TEMP
                  Next
                  VertexCoords(SU,v1,0,0,0)
                  VertexCoords(SU,v2,0,0,0)
                  VertexCoords(SU,v3,0,0,0)
                  VertexCoords(SU,v4,0,0,0)
                  AK_PAT = AK_PAT - 1
               EndIf
            ;EndIf
         EndIf    
      Next
      AK_MS = MilliSecs()
   EndIf
   For i = 0 To AK_PAT
      If PAT(i,0) = 1
         For m = 5 To 7
            PAT(i,m) = PAT(i,m)+PAT(i,m+3)
         Next
      EndIf
   Next 
End Function


Was habe ich jetzt schon wieder falsch gemacht ??

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDo, Jul 24, 2008 18:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Hast du es denn wirklich verstanden?

Bei VertexTexCoords mußt du bei dir am Ende folgende Kombi haben:

,u1,v1)
,u2,v1)
,u1,v2)
,u2,v2)
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

ToeB

BeitragDo, Jul 24, 2008 18:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Oh shit wirklich xD

DANKE ! Very Happy

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group