Hidentity + Entitydistance + Performance

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

 

Inso

Betreff: Hidentity + Entitydistance + Performance

BeitragMi, Dez 14, 2011 14:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Huhu.
Da mir in meinem Post im WiP Topic niemand antwortet, eröffne ich hier halt ein Topic Razz
Hab jetzt so langsam das Grundgerüst meines Spiels fertig.

Als nächstes würde ich gern mittels Entitydistance alle Objekte auf der Map durchgehen, und diejenigen die in einer vorgegebenen Range liegen einblenden, die restlichen ausblenden.
Ist das Sinnvoll auf diese Art? Oder wäre das zu langsam? Was wäre eine mögliche alternative?

Wie oft sollte dieser Check passieren?(1x pro Frame wäre wohl etwas krass)
Werden Entitys von Entitydistance überhaupt realisiert, die hidden sind? Oder arbeite ich da besser mit Entityalpha?
Hätte Entityalpha auch noch nachteile? Wie überprüf ich ob das Objekt vllt schon versteckt ist, oder eben nicht?
Muss ich das über ein field im objekte-type machen, oder gibts da was einfaches wie if entityalpha(mesh) > X ?

Womit könnt ich die Gameperformance noch positiv beeinflussen?


Hoffe jemand kennt sich damit aus. Smile
Gruß Inso

Xeres

Moderator

BeitragMi, Dez 14, 2011 14:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du die Rechnung selber anstellst, könnte das etwas lahm werden. So ziemlich das selbe würdest du erreichen, wenn du die Kamerareichweite herunter setzt oder EntityAutoFade benutzt.
Entitydistance ist nur ein dreidimensionaler Pythagoras - ob die Objekte versteckt sind oder nicht, ist egal. Die Wurzel-Operation dabei macht die Sache relativ rechenintensiv.
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)
 

Inso

BeitragMi, Dez 14, 2011 15:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Ah okay, weil ich irgendwie probleme hab, die sich nicht mit verringerung der Kamerareichweite beheben lassen.
Hab teilweise nur 30fps, aber eigentlich sollte da schon mehr drin sein.
Also muss ich das Problem woanders suchen, eventuell nochmal alle schleifen überprüfen, ob die wirklich nur dann durchlaufen wenns wirklich nötig ist.

Hätte sonst noch jemand ansätze was Performance angeht?

ZEVS

BeitragMi, Dez 14, 2011 15:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Single Surface... Schnell und kompliziert

ZEVS
 

Inso

BeitragMi, Dez 14, 2011 15:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, das hatten wir ja schonmal Wink
Ich hab einen Type "Objekte", dazu zählt alles, von Bäumen bis über Monster und Häuser
Bäume kann man abbauen, Monster können sterben, und laufen, usw. Häuser weder noch.
Also wie kann man das ganze Umsetzen?
Soll ich lieber alles nochmal ganz und gar ausseinander nehmen und für die Monster einen extra type machen, und für die dynamischen/abbaubaren Objekte auch?
Gibt es ein gutes Beispiel für den "Single Surface Kram" ?

Xeres

Moderator

BeitragMi, Dez 14, 2011 15:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Soll ich lieber alles nochmal ganz und gar ausseinander nehmen und für die Monster einen extra type machen, und für die dynamischen/abbaubaren Objekte auch?
JA.
Wenn du X tausend Objekte hast, aber nur eine Typeliste, bist du immer gezwungen die ganzen Einträge zu Überspringen, die du gerade nicht brauchst.
Single Surface muss es irgendwo geben, schließlich hab ich es auch mal gefunden. Bestimmt im Codearchiv.
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)
 

Inso

BeitragMi, Dez 14, 2011 17:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Xeres hat Folgendes geschrieben:
Zitat:
Soll ich lieber alles nochmal ganz und gar ausseinander nehmen und für die Monster einen extra type machen, und für die dynamischen/abbaubaren Objekte auch?
JA.
Wenn du X tausend Objekte hast, aber nur eine Typeliste, bist du immer gezwungen die ganzen Einträge zu Überspringen, die du gerade nicht brauchst.
Single Surface muss es irgendwo geben, schließlich hab ich es auch mal gefunden. Bestimmt im Codearchiv.

Okay, danke dir.
Wenn ich genauer drüber nachdenke weiß ich nicht was mich da geritten hat.. So gesehen speicher ich momentan sogar für Häuser fields wie "dead" "health" "respawntime", ist ja alles verschenkte ressource, und wird dennoch beim laden/speichern alles mit geladen.
mir wird ganz schwarz vor augen bei dem gedanken daran das alles auseinander zu nehmen Very Happy aber was sein muss, muss sein.

