Fehler bei vielen Triangles

Übersicht BlitzBasic Blitz3D

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

hectic

Sieger des IS Talentwettbewerb 2006

Betreff: Fehler bei vielen Triangles

BeitragDi, Apr 14, 2009 16:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab folgendes merkwürdige Problem mit einem Code von mir. Gezeichnet werden Singlesurface-Sprites, die frei im Raum positionierbar sind und sich automatisch zur kamera richten. Nun liegt die maximale Anzeigegrenze ja bei 16383 Quads/Surface. Allerdings variiert bei mir die Grenze hier und da mal ganz gerne. Und das hängt in erster Linie damit zusammen, wieviele Quads gleich nach dem ersten gerendertem Frame vorhanden sind, und in welcher Position sich die Kamera befindet, welche die aktuell angezeigte Anzahl ausmachen.

Kurz: Fährt man mit der Kamera so in ein Spritefeld ein, dass immer mehr Sprites pro Frame gerendert werden müssen, so kommt es zu einem MAV. Fährt man aus einer größeren Entfernung in das Spritefeld hinein, wo gleich von Anfang an die maximale Anzeigegrenze für Triangles vorhanden ist. So kommt es zu keinem Fehler. Auch dann nicht, wenn die Kamera dann anschliessend sich in der selben X/Y/Z-Position aufhält und die selbe Ausrichtung mit absolut gleichen Gegebenheiten vorliegt.

Da mir der Fehler sehr suspekt erscheint, schliesse ich einen Hardwarefehler meiner Grafikkarte nicht aus. Ich hatte vor zwei Monaten meine Grafikkarten ständig austauschen müssen, da beide wohl einen Knacks (vermutlich) durch das Mainboard abbekommen hatten.

Währe also für mich gut zu wissen, ob folgendes Paket bei Euch zu folgendem Fehler führt.

user posted image
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

DAK

BeitragDi, Apr 14, 2009 16:41
Antworten mit Zitat
Benutzer-Profile anzeigen
der test ist negativ ausgefallen, er ist positiv. will heißen: ja, bei mir kommt der fehler auch und zwar an der selben stelle (von den zahlen her)
Gewinner der 6. und der 68. BlitzCodeCompo

Xeres

Moderator

BeitragDi, Apr 14, 2009 16:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Jo, bei mir auch selbiges wie im Screenshot.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

matze-t

BeitragDi, Apr 14, 2009 16:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Noch ein Test ...
Bei mir kommt der Fehler auch (gleiche Zahlen).

Megamag

BeitragDi, Apr 14, 2009 16:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Jop bei mir auch.
Und ich habe eine neue Garfikkarte.

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDi, Apr 14, 2009 17:05
Antworten mit Zitat
Benutzer-Profile anzeigen
ok, vielen Dank, liegt dann nicht an meine Hardware was die Suche doch wesentlich erschwert. Sad

Sehr seltsam, muß ich dann noch einmal überprüfen. Der Fehler kommt bei RenderWorld.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDi, Apr 14, 2009 18:22
Antworten mit Zitat
Benutzer-Profile anzeigen
So Leute, ich bin stolz Euch die Lösung des Problem etwas näher erläutern zu können... Rolling Eyes

Aus Gründen die mir unbekannt sind, ''merkt'' sich Blitz3D, DirectX oder sonst irgendetwas die Anzahl der als erstes erstellten Triangles eines Surfaces, und begrenzt diese dann für zukünftige Darstellungen. Folgender Code zeigt das Beispiel sehr gut.

Code: [AUSKLAPPEN]
Graphics3D 800,600,0,2
SetBuffer BackBuffer()

Local Timer=CreateTimer(60)
Local Camera=CreateCamera()
Local Mesh=CreateMesh()
Local Face=CreateSurface(Mesh)
Local V0,V1,V2,V3,X,Y,D




