<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Kollisions-Check: Momentan O(n^2)]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe ne Klasse <code>object</code> . Diese Klasse hat <code>std::vector&lt;tile&gt;</code> . Nun habe ich zwei Objekte, Spieler und Gegner. Wie bau ich folgendes nun um, damit es performanter wird?</p>
<pre><code class="language-cpp">bool game_object::collides(const game_object&amp; object) const{
    return std::any_of(tiles.begin(), tiles.end(), [this, &amp;object](const cc::tile&amp; tile){
        return std::find_if(object.tiles.begin(), object.tiles.end(), [&amp;tile](const cc::tile&amp; t){
            return tile.position == t.position;
        }) != object.tiles.end();
    });
}
</code></pre>
<p>Hier checke ich jedes Tile von Objekt 1 mit allen Tiles von Objekt 2, wenn die Position übereinstimmt wurde kollidiert. Aber sobald ich hundert Gegner spawne, wird mein Spiel langsamer und ich glaube es liegt an dem oben geposteten Code. Ich würde ziemlich gerne hunderte Gegner in meinem Spielchen spawnen lassen.</p>
<p>Kann mir jemand einen Trick verraten?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/339224/kollisions-check-momentan-o-n-2</link><generator>RSS for Node</generator><lastBuildDate>Sun, 12 Apr 2026 07:41:10 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/339224.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 13 Aug 2016 09:16:46 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Kollisions-Check: Momentan O(n^2) on Sat, 13 Aug 2016 09:16:46 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe ne Klasse <code>object</code> . Diese Klasse hat <code>std::vector&lt;tile&gt;</code> . Nun habe ich zwei Objekte, Spieler und Gegner. Wie bau ich folgendes nun um, damit es performanter wird?</p>
<pre><code class="language-cpp">bool game_object::collides(const game_object&amp; object) const{
    return std::any_of(tiles.begin(), tiles.end(), [this, &amp;object](const cc::tile&amp; tile){
        return std::find_if(object.tiles.begin(), object.tiles.end(), [&amp;tile](const cc::tile&amp; t){
            return tile.position == t.position;
        }) != object.tiles.end();
    });
}
</code></pre>
<p>Hier checke ich jedes Tile von Objekt 1 mit allen Tiles von Objekt 2, wenn die Position übereinstimmt wurde kollidiert. Aber sobald ich hundert Gegner spawne, wird mein Spiel langsamer und ich glaube es liegt an dem oben geposteten Code. Ich würde ziemlich gerne hunderte Gegner in meinem Spielchen spawnen lassen.</p>
<p>Kann mir jemand einen Trick verraten?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2505354</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2505354</guid><dc:creator><![CDATA[checker2]]></dc:creator><pubDate>Sat, 13 Aug 2016 09:16:46 GMT</pubDate></item><item><title><![CDATA[Reply to Kollisions-Check: Momentan O(n^2) on Sat, 13 Aug 2016 09:46:52 GMT]]></title><description><![CDATA[<p>Ohne mehr über dein Orts-System zu wissen - vorfiltern. Gegner am anderen Ende der Karte sind nicht relevant. Wenn du grob die Dimensionen von Gegner/Spielobjekt weißt vorher eine Bounding Box bilden und anhand der schauen ob das tilebasierte Checking überhaupt nötig ist.</p>
<p>Wenn du nur tile-basierte Kollisionen hast, könntest du pro Frame auch einmal eine Kollisions-Map erstellen mit Kacheln die blockiert sind und dann darüber Lookups machen.</p>
<p>Noch am Rande: Schau ob wirklich die Kollisionsabfrage schuld für die Frameeinbrüche sind. Ich hab häufiger mal geschafft, dass ich beim Rendern unnötigen Blödsinn mache, und wenn das halt dann mal 100+ mal pro Frame passiert, fällt es auf, vorher nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2505357</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2505357</guid><dc:creator><![CDATA[ffffff123]]></dc:creator><pubDate>Sat, 13 Aug 2016 09:46:52 GMT</pubDate></item><item><title><![CDATA[Reply to Kollisions-Check: Momentan O(n^2) on Sat, 13 Aug 2016 10:27:33 GMT]]></title><description><![CDATA[<blockquote>
<p>ich glaube es liegt an dem oben geposteten Code.</p>
</blockquote>
<p>Glauben ist Silber, profilen ist Gold.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2505363</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2505363</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Sat, 13 Aug 2016 10:27:33 GMT</pubDate></item><item><title><![CDATA[Reply to Kollisions-Check: Momentan O(n^2) on Sat, 13 Aug 2016 10:28:48 GMT]]></title><description><![CDATA[<p>Ich musste gerade feststellen, dass das Performance-Leck nicht von der <code>collides()</code> -Funktion kommt, sondern von der for-Schleife:</p>
<pre><code class="language-cpp">for(auto&amp; enemy : enemies) enemy.update();
</code></pre>
<p>Und da gibts nicht viel zu optimieren.<br />
Soll ich Threads verwenden?<br />
Nachteil davon ist, dass beide CPU's auf 70% arbeiten.<br />
Ist das ok, oder ist das schon Vergewaltigung?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2505364</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2505364</guid><dc:creator><![CDATA[checker2]]></dc:creator><pubDate>Sat, 13 Aug 2016 10:28:48 GMT</pubDate></item><item><title><![CDATA[Reply to Kollisions-Check: Momentan O(n^2) on Sat, 13 Aug 2016 10:32:35 GMT]]></title><description><![CDATA[<blockquote>
<p>Soll ich Threads verwenden?</p>
</blockquote>
<p>Wenn es einen signifikante Beschleunigung verpasst, dann natürlich. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
<p>Im Ernst, das musst du schon selber testen. Es interessiert auch nicht, wie die Prozessoren dann ausgelastet sind, sondern ob dein Programm schneller läuft.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2505365</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2505365</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Sat, 13 Aug 2016 10:32:35 GMT</pubDate></item><item><title><![CDATA[Reply to Kollisions-Check: Momentan O(n^2) on Sat, 13 Aug 2016 10:58:03 GMT]]></title><description><![CDATA[<p>Arcoth schrieb:</p>
<blockquote>
<p>Es interessiert auch nicht, wie die Prozessoren dann ausgelastet sind, sondern ob dein Programm schneller läuft.</p>
</blockquote>
<p>Mit Threads funktioniert alles einwandfrei. Aber doch, wie sehr die Prozessoren ausgelastet sind, geht mich sehr wohl was an. 70% auf beiden CPU's, ist das nicht schon Vergewaltigung? Oder ist das im Grenzbereich, wo man noch &quot;OK&quot; sagen könnte?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2505371</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2505371</guid><dc:creator><![CDATA[checker2]]></dc:creator><pubDate>Sat, 13 Aug 2016 10:58:03 GMT</pubDate></item><item><title><![CDATA[Reply to Kollisions-Check: Momentan O(n^2) on Sat, 13 Aug 2016 11:26:24 GMT]]></title><description><![CDATA[<p>Du hast doch für 100% CPU gezahlt, warum willst du dann nur 70% nutzen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2505374</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2505374</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Sat, 13 Aug 2016 11:26:24 GMT</pubDate></item><item><title><![CDATA[Reply to Kollisions-Check: Momentan O(n^2) on Sat, 13 Aug 2016 11:28:04 GMT]]></title><description><![CDATA[<p>Na bei Spielen ist eigentlich keiner knausrig mit Ressourcen.</p>
<p>Ich will nicht oberlehrerisch wirken, aber Game-State-Updates auf mehrere Threads verteilen bringt normal eine ganz eigene Klasse von Problemem mit sich, ich hoffe das ist dir klar!</p>
<p>Prinzipiell ist multithreading natürlich gut um die CPU voll auszulasten, vor allem da heute ja jeder Mehrkern-CPUs hat.</p>
<p>Ich würde allerdings, wenn single-threaded jetzt schon Performanceprobleme macht definitiv schauen, warum das so ist. Ich halte es für eher unwahrscheinlich, dass Hobbyprojekte (wenn sie nicht gerade ein komplettes Universum simulieren, oder Vollphysik für alle Spielobjekte o.ä. implementieren) so viel Leistung benötigen sollte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2505375</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2505375</guid><dc:creator><![CDATA[gfgdfgdfg]]></dc:creator><pubDate>Sat, 13 Aug 2016 11:28:04 GMT</pubDate></item><item><title><![CDATA[Reply to Kollisions-Check: Momentan O(n^2) on Sat, 13 Aug 2016 11:59:07 GMT]]></title><description><![CDATA[<p>manni66 schrieb:</p>
<blockquote>
<p>Du hast doch für 100% CPU gezahlt, warum willst du dann nur 70% nutzen?</p>
</blockquote>
<p>Weil das meiner Meinung nach zu viel ist für ein textbasiertes Jump&amp;Run von einer Map die 200x50 Zeichen groß ist und 100 Gegnern auf ihr sitzen hat...</p>
<p>gfgdfgdfg schrieb:</p>
<blockquote>
<p>Na bei Spielen ist eigentlich keiner knausrig mit Ressourcen.</p>
</blockquote>
<p>Das freut mich.</p>
<blockquote>
<p>Ich will nicht oberlehrerisch wirken, aber Game-State-Updates auf mehrere Threads verteilen bringt normal eine ganz eigene Klasse von Problemem mit sich, ich hoffe das ist dir klar!</p>
</blockquote>
<p>Ja. Aber bisher ging mir das Programm mit Multithreading noch nicht durch die Lappen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<blockquote>
<p>Prinzipiell ist multithreading natürlich gut um die CPU voll auszulasten, vor allem da heute ja jeder Mehrkern-CPUs hat.</p>
</blockquote>
<p>Das finde ich nicht gut. Volle Auslastung. Das will ich ändern.</p>
<blockquote>
<p>Ich würde allerdings, wenn single-threaded jetzt schon Performanceprobleme macht definitiv schauen, warum das so ist. Ich halte es für eher unwahrscheinlich, dass Hobbyprojekte (wenn sie nicht gerade ein komplettes Universum simulieren, oder Vollphysik für alle Spielobjekte o.ä. implementieren) so viel Leistung benötigen sollte.</p>
</blockquote>
<p>Genau das. Gibt es etwas besseres als <code>std::vector&lt;tile&gt;</code> ? Ein Konstrukt, das schneller läuft? Könnte hier vielleicht eine <code>(unodered_)map&lt;position, char&gt;</code> eine Performance-Verbesserung bringen? Oder <code>std::vector&lt;std::vector&lt;tile&gt;&gt;</code> (auch wenn ich mir hier noch nicht vorstellen kann wie ich das umsetze)? Ich will jetzt nicht viel mit Code kommen, aber ich muss sagen, ich benutze erstaunlich oft solche Algorithmen wie <code>find_if()</code> , <code>all_of()</code> und <code>any_of()</code> . Ich habe mir sagen lassen, dass es bessere Wege gibt, um direkt auf etwas entsprechendes zugreifen zu können. Wie?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2505378</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2505378</guid><dc:creator><![CDATA[checker2]]></dc:creator><pubDate>Sat, 13 Aug 2016 11:59:07 GMT</pubDate></item><item><title><![CDATA[Reply to Kollisions-Check: Momentan O(n^2) on Sat, 13 Aug 2016 19:18:51 GMT]]></title><description><![CDATA[<p>Also sofern ich alles bisher richtig interpretiere hast du eine 2D-Spielwelt, daher bietet sich natürlich auch ein 2D-Container an. Solltest du z.B. einen Doppelvektor nehmen:</p>
<pre><code>std::vector&lt;std::vector&lt;tile&gt;&gt; map;
map.resize(WIDTH,std::vector&lt;tile&gt;(HEIGHT));

std::cout &lt;&lt; &quot;Tile in unterer Ecke: &quot; &lt;&lt; map[WIDTH-1][HEIGHT-1] &lt;&lt; std::endl;
map[x][y] = SteinTile;
std::cout &lt;&lt; &quot;Map-Breite: &quot; &lt;&lt; map.size() &lt;&lt; std::endl;
std::cout &lt;&lt; &quot;Map-Hoehe : &quot; &lt;&lt; map[0].size() &lt;&lt; std::endl; //oder jedes andere Element, alle Spalten sind ja gleich hoch
</code></pre>
<p>Dann kannst du einfach über map[x][y] auf ein Tile zugreifen. Damit kannst du dann natürlich auch Koordinaten bei Checks wegwerfen, die zu weit weg sind usw., kein Grund mehr, über alle Tiles die es gibt zu iterieren.</p>
<p>Vektoren sind sehr sparsam, kommen also sehr nah an normale Arrays ran. Alternativ bietet, wenn die (maximale) Mapgröße immer fest steht, std::array&lt;&gt; noch ein modernen Wrapper um normale C-Arrays an, ich denke aber im Spielkontext ist vector&lt;vector&lt;&gt;&gt; sinnvoller.</p>
<p>Zur Performance: Wenn du ein Spiel programmierst, will man normal maximale Hardwarenutzung, denn mehr FPS = gut, weil flüssigere Optik. Heute probiert man ja bei z.B. 144 FPS hinzukriegen, damit VSync bei den 144 Hz-Monitoren funktioniert. Wie gesagt, bei Spielen guckt eigentlich keiner drauf, ob die Hardware am Anschlag läuft, das ist quasi gegeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2505411</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2505411</guid><dc:creator><![CDATA[namehier]]></dc:creator><pubDate>Sat, 13 Aug 2016 19:18:51 GMT</pubDate></item><item><title><![CDATA[Reply to Kollisions-Check: Momentan O(n^2) on Sat, 13 Aug 2016 20:07:40 GMT]]></title><description><![CDATA[<p>checker2 schrieb:</p>
<blockquote>
<p>Ich musste gerade feststellen, dass das Performance-Leck nicht von der <code>collides()</code> -Funktion kommt, sondern von der for-Schleife:</p>
<pre><code class="language-cpp">for(auto&amp; enemy : enemies) enemy.update();
</code></pre>
<p>Und da gibts nicht viel zu optimieren.</p>
</blockquote>
<p>was genau macht enemy::update() ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2505416</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2505416</guid><dc:creator><![CDATA[Meep Meep]]></dc:creator><pubDate>Sat, 13 Aug 2016 20:07:40 GMT</pubDate></item><item><title><![CDATA[Reply to Kollisions-Check: Momentan O(n^2) on Mon, 15 Aug 2016 08:19:41 GMT]]></title><description><![CDATA[<p>checker2 schrieb:</p>
<blockquote>
<p>Kann mir jemand einen Trick verraten?</p>
</blockquote>
<p>Um bei Kollisionserkennung von O(n^2) wegzukommen, kann man einen Quadtree nehmen. Würde ich zumindest als erstes versuchen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2505531</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2505531</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Mon, 15 Aug 2016 08:19:41 GMT</pubDate></item><item><title><![CDATA[Reply to Kollisions-Check: Momentan O(n^2) on Mon, 15 Aug 2016 09:43:53 GMT]]></title><description><![CDATA[<p>Also mein Bauchgefühl sagt mir, dass da irgendwo was ganz schön schief läuft, wenn es bei ca. 100 Einheiten schon anfängt zu ruckeln. Auf einem halbwegs aktuellen Rechner solltest Du in diesen Größenordnungen eigentlich keine Schwierigkeiten kriegen -- auch nicht wenn Du etwas mit quadratischer Laufzeit machst. Das ist fast unabhängig davon was Du konkret vor hast.</p>
<p>Insofern vermute ich, dass da irgendwo unabsichtlich Zeit verbraten wird (etwa indem Dinge mehrfach gemacht werden). Versuche mal genau herauszufinden wo die Zeit verbraten wird (Profiler nutzen!). Dann siehst Du klarer und kannst gezielt eingreifen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2505538</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2505538</guid><dc:creator><![CDATA[Jester]]></dc:creator><pubDate>Mon, 15 Aug 2016 09:43:53 GMT</pubDate></item><item><title><![CDATA[Reply to Kollisions-Check: Momentan O(n^2) on Mon, 15 Aug 2016 13:01:24 GMT]]></title><description><![CDATA[<p>Okay, ich hab jetzt den Profiler angeschmissen, und wo am meisten verbraucht wird, ist in <code>movable_object::move()</code> . Ich sehe jedoch nicht, wie ich die Methode optimieren könnte, drum poste ich den Code mal.</p>
<pre><code class="language-cpp">bool movable_object::change_left_direction() const{
    return std::any_of(tiles.begin(), tiles.end(), [this](const cc::tile&amp; tile){
        return tile.position.x - 1 &lt;= -1 || next_edge(map.get_tile(tile.position.x - 1, tile.position.y).character);
    });
}

bool movable_object::change_right_direction() const{
    return std::any_of(tiles.begin(), tiles.end(), [this](const cc::tile&amp; tile){
        return tile.position.x + 1 &gt;= map.width() || next_edge(map.get_tile(tile.position.x + 1, tile.position.y).character);
    });
}

void movable_object::move(){
    switch(current){
        case direction::left:
            if(change_left_direction())
                current = direction::right;
            else
                go_left();
            break;

        case direction::right:
            if(change_right_direction())
                current = direction::left;
            else
                go_right();
            break;

        default:;
    }
}
</code></pre>
<p>Eine andere Datenstruktur benutzen wurde ja schon erwähnt. Mir fällt das jetzt aber ehrlich gesagt ziemlich schwierig, eine andere Datenstruktur zu benutzen, weil ich blicke da gerade noch nicht so ganz durch. Aber es wurde erwähnt es solle auch mit quadratischen Laufzeit gut funktionieren, also will ich das erstmal versuchen. In <code>map.get_tile(...)</code> wird wiederum ein <code>std::find_if()</code> aufgerufen.</p>
<p>Hat jemand ne Ahnung, wie ich das optimieren könnte?<br />
Echt nur mit ner besseren Datenstruktur?<br />
Oder gehts auch einfacher?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2505566</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2505566</guid><dc:creator><![CDATA[checker2]]></dc:creator><pubDate>Mon, 15 Aug 2016 13:01:24 GMT</pubDate></item><item><title><![CDATA[Reply to Kollisions-Check: Momentan O(n^2) on Mon, 15 Aug 2016 20:48:22 GMT]]></title><description><![CDATA[<p>Ich habe die Datenstruktur nun von Grund auf geändert. Man kann jetzt direkt mit map[x][y] zur gewünschten Position indizieren. Von <code>find_if()</code>  <code>any_of()</code> und <code>all_of()</code> keine Spur mehr.<br />
Danke euch für die Hilfestellung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2505607</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2505607</guid><dc:creator><![CDATA[checker2]]></dc:creator><pubDate>Mon, 15 Aug 2016 20:48:22 GMT</pubDate></item></channel></rss>