<?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[Daten Stückweise laden und in Arrays verarbeiten]]></title><description><![CDATA[<p>Guten Abend!</p>
<p>Also, ich bin da an einer Sache dran. Ich programmiere an einem kleinen Spiel, in der Konsole, in welchem ein kleines UBoot durch eine Höhle taucht.<br />
Die Karten für die Höhle scrollen von rechts nach links am UBoot vorbei - sollen sie zumindest.<br />
Ich habe bisher meine Karte, Feld für Feld in einem zweidimensionalen Array gespeichert. Das Array ist allerdings knapp 200 x 17 groß (x &amp; y).</p>
<p>Jetzt ist mir klar, ich kann beim scrollen nicht jede Frame das ganze Array komplett neu berechnen (indem ich Wert für Wert ein Feld nach links trage).<br />
Also vllt. kann ich das schon machen, aber ich dachte an etwas, mit dem der CPU nicht ganz soviel arbeit hat.</p>
<p>Meine Idee war also bisher folgende:<br />
100x17 werden auf dem Bildschirm durch meine Renderfunktion tatsächlich dagestellt. Jedesmal wenn gescrollt wird, zähle ich die Zeiger, die auf die X-Arrays zeigen, um eines hoch. Definierte also einen neuen 0 Punkt.</p>
<p>Das Problem, dass sich hierbei ergibt ist, dass ich nach Links hin an Array verliere (das ich obendrein nicht einfach so löschen kann), und Rechts nicht dazukommt.</p>
<p>Ich benutze Vector nicht, weil ich eigentlich Zeit sparen will.</p>
<p>Also dachte ich, mache ich ein zweites Array, in dass ich - während gescrollt wird - einmal die Anfangs nicht sichtbaren Felder der Karte lade, und dahinter eben eine neue Karte aus einer Datei. Ist das erste Array &quot;durchgescrollt&quot;, ersetze ich es durch das neue (indem ich die Zeiger entsprechend ausrichte) und gebe den Speicher entsprechend zurück.</p>
<p>Diese Ladevorgänge sollen dann Stückweise, Frame für Frame ablaufen, sodass jede Frame möglichst wenig rechnerisch passiert.</p>
<p>Ist das ganze den Aufwand überhaupt Wert? Ist Vector wirklich so langsam im vergleich zu Arrays? Ich möchte einfach nur nicht, dass ein so simples Konsolenspiel dem Prozessor soviel abverlangt.</p>
<p>Mit freundlichen Grüßen und Danke im voraus,</p>
<p>Thez</p>
<p>P.S.: Sorry für die Überschrift, wusste auch nicht wie ich das auf den Punkt bringe sollte.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/332683/daten-stückweise-laden-und-in-arrays-verarbeiten</link><generator>RSS for Node</generator><lastBuildDate>Mon, 27 Apr 2026 13:47:14 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/332683.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 16 May 2015 16:28:17 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Daten Stückweise laden und in Arrays verarbeiten on Sat, 16 May 2015 16:38:59 GMT]]></title><description><![CDATA[<p>Guten Abend!</p>
<p>Also, ich bin da an einer Sache dran. Ich programmiere an einem kleinen Spiel, in der Konsole, in welchem ein kleines UBoot durch eine Höhle taucht.<br />
Die Karten für die Höhle scrollen von rechts nach links am UBoot vorbei - sollen sie zumindest.<br />
Ich habe bisher meine Karte, Feld für Feld in einem zweidimensionalen Array gespeichert. Das Array ist allerdings knapp 200 x 17 groß (x &amp; y).</p>
<p>Jetzt ist mir klar, ich kann beim scrollen nicht jede Frame das ganze Array komplett neu berechnen (indem ich Wert für Wert ein Feld nach links trage).<br />
Also vllt. kann ich das schon machen, aber ich dachte an etwas, mit dem der CPU nicht ganz soviel arbeit hat.</p>
<p>Meine Idee war also bisher folgende:<br />
100x17 werden auf dem Bildschirm durch meine Renderfunktion tatsächlich dagestellt. Jedesmal wenn gescrollt wird, zähle ich die Zeiger, die auf die X-Arrays zeigen, um eines hoch. Definierte also einen neuen 0 Punkt.</p>
<p>Das Problem, dass sich hierbei ergibt ist, dass ich nach Links hin an Array verliere (das ich obendrein nicht einfach so löschen kann), und Rechts nicht dazukommt.</p>
<p>Ich benutze Vector nicht, weil ich eigentlich Zeit sparen will.</p>
<p>Also dachte ich, mache ich ein zweites Array, in dass ich - während gescrollt wird - einmal die Anfangs nicht sichtbaren Felder der Karte lade, und dahinter eben eine neue Karte aus einer Datei. Ist das erste Array &quot;durchgescrollt&quot;, ersetze ich es durch das neue (indem ich die Zeiger entsprechend ausrichte) und gebe den Speicher entsprechend zurück.</p>
<p>Diese Ladevorgänge sollen dann Stückweise, Frame für Frame ablaufen, sodass jede Frame möglichst wenig rechnerisch passiert.</p>
<p>Ist das ganze den Aufwand überhaupt Wert? Ist Vector wirklich so langsam im vergleich zu Arrays? Ich möchte einfach nur nicht, dass ein so simples Konsolenspiel dem Prozessor soviel abverlangt.</p>
<p>Mit freundlichen Grüßen und Danke im voraus,</p>
<p>Thez</p>
<p>P.S.: Sorry für die Überschrift, wusste auch nicht wie ich das auf den Punkt bringe sollte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2453740</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2453740</guid><dc:creator><![CDATA[Thez]]></dc:creator><pubDate>Sat, 16 May 2015 16:38:59 GMT</pubDate></item><item><title><![CDATA[Reply to Daten Stückweise laden und in Arrays verarbeiten on Sat, 16 May 2015 16:41:10 GMT]]></title><description><![CDATA[<p>Ich würde vorschlagen, dass du einfach anfängst zu programmieren und dann konkret zeigst, wo es denn jetzt hängt. Grundsätzlich ist dein Vorhaben im Bezug auf die Prozessorleistung kein Problem, aber eine Konsole ist natürlich eher für Textausgabe gedacht. Wenn es also ruckelt bzw. flackert, dann liegt das einfach genau daran, dass du sie zweckentfremdest. Hierfür gibt es geeignete (vom Betriebssystem abhängige) Funktionen, die das etwas verbessern können.</p>
<p>Ansonsten kannst du die ganze Karte komplett laden und du zeigst dann einfach nur das an, was gerade relevant ist. Du berechnest also nicht das ganze Array neu, sondern fängst mit der Ausgabe einfach ein Stück weiter hinten an.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2453742</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2453742</guid><dc:creator><![CDATA[nbmbnm]]></dc:creator><pubDate>Sat, 16 May 2015 16:41:10 GMT</pubDate></item><item><title><![CDATA[Reply to Daten Stückweise laden und in Arrays verarbeiten on Sat, 16 May 2015 17:16:32 GMT]]></title><description><![CDATA[<p>Ja gut. Ja, ich neige dazu mich in Konzepten zu verhadern. Vorallem, weil das Scrollen wesentlich ist. Dann mach ich es wirklich ersteinmal.<br />
Es würde mich dennoch interessieren, ist der STL Vector wirklich soviel langsamer in der Handhabung als ein Array?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2453745</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2453745</guid><dc:creator><![CDATA[Thez]]></dc:creator><pubDate>Sat, 16 May 2015 17:16:32 GMT</pubDate></item><item><title><![CDATA[Reply to Daten Stückweise laden und in Arrays verarbeiten on Sat, 16 May 2015 17:17:27 GMT]]></title><description><![CDATA[<p>Hier noch ein kurzes Beispiel. Natürlich kann man die Map auch aus einer Datie o.ä. laden... Man sieht jedenfalls, dass ein großer Vector keine Probleme macht...</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;vector&gt;
#include &lt;string&gt;
#include &lt;map&gt;
#include &lt;ctime&gt;
#include &lt;Windows.h&gt;

const int DISPLAY_X = 75;
const int MAP_X = 1500;

void SetCursorXY(int x, int y) 
{ 
    COORD pos = {x, y};

    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}

void SetupMap(std::vector&lt;std::string&gt;&amp; map)
{
	std::srand(static_cast&lt;unsigned int&gt;(std::time(NULL)));

	std::string border(MAP_X, '#');

	map.push_back(border);
	map.push_back(border);

	for (std::size_t i = 0; i &lt; 6; ++i)
	{
		std::string line(MAP_X, ' ');

		for (std::size_t j = 0; j &lt; MAP_X; ++j)
		{
			if (std::rand() % 5 == 0)
				line[j] = '*';
		}

		map.push_back(line);
	}

	map.push_back(border);
	map.push_back(border);
}

void Render(std::vector&lt;std::string&gt;&amp; map, int renderPos)
{
	for (std::size_t i = 0; i &lt; map.size(); ++i)
	{
		std::cout &lt;&lt; map[i].substr(renderPos, DISPLAY_X) &lt;&lt; &quot;\n&quot;;
	}
}

int main()
{
	std::vector&lt;std::string&gt; map;

	int scrollPos = 0;

	SetupMap(map);

	while (true)
	{
		SetCursorXY(0, 0);

		Render(map, scrollPos);

		++scrollPos;

		// Für alle Fälle
		if (scrollPos &gt;= MAP_X - DISPLAY_X + 1)
			scrollPos = 0;

		Sleep(10);
	}
}
</code></pre>
<p>Das Vorgehen ist sicherlich nicht ideal, aber es soll auch nur ein Beispiel sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2453746</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2453746</guid><dc:creator><![CDATA[hjkhjkhjk]]></dc:creator><pubDate>Sat, 16 May 2015 17:17:27 GMT</pubDate></item><item><title><![CDATA[Reply to Daten Stückweise laden und in Arrays verarbeiten on Sat, 16 May 2015 17:19:28 GMT]]></title><description><![CDATA[<p>Thez schrieb:</p>
<blockquote>
<p>ist der STL Vector wirklich soviel langsamer in der Handhabung als ein Array?</p>
</blockquote>
<p>Nein. Vor allem im Release Build sollte überhaupt kein Unterschied übrig bleiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2453747</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2453747</guid><dc:creator><![CDATA[Mechanics]]></dc:creator><pubDate>Sat, 16 May 2015 17:19:28 GMT</pubDate></item></channel></rss>