Ausblenden von "nicht sichtbaren" Objekten

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

5k41

Betreff: Ausblenden von "nicht sichtbaren" Objekten

BeitragSa, Apr 22, 2006 12:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo!
Ich habe mir überlegt, das es ja schlau wäre alle Objekte die nicht von der Kamera gesehen werden auszublenden, um so einige FPS mehr rauszuholen! Auch hab ich mir aber überlegt meine Map SingleSurface zu machen, das heißt ich kann ja nicht einfach überprüfen ob EntityDistance>wert ist und das Objekt dann per Hideenetity verstecken (kann man denn gehidete Objekte eigentlich immer noch auf distanz prüfen, um es wieder zu "showen" wenn man es wieder sehen soll?) desshalb nun meine Frage: Wie kann man Teile eines Meshes von der Berechnung ausschließen (geht das Überhaupt) falls es nicht geht, wie macht man dann eine "Sichtweite" um Polygone zu sparen/wie macht ihr das immer?

Vielen Dank für eure Hilfe!

MfG

P.S.: Ich weiss ich hab die Frage schonmal gestellt, aber vielleicht bekomm ich ja nun ne gescheite Antwort: Gibt es ein ungefähres Poly/Vertex/Surface limit von dem man sagen kann das das jeder rechner schafft und ab da wirds knapp und das ist zuviel? Bitte jetzt nicht wieder einfach das man so viel sparen soll wie möglich... ich würde das gerne mal wissen würde mich echt weiter bringen!
Projekte:
For a better World - Gesellschaftsspiel ( 100%)

User posted image

Markus2

BeitragSa, Apr 22, 2006 12:56
Antworten mit Zitat
Benutzer-Profile anzeigen
EntityAutoFade

Und Objekte die Unsichtbar sind haben trotzdem noch eine Position .

Objekte als Single Surface zusammen zu fassen macht Sinn nur
solltest du nicht allzuviel zusammen fassen .
Mußt dir vor der Camera Blöcke vorstellen wo die die Polygone drin
gesammelt hast .

Das Polygon Limit für alle Rechner zu bestimmen geht nicht .
Du solltest die Objekte so gestalten das die wenig und viele Polygone
haben und das man das in den Optionen auswählen kann .
Bzw. mit Level of Distance arbeiten weil was weit weg ist kann
man eh nicht erkennen und kann es abstrakt darstellen .
  • Zuletzt bearbeitet von Markus2 am Sa, Apr 22, 2006 13:03, insgesamt einmal bearbeitet
 

FBI-blitz

BeitragSa, Apr 22, 2006 13:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Das kann man mit Nebel hinbekommen...

Guck dir mal Camerafogmode und co. an.

Außerdem könnte der befehl entityvisible noch interessant sein.

Mr.Keks

BeitragSa, Apr 22, 2006 13:15
Antworten mit Zitat
Benutzer-Profile anzeigen
ql:camerarange
ql:entityinview

abgesehen davon bietet es sich an, die map schon vorher in sichtbarkeitsbereiche einzuteilen. so dass du sagen kannst: wenn der spieler in tal/raum1 ist, kann er eh nichts in tal/raum2 sehen, also das alles hiden.
  • Zuletzt bearbeitet von Mr.Keks am Sa, Apr 22, 2006 14:46, insgesamt 2-mal bearbeitet

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSa, Apr 22, 2006 14:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Ausserdem sollte man nicht jedes noch so kleine Polygönchen extra in eine Überprüfungsroutine packen, da eine Überprüfung ja auch Rechenzeit in Anspruch nimmt. Nicht das am Ende durch die ganzen Überprüfungen mehr Rechenzeit flöten geht, als würden sie alle gerendert werden.

5k41

BeitragSa, Apr 22, 2006 21:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Haben EntityINView und EntityVisible noch unterschiede wenn man bei Visible die Kamera als ein Entity angibt/ funktionieren die Befehle auch mit "gehideten" objekten?

MfG

P.S.: Der Tipp mit CameraRange ist ja geil! Das ist ja genau das was ich gesucht hab! Aber ist das da auch so das die Objekte garkeine Rechenzeit beanspruchen oder wie funktioniert das da?
Projekte:
For a better World - Gesellschaftsspiel ( 100%)

User posted image

5k41

BeitragMi, Apr 26, 2006 16:34
Antworten mit Zitat
Benutzer-Profile anzeigen
hey huhu^^ wieso antwortet denn keiner mehr?
Projekte:
For a better World - Gesellschaftsspiel ( 100%)

User posted image

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMi, Apr 26, 2006 16:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Markus2 hat ql:EntityAutoFade vorgeschlagen. Hast du es damit mal versucht? Hab eben mal ein kleinen Geschwindigkeitstest durchgeführt. Es bringt genügend Recourcen rein.

Das Testergebnis eines Singlesurface mit 2000 Triangles

2000 Triangles gezeichnet ~232 FPS
2000 Triangles per EntityHide unsichtbar gemacht ~668 FPS
2000 Triangles per EntityAutoFade unsichtbar gemacht ~640 FPS
2000 Triangles nicht gezeichnet (Leerlauf) ~1340 FPS

Wie man sieht ist der Geschwindigkeitsvorteil von EntityHide gegenüber EntityAutoFade kaum erwähnenswert. In meinem Beispiel ist EntityHide hardcodet eingetragen worden. Es bedeutet, daß eine Runtimeberechnung auch etwas an FPS ziehen würde. Daher würde ich ganz klar es mit EntityAutoFade machen.