hab seit gestern nen neuen pc, und konstante 60 fps. aber nur weils bei mir rund läüft, heißt es ja nich, dass es bei andern auch so ist. Smile

skey-z

BeitragMi, Dez 14, 2011 19:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Du kannst ja auch zwischen benutzbaren(usable) und unbenutzbaren(static) unterscheiben und dafür schon mal 2 Objekte anlegen.

Des weiteren könntest du deine Map in Sektoren unterteilen und alle benötigten Objekte, wahrscheinlich die benutzbaren, an einen Pivot anheften.
Nun gehst du erst alle Pivots durch und prüfst auf die Distanz und danach erst die angehängten Objekte des am nächsten liegenden Pivots, somit musst du nur noch auf einen (geringen) Teil der Objekte zugreifen.
Awards:
Coffee's Monatswettbewerb Feb. 08: 1. Platz
BAC#57: 2. Platz
Twitter
 

BIG BUG

BeitragDo, Dez 15, 2011 18:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Wenn ich genauer drüber nachdenke weiß ich nicht was mich da geritten hat.. So gesehen speicher ich momentan sogar für Häuser fields wie "dead" "health" "respawntime", ist ja alles verschenkte ressource, und wird dennoch beim laden/speichern alles mit geladen.


Wenn Du Dich hier auf Xeres seinen Beitrag bezieht, dann hast Du das falsch verstanden. Die paar Bytes die Du da dann ungenutzt in Deiner Typestruktur hast spielen keine nennenswerte Rolle.
Es geht viel mehr darum, dass wenn Du ein Haus ansprichst nicht auch erst alle anderen Häuser und Gegner durchlaufen musst um das richtige Objekt zu finden.
Ein Trick ist hier z.B. das Handle eines Types im Entityname abzulegen, so kannst Du dann einfach den jeweilligen Type Eintrag mittels "Object" direkt anspringen. Schöner wär es natürlich wenn man eine eigene IntegerID vergeben könnte, aber das hat Mark leider nie implementiert...
B3D-Exporter für Cinema4D!(V1.4)
MD2-Exporter für Cinema4D!(final)
 

Inso

BeitragDo, Dez 15, 2011 19:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich weiß nicht so recht was du meinst.
Müsste ich da nicht auf in einer for next schleife alle objekte durchgehen und abfragen if entityname = sowieso dann dies und jenes ?

Bin auch grad mächtig am verzweifeln das ganze auseinander zu nehmen, ist mehr arbeit als ich dachte :<
Alles muss umgeschrieben werden, bauen funktion, abbauen funktion, laden/speichern.. >.<
Hätt ich nur gleich dran gedacht.

Xeres

Moderator

BeitragDo, Dez 15, 2011 19:14
Antworten mit Zitat
Benutzer-Profile anzeigen
BIG BUG spricht von Handle und Object. Wink
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)
 

Inso

BeitragDo, Dez 15, 2011 19:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Kannt ich noch gar nicht, danke Smile
Wie ich in dem Beispiel seh, kann man die Objekte dann mittels einer ID direkt angesprochen werden, ohne eine for next schleife, versteh ich das richtig?
So richtig ersichtlich ist es für mich jedoch nicht, wie und wo die ID festgelegt wird..

Xeres

Moderator

BeitragDo, Dez 15, 2011 19:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Das sind Dinge, die BlitzBasic (leider) intern verwaltet.
Ob da intern eine Liste durchgegangen oder ein Eintrag direkt gefunden wird, kann ich nicht sagen.

Test:
BlitzBasic: [AUSKLAPPEN]

Type TTest
Field Wert%
End Type

Const size=10000000
Local i, t.TTest, Testhandle
For i=0 To size
t.TTest = New TTest
t\Wert = i
If size/2 = i Then Testhandle = Handle(t)
Next

Local time1 = MilliSecs()
For t = Each TTest
If t\Wert = size/2 Then Exit
Next
Print("For...Each: "+(MilliSecs()-time1))
Print("t\Wert = "+t\Wert)


Local time2 = MilliSecs()
Local obj.TTest = Object.TTest(Testhandle)
Print("Handle-Object: "+(MilliSecs()-time2))
Print("obj\Wert = "+obj\Wert)

WaitKey()
Wie auch immer es arbeitet: Object ist schneller.
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)

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group