Kann man diesen Code noch schneller machen?



  • Prob is, ich hab ka, wie ich des speichern soll, in welcher Region sich eine Einheit befindet. Ich muss sie ja auch in die umliegenden Regionen reintun, weil sie sich ja am Rand befinden kann.
    Soll ich da ne Member-Var in der Klasse Einheit reinmachen, oder soll ich des von den Regionen aus speichern, welche Einheiten da drin sind.
    So langsam befindet sich der Thread im falschen Forum 🙂

    [ Dieser Beitrag wurde am 09.06.2003 um 14:39 Uhr von Optimizer editiert. ]



  • ist das spiel rundenbasiert oder echtzeit?

    ueberpruefst du wirklich in regelmaessigen zeitabstaenden die erreichbarkeit? das waere schwachsinn.

    richtiger waere entweder nach abschluss der bewegungsphase oder bei echtzeit immer nachdem sich eine einheit bewegt hat. und dann natuerlich nur abstaende zu dieser einheit, nicht alles neu berechnen.

    das mit den regionen macht nur sinn, wenn es einen maximalabstand gibt, den nie eine waffe ueberschreiten kann (oder du braeuchtest einen regioneneinteilung pro entfernung(-sklasse), dann muesstest du natuerlich pro region speichern, welche einheiten darin sind, und bei einem erreichbarkeitstest nur die region der schiessenden einheit und die 8 angrenzenden ueberpruefen).

    sinnvoll waere auch bounding boxen zur beschleunigung der treffbarkeitsuntersuchung zu verwenden.

    also statt

    //r sei quadrat der reichweite der waffe
    int x = pos.x-unit.x;
    int y = pos.y-unit.y;
    if(x*x+y*y<r){
        //treffbar
    }
    

    besser

    //r sei reichweite der waffe, rr==r*r
    int x, y;
    if(x=pos.x-unit.x < r && y=pos.y-unit.y < r && x*x+y*y<rr){
        //treffbar
    }
    

    das waere zwar noch empirisch zu untersuchen, aber ich nehme mal an, dass das in den meisten spielsituationen einen vorteil bringt (es sei denn, ganz viele einheiten hocken aufeinander, aber vergleiche sind ja auch nicht so teuer, profile es halt mal so und teil uns mit, was rauskommt.)

    auch koennte eine double multiplikation schneller sein als float. wodurch dann das casten wegfallen koennte. ich weiss aber nicht, wie teuer ein double vergleich ist.

    [ Dieser Beitrag wurde am 09.06.2003 um 15:49 Uhr von PeterTheMaster editiert. ]



  • Warum braucht man überhaupt float oder double? Reicht int oder short int nicht aus?



  • weisst du wie gross seine karten sind? und mit double ist es auf jeden fall generischer. in opengl kann man sogar farben als doubles angeben. man weiss nie, was die hardware oder engine mal zu leisten in der lage sein wird.



  • Die Einheiten bewegen sich nicht in Grids! Sie können an jeder beliebigen Position stehen und jeden beliebigen Bewegungsvektor haben, z.B.
    .x = 1.47538
    .y = 0.37642

    Es gibt auch keinen "Abschluss einer Bewegungsphase", das Spiel läuft in Echtzeit. Ich kann also entweder nach jedem Schritt die Prüfung machen, oder in regelmäßigen Abständen (alle 50 Schritte), so wie ich es jetzt mache. Ich glaube, da gibt es nicht mehr viel zu verbessern.
    Meine Frage mit den Regionen ist rein technischer Natur. Soll ich speichern, in welchen RegionEN (wenn die Einheit am Rand ist muss ich die benachbarte Region mittesten) eine Einheit ist, oder welche Einheiten in einer bestimmten Region sind?
    Und WIE speicher ich das?
    Wer sich das Spiel übrigens mal anschauen will, der Link steht unten.

    Danke für Hilfe schon mal im vorraus.



  • C:\GAME_0~1.EXE
    Die NTVDM-CPU hat einen ungültigen Befehl entdeckt.
    CS:0f65 IP:01b8 OP:63 6f 6e 74 65 Klicken Sie auf "Schließen", um die Anwendung zu beenden.



  • hatte speichern unter benutzt. und dann stand der html quelltext in der exe 😃



  • ich sagte bereits, dass du pro region speichern musst, welche einheiten drin sind. wie genau haengt von deiner sonstigen implementation ab. wenn deine einheiten nummern haben, was das unit[i] vermuten liess, dann einen vector<int>, am generischsten waere ein vector<Unit*>.
    wenn du die ueberpruefung nur alle 50 schritte machst, was fuer einen sinn hat sie dann? heisst das, wenn der feind grade ausserhalb meines schussradius ist, muss ich 50 schritte auf ihn zugehen, damit ich ihn treffen kann?
    hast du das mit den bounding boxen mal getestet?



  • 50 Schritte entspricht 1 Sekunde Spielzeit. Also es wird jede Sekunde geprüft, ob ein Feind in Reichweite ist.
    Das mit dem Vektor kenn ich nicht. Ist das eine Art dynamisches Array? Ich hab von sowas leider keine Ahnung.
    Ob eine Einheit in Reichweite ist prüf ich mit den besagten 3 Zeilen. Die Box bringt überhaupt gar nichts, weil es auch nicht schneller ist, zu schaun ob ne Einheit innerhalb einer quadratischen Reichweite ist und dann nochmal den Kreis zu testen. Das hab ich alles schon ausprobiert.
    Wenn du das mit dem Vektor nochmal erklären könntest, würde mir das vielleicht helfen.

    @<>: also ich hab keine Probleme mit dem runterladen 😕



  • Ach und kann ich in so Vektor auch eine dynamische Anzahl an Wegpunkten speichern?? Das würde mir sehr bei der Wegfindung helfen, die lutscht nämlich.



  • hast du schonmal google ausprobiert? oder die suchfunktion des forums?



  • cool ein dynamisches Array ist offenbar nur, dass man ein neues, größeres Array anlegt und die Werte kopiert?? http://www.volkard.de/vcppkold/die_klasse_vector.html
    -.-



  • Original erstellt von Optimizer:
    cool ein dynamisches Array ist offenbar nur, dass man ein neues, größeres Array anlegt und die Werte kopiert??

    Unser meisterlicher Peter meinte nicht die Vector-Klasse aus Volkards Tutorial, sondern die Vector-Klasse aus der STL.
    Die funktioniert nach dem Prinzip der verketteten Liste, ist schnell und einfach zu nutzen.

    Was willst du bei der Wegfindung mit einem dynamischen Array anstellen? Macht man sowas in der Regel nicht per Backtracking?



  • afaik ist std::vector laut eines defect reports immer als array implementiert
    verkettet liste wäre std::list.



  • Original erstellt von <afaik>:
    afaik ist std::vector laut eines defect reports immer als array implementiert

    'Schuldigung, hast Recht. Verkette Listen mit Direktzugriff sind ja auch eher ungewöhnlich. 😉



  • optimizer
    *********

    also ich wär schon der meinung deine karte in kleine quadrate einzuteilen...das würde dir dann nämlich helfen bei der wegfindung 😉

    bye

    tt



  • kleine quadrate? mit hastables auf durch 16 geteilte koordinaten?
    2d-bäume? ballanciert, tries, spreizbäume?
    voronoy-diagramme? mit tricks, die updates lokal zu bleiben?

    für dem krass guten algo muss schätzen, wie oft updates, wie weit bewegungen pro update, wie ist welt gequantelt, wie dicht ist bevölkert und so sachen. der beste universal-algo wird die hier um faktor 10 outperformt durch nen schlechten spezialisten.



  • Wenn du pro seite 20 einheiten hättest dann wären das ja 20^2 rechnungen pro FRAME
    da sind bei einer minimalen framerate von 25 10k rechnungen pro sec
    Benutzt lieber ne zwischenstruct wo du schaust ob sich eine Einheit bewegt hat!
    Dann kannst du noch so ne Art Bounding box verwenden..
    Bei der Rechnung kannst net mehr viel machen. Es sei denn du schaust ob du per MMX, SSE etc noch ein paar zusatz nano secs bekommst.
    Wird aber net viel hergeben!



  • Ich habe zwar nicht viel Ahnung, aber wie wäre es mit ein paar ASM-Algorithmen?
    Oder kann man nicht auch in C++ mit Registern arbeiten?



  • ja das geht. Man könnte das auch Inline machen, ist aber die frage ob das
    dann viel bringt...

    Devil


Anmelden zum Antworten