;For Y=-63 To +63
;   For X=-64 To +64
;      V0=AddVertex(Face,X*4-1,Y*4+1,400)
;      V1=AddVertex(Face,X*4+1,Y*4+1,400)
;      V2=AddVertex(Face,X*4+1,Y*4-1,400)
;      V3=AddVertex(Face,X*4-1,Y*4-1,400)
;      AddTriangle Face,V0,V1,V2
;      AddTriangle Face,V2,V3,V0
;   Next
;Next
;
;RenderWorld
;ClearSurface Face




While Not KeyHit(1)
   
   If D<63 Then D=D+1
   
   For Y=-D To +D
      For X=-D-1 To +D+1
         V0=AddVertex(Face,X*4-1,Y*4+1,400)
         V1=AddVertex(Face,X*4+1,Y*4+1,400)
         V2=AddVertex(Face,X*4+1,Y*4-1,400)
         V3=AddVertex(Face,X*4-1,Y*4-1,400)
         AddTriangle Face,V0,V1,V2
         AddTriangle Face,V2,V3,V0
      Next
   Next
   
   TurnEntity Camera,0,0,1
   
   WaitTimer Timer
   RenderWorld
   
   Text 20,20,D+" "+CountTriangles(Face)
   ClearSurface Face
   
   Flip 0
Wend


So wie gehabt ausgeführt, bricht das Programm bei Runde 56 (25990 Triangles) mit einem MAV ab. Zeichnet man aber zuerst einmal das ganze Surface komplett bis zu seinen Leistungsgrenzen einmal voll, so bleibt die Möglichkeit auch für weiteres Zeichnen ohne Fehler erhalten. Dazu die Kommentarzeilen auskommentieren.

Nun kann ich wieder ''beruhigt'' an der Draw3D2 weiter arbeiten und ein automatisches MAV-Workaround in dieser einbauen. Blöd nur, dass nun beim laden einer Textur über LoadImage3D einmal RenderWorld ausgeführt wird, oder ich mache ein extra Befehl, der genau das einmal durchführt?
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

Dreamora

BeitragDi, Apr 14, 2009 18:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Fehler bei renderworld heisst in so einem Fall fast garantiert, dass die Indexgrenze für Meshes in DX7 missachtet wurde.

Moderne hardware verträgt 65536 triangles und 65536 vertices.
Bei älteren Karten (GF4 MX / GF2 und älter, sowie verschiedenen nicht aktuellen intel cpu to dvi / VGA adaptern), ist die Grenze jedoch schon bei 32768, nicht 65536

Sobald diese grenzen überschritten werden, tretten nach einander zwei phasen ein:

Phase 1: Ein teil des meshes wird nicht mehr gezeichnet
Phase 2: wenn noch mehr triangles rein kommen, crasht DirectX wegen Speicherzugriffsfehlern (da der buffer für vertices / triangle indices obige maximalgrössen hat).

Wie lange phase 1 anhält, ist sehr treiber und grafikkarten abhängig. Das kann schon mit 200 zuviel auf Phase 2 gehen oder bei 80k



Es gibt noch einen zweiten Grund für MAV in RenderWorld, der hier jedoch ausgeschlossen werden kann denk ich: Zu wenig Grafikspeicher auf der Grafikkarte um alle Textur und Geometriedaten zu halten die fürs rendering des aktuellen View Frustrum (egal ob durch was anderes verdeckt oder nicht) benötigt werden.
In dem falle wird versucht eine textur zu rendern die nicht da ist, was logischerweise zum crash führen muss.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDi, Apr 14, 2009 18:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Unsere Beiträge sind durch mein Doppelpost kollidiert...

Mit 16383 Quads (65532 Vertices) gehe ich ja nicht über die Anzahl deiner verwiesenden Grenzen hinaus. Das Problem sollte mit meinem Doppelpost erläutert sein, und es liegt nicht an zu viele Vertices. Meiner Meinung nach...
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

Dreamora