5k41

BeitragMi, Apr 26, 2006 16:54
Antworten mit Zitat
Benutzer-Profile anzeigen
und wo liegt da wieder der unterschied zu camerarange??
nochmal zu hideentity: wenn man das so machen würde müsste man ja jedesobjekte "showen" berechenen und wieder "hiden" würde das nicht sehr viel recourcen fressen?

MfG

P.S.: Wo liegt denn nun der unterschied zwischen EntityInView und EntityVisible wenn man bei EntityVisible die Cam als ein Entity angibt?
Projekte:
For a better World - Gesellschaftsspiel ( 100%)

User posted image

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMi, Apr 26, 2006 17:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Nimm die das Beispiel aus der Onlinehilfe ql:EntityVisible und ändere Zeile 40 in PositionEntity Camera,0,0,5 um. dann kannst du sehen, was dieser Befehl genau macht.

Nimm das andere Beispiel aus der Onlinehilfe ql:EntityInView und trage vor der While-Schleife folgende Zeile mit ein c=CreateCube():PositionEntity c,0,0,4. Dann siehst du genau was nun dieser Befehl macht. Very Happy

Zu deiner Frage: Ja eine manuelle HideEntity-Überprüfung würde natürlich auch Rechenzeit in Anspruch nehmen. Deshalb habe ich ja auch extra erwähnt das es in meinem Geschwindigkeitstest hardcodet eingetragen war. Da zum einen die Geschwindigkeit dieser am Wissen des Programmierers liegt, wie gut sie am Ende ist und zum anderen ich zum testen jetzt mein Kopf nicht zu sehr anstrengen wollte. Habe heute schon genug gearbeitet.

5k41

BeitragMi, Apr 26, 2006 17:18
Antworten mit Zitat
Benutzer-Profile anzeigen
mh... hab ich zwar gemacht aber irgendwie weiss ich nicht was mir das bringen sollte... noch bin ich zu keiner neuen erkenntniss gekommen...

MfG
Projekte:
For a better World - Gesellschaftsspiel ( 100%)

User posted image

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMi, Apr 26, 2006 17:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmmm, deine Zielsetzung der ersten Frage vom Samstag lautet ja einen Geschwindigkeitsvorteil durch verstecken der Objekte zu erreichen. Es wurden zählige Beispiele bereits erwähnt. Das einfachste Beispiel ist es mit EntityAutoFade zu machen. Da muß man aber auch garnichts mehr selbst machen. Für ein 3D-Game geradezu genial. Habe dir Geschwindigkeitstestergebnisse geschrieben die kaum schneller sein können, als es mit EntityAutoFade zu machen. Eine Manuelle EntityHide -Berechnung würde ich nur in einem Spiel wie zB thrust (du kennst es ja schon) machen, da ja da das ganze in 2D gezeichnet wurde. Da könnte man es mit einfachen If x>100 If x<200 zeichne() machen.

Exclamation Von meinem letzten Beitrag mußt du beim Beispiel von EntityVisible mit Cursor links/rechts den Block da verschieben, damit man sieht was da geschieht.

Hier noch ein paar Beispiele ganz kurz:

CameraRange zeichnet ALLES nur bis zu einer bestimmten Entfernung. Alles was in den Bereich rein kommt, wird 'wie durch einem Dimensionstor' plötzlich eingeblendet --> negatives Spielgefühl.

Dafür gibt es aber CameraFogMode. Hier wird innerhalb eines bestimmten Bereiches weich eingezeichnet. Nachteil ist aber, es sieht immer 'neblig' aus. Noch ein weiterer Nachteil ist, daß die Entfernung der 3Dzu2D -Umrechnung der Bildschirmecken gegenüber der Bildschirmmitte nicht gleich ist (entsteht durch parallele Entfernungsausbreitung). Wenn man sich dreht, kann man dann in den Ecken weiter schauen als in der Mitte des Bildschirmes.

Dann gibt es noch den EntityAutoFade. Hat zwar den gleichen Nachteil wie CameraFogMode, wird aber im Spiel nicht so extrem wahrgenommen, da die restliche Grafik zB tiefer oder besser weiter weg gezeichnet werden kann. Es wird also nur das unwesentliche früher ausgeblendet, die auf Entfernung eh unwichtig für das Spielgeschehen sein kann aber viel Rechenzeit abverlangt.

Eine manuelle Umrechnung fällt -nach meinem kleinen Geschwindigkeitstest- für mich in Zukunft flach...

edit1: Um die beiden oberen Codebeispiele in Worte zu fassen:

EntityInView ist eine art vierkantiger Kegel der von der Kamera aus geht. Wenn CameraZoom auf 1 gesetzt ist (90° Blickeinfang), dann ist alles InView deren Bezugspunkt sich innerhalb diesem 'Kegel' befindet. Dabei ist es egal ob Objekte dazwischen liegen oder nicht. Es wird zudem der CameraZoom berücksichtigt! zB Teleobjektiv mit Wert >1 führt zu kürzeren 'Aufenthaltszeiten' der InView als beim Weitwinkel Wert <1 zB .1...

EntityVisible dagegen liefert True, wenn eine Bezugspunktverbindung bestehen kann. Es wird berücksichtig wenn Objekte die Verbidung stören. Ähnlich wie LinePick mit unendlich dünem Durchmesser wo aber der 'Abschusswinkel' nicht angegeben werden muß. Visible ist also alles, wo eine Verbindung es sehen zu können besteht.

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group