Ausblenden von "nicht sichtbaren" Objekten
Übersicht

![]() |
5k41Betreff: Ausblenden von "nicht sichtbaren" Objekten |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
hey huhu^^ wieso antwortet denn keiner mehr? | ||
Projekte:
For a better World - Gesellschaftsspiel ( 100%) User posted image |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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.
![]() 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. |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group