BeitragDi, Apr 14, 2009 18:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab das Treiberverhalten bei mir net.
Zumindest nicht mit der letzten stabilen Blitz3D Version (1.98), sonst würden Particle Candy, Sprite Candy und Sswifts Schattensystem permanent crashen.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDi, Apr 14, 2009 20:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab grad eine alte Backup-CD mit Blitz3D V.1.96 ausprobiert, welches die gleichen Probleme aufweist. Also wird es vermutlich ein Problem mit den Grafiktreibern sein, als die Blitz3D-Vesion.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Jan_

Ehemaliger Admin

BeitragMi, Apr 15, 2009 8:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Hm, bei Singlesurface Particle engines haben es deswegen immer alle so gemacht, dass das Mesh komplett gelöscht wird, und komplett neu aufgebaut.
between angels and insects

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMi, Apr 15, 2009 11:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, das wird ja alles gemacht. Schau dir mal den Code aus dem Beitrag vom Di. 14.04.2009 - 18:22 an. Bei mir bricht das Programm vorzeitig ab, wo die Grenze noch nicht erreicht wurde und die vorzeitige Grenze ist je nach Situation willkürlich.

Für mich ist die Sache gegessen, da ich ein Workaround dazu gefunden habe denn ich auch immer einsetzen werde. Für alle anderen kann ich nur dazu raten es mit ihren Sprite/Particle Candy und anderen Blitz3D internen Engines auch zu machen, denn es ist noch nicht festgestellt ob es an den Treibern liegt oder an Blitz3D.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Noobody

BeitragMi, Apr 15, 2009 11:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Ein weiterer Workaround wäre es, das Mesh komplett per FreeEntity freizugeben und ein neues zu erstellen (muss halt wieder neu texturiert werden etc).
Ich weiss nicht, wie es da mit der Performance aussieht - müsste man ausprobieren - aber ein Renderworld mit 2^16 Triangles dauert bei mir schon eine halbe Sekunde, und diese Zeit würde ja immer dann anfallen, wenn ich ein Bild lade.
Das würde zu relativ hohen Ladezeiten führen, daher würde ich eher zur Methode mit FreeEntity tendieren.
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMi, Apr 15, 2009 12:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Hä was, du hast 2 FPS bei folgendem Code?

Code: [AUSKLAPPEN]
Graphics3D 800,600,0,2
SetBuffer BackBuffer()

Local Timer=CreateTimer(60)
Local Camera=CreateCamera()
Local Mesh=CreateMesh()
Local Face=CreateSurface(Mesh)
Local V0,V1,V2,V3,X,Y,D

;For Y=-63 To +63
;   For X=-64 To +64
;      V0=AddVertex(Face,X*4-1,Y*4+1,400)
;      V1=AddVertex(Face,X*4+1,Y*4+1,400)
;      V2=AddVertex(Face,X*4+1,Y*4-1,400)
;      V3=AddVertex(Face,X*4-1,Y*4-1,400)
;      AddTriangle Face,V0,V1,V2
;      AddTriangle Face,V2,V3,V0
;   Next
;Next
;
;RenderWorld
;ClearSurface Face

While Not KeyHit(1)
   
   If D<63 Then D=D+1
   
   For Y=-D To +D
      For X=-D-1 To +D+1
         V0=AddVertex(Face,X*4-1,Y*4+1,400)
         V1=AddVertex(Face,X*4+1,Y*4+1,400)
         V2=AddVertex(Face,X*4+1,Y*4-1,400)
         V3=AddVertex(Face,X*4-1,Y*4-1,400)
         AddTriangle Face,V0,V1,V2
         AddTriangle Face,V2,V3,V0
      Next
   Next
   
   TurnEntity Camera,0,0,1
   
   WaitTimer Timer
   RenderWorld
   
   Text 20,20,D+" "+CountTriangles(Face)
   ClearSurface Face
   
   Flip 0
Wend


Wie würde denn jetzt dein Workaround aussehen? Denn das Mesh wird gerade neu erstellt und erzeugt ja schon die Probleme, wenn das erste Füllen mit Triangles nicht gleich die Leistungsgrenze erreicht. Wenn man beim ersten mal nur ein paar Triangles einzeichnet, dann später immer mehr, ist die Leistungsgrenze vorzeitig erreicht und verabschiedet sich mit einem MAV.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Noobody

BeitragMi, Apr 15, 2009 12:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Workaround funktioniert so, das Mesh ganz neu zu erstellen und nicht nur die Surface zu bereinigen Code: [AUSKLAPPEN]
Graphics3D 800,600,0,2
SetBuffer BackBuffer()

Local Timer=CreateTimer(60)
Local Camera=CreateCamera()
Local Mesh=CreateMesh()
Local Face=CreateSurface(Mesh)
Local V0,V1,V2,V3,X,Y,D

While Not KeyHit(1)
   
   If D<63 Then D=D+1
   
   For Y=-D To +D
      For X=-D-1 To +D+1
         V0=AddVertex(Face,X*4-1,Y*4+1,400)
         V1=AddVertex(Face,X*4+1,Y*4+1,400)
         V2=AddVertex(Face,X*4+1,Y*4-1,400)
         V3=AddVertex(Face,X*4-1,Y*4-1,400)
         AddTriangle Face,V0,V1,V2
         AddTriangle Face,V2,V3,V0
      Next
   Next
   
   TurnEntity Camera,0,0,1
   
   WaitTimer Timer
   RenderWorld
   
   Text 20,20,D+" "+CountTriangles(Face)
   
   FreeEntity Mesh
   Mesh = CreateMesh()
   Face = CreateSurface( Mesh )
   
   Flip 0
Wend


Das Problem ist halt, dass die FX - Flags neu verteilt werden müssen, neu texturiert werden muss, eventuell das Mesh noch positioniert und rotiert werden muss etc.
Die ganze Initialisierung müsste halt wiederholt werden.

Andererseits benötigt das Rendern von grossen Surfaces auf diesem Laptop unheimlich viel Zeit - teilt man die Surface aber in kleinere Surfaces auf, so geht es ohne Probleme. Desweiteren 'verschwinden' Surfaces, wenn sie bei >40000 Triangles sind. Sie werden zwar gerendert (TrisRendered sagt das zumindest) und RenderWorld braucht auch gehörig Zeit, aber es erscheint einfach nichts auf dem Bildschirm.
Scheinbar verträgt die Onboard - Grafik nur kleinere Surfaces Razz
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMi, Apr 15, 2009 13:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Aja, stimmt und funktioniert. Bei mir allerdings 35:72 FPS. Also mit etwa 50% Leistungseinbruch.

Aber was meinst du mit den Surfaces aufteilen? Nur für Performancefragen für zukünftige Projekte. Kannst du mal bitte folgenden Code ausprobieren? Und führe diesen jeweils mit Const M=0 und einmal mit Const M=3 aus. Bei mir ist 0 etwas 2% schneller (zwar irrelevant, aber einfacher zu handhaben), aber wenn bei dir das System bei einem Riesen-Mesh ''zusammen bricht'', dann werde ich es in meinem Hinterkopf behalten.

Code: [AUSKLAPPEN]
Graphics3D 800,600,0,2
SetBuffer BackBuffer()


Const M=0 ;EIN MESH
;Const M=3 ;VIER MESHES


Local Camera=CreateCamera()
Local Mesh[M]
Local Face[M]
Local V0,V1,V2,V3
Local X1,Y1,X2,Y2
Local D,P

For D=0 To M
   Mesh[D]=CreateMesh()
   Face[D]=CreateSurface(Mesh[D])
Next

While Not KeyHit(1)
   
   For D=0 To 3
      If D=0 Then X1=-120: Y1=+120
      If D=1 Then X1=+120: Y1=+120
      If D=2 Then X1=-120: Y1=-120
      If D=3 Then X1=+120: Y1=-120
      If M=0 Then P=0 Else P=D
      
      For Y2=-25 To +25
         For X2=-25 To +25
            V0=AddVertex(Face[P],X1+X2*4-1,Y1+Y2*4+1,400)
            V1=AddVertex(Face[P],X1+X2*4+1,Y1+Y2*4+1,400)
            V2=AddVertex(Face[P],X1+X2*4+1,Y1+Y2*4-1,400)
            V3=AddVertex(Face[P],X1+X2*4-1,Y1+Y2*4-1,400)
            AddTriangle Face[P],V0,V1,V2
            AddTriangle Face[P],V2,V3,V0
         Next
      Next
   Next
   
   RenderWorld
   
   For D=0 To M
      ClearSurface(Face[D])
   Next
   
   Text 20,20,fps:msc=MilliSecs()
   If msc>mts Then mts=msc+1001:fps=frm:frm=0 Else frm=frm+1
   
   Flip 0
Wend
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Noobody

BeitragMi, Apr 15, 2009 13:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Bei mir ist die Aufteilung mit M=3 ca. 50% schneller, allerdings scheint mein Laptop da eher ein Einzelfall zu sein - auf dem Laptop meiner Schwester sind beide Versionen exakt gleichschnell, obwohl sie das gleiche Modell hat.

Wenn die Variante mit dem neuen Mesh nach jedem Frame so grosse Leistungseinbusse bringt, ist sie natürlich keine Option.
Anstatt aber RenderWorld in LoadImage3D auszuführen, würde ich eine separate Funktion dafür verwenden, die einfach nach Bedarf aufgerufen wird - schliesslich zeichnet man wohl von den wenigsten Bildern 5000 Stück auf den Bildschirm. Falls doch (beispielsweise bei einem Partikelsystem), kann man ja gleich nach dem Laden die entsprechende Funktion aufrufen - so liegt die Entscheidung beim Benutzer.
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

aMul

Sieger des Minimalist Compo 01/13

BeitragMi, Apr 15, 2009 15:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich unterschreibe ebenfalls Nobodys Wunsch einer eigenen Funktion. Sowas wie SuperSizeSurface() oder so. Mr. Green

Ansonsten wollte ich mich hier noch kurz bedanken, weil ich dieses Problem schon öfters hatte, aber keine Lösungen finden konnte.
Also, Danke und so.

(Und gut zu wissen, dass du meinen Vorschlag in Draw3D2 integrierst, man fühlt sich gleich richtig wichtig. Wink)
Panic Pong - ultimate action mashup of Pong and Breakout <= aktives Spiele-Projekt, Downloads mit vielen bunten Farben!
advASCIIdraw - the advanced ASCII art program <= aktives nicht-Spiele-Projekt, must-have für ASCII/roguelike/dungeon-crawler fans!
Alter BB-Kram: ThroughTheAsteroidBelt - mit Quelltext! | RGB-Palette in 32²-Textur / Farbige Beleuchtung mit Dot3 | Stereoskopie in Blitz3D | Teleport-Animation Screensaver

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMi, Apr 15, 2009 15:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja klar, ihr hilft mir ja immer wieder. Und dafür bin ich euch auch sehr dankbar.

Ich denke aber auch, dass es besser wäre wenn man es über ein extra Befehl erledigt, als das es automatisch durch LoadImage3D durchgeführt wird. Nicht wegen der Dauer zum erstellen eines vollen Surfaces (weniger als 1/10 Sekunde), als viel mehr das Problem des notwendigen RenderWorld, was bei zwischendurch geladenen Texturen zu Problemen führen könnte. Aber es wird sicherlich nicht SuperSizeSurface() heissen, oder gerade deswegen weil die ganze Problemstellung so komisch ist, muß auch der Befehl komisch sein.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group