<?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[3d array sehr schnell in Bitmap. Warum mit Scanline nicht schneller ?]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich möchte aus einem 3d array z.B. arraySat[1000][1000][36] möglichst schnell ein Bitmap erstellen. Mit Canvas-&gt;Pixels ist das sehr langsam. Habe gelesen, dass das ganze mit Scanline deutlich schneller funktionieren soll, leider ergibt sich bei mir daraus kein Geschwindigkeitsvorteil. Habe ich etwas falsch gemacht bei der Anwendung von Scanline. Gibt es eine Möglichkeit ein Array in einem Zug ohne Schleife in ein Bitmap zu transformieren.</p>
<p>MFG</p>
<p>Marc</p>
<pre><code class="language-cpp">Graphics::TBitmap *bmp_array = new Graphics::TBitmap();
bmp_array-&gt;Height      = zeile;
bmp_array-&gt;Width       = spalte;
bmp_array-&gt;PixelFormat = pf24bit;
RGBTRIPLE* t;

  for(int y = 0; y &lt; zeile; y++)
  {
    t = (RGBTRIPLE*)bmp_array-&gt;ScanLine[y];
    for(int x = 0; x &lt; spalte; x++)
    {
      t-&gt;rgbtBlue = (BYTE)arraySat[y][x][band1];
      t-&gt;rgbtGreen = (BYTE)arraySat[y][x][band2];
      t-&gt;rgbtRed = (BYTE)arraySat[y][x][band3];
      t++;
    }
  }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/93284/3d-array-sehr-schnell-in-bitmap-warum-mit-scanline-nicht-schneller</link><generator>RSS for Node</generator><lastBuildDate>Wed, 08 Jul 2026 23:53:12 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/93284.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 28 Nov 2004 08:46:40 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to 3d array sehr schnell in Bitmap. Warum mit Scanline nicht schneller ? on Sun, 28 Nov 2004 09:18:48 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich möchte aus einem 3d array z.B. arraySat[1000][1000][36] möglichst schnell ein Bitmap erstellen. Mit Canvas-&gt;Pixels ist das sehr langsam. Habe gelesen, dass das ganze mit Scanline deutlich schneller funktionieren soll, leider ergibt sich bei mir daraus kein Geschwindigkeitsvorteil. Habe ich etwas falsch gemacht bei der Anwendung von Scanline. Gibt es eine Möglichkeit ein Array in einem Zug ohne Schleife in ein Bitmap zu transformieren.</p>
<p>MFG</p>
<p>Marc</p>
<pre><code class="language-cpp">Graphics::TBitmap *bmp_array = new Graphics::TBitmap();
bmp_array-&gt;Height      = zeile;
bmp_array-&gt;Width       = spalte;
bmp_array-&gt;PixelFormat = pf24bit;
RGBTRIPLE* t;

  for(int y = 0; y &lt; zeile; y++)
  {
    t = (RGBTRIPLE*)bmp_array-&gt;ScanLine[y];
    for(int x = 0; x &lt; spalte; x++)
    {
      t-&gt;rgbtBlue = (BYTE)arraySat[y][x][band1];
      t-&gt;rgbtGreen = (BYTE)arraySat[y][x][band2];
      t-&gt;rgbtRed = (BYTE)arraySat[y][x][band3];
      t++;
    }
  }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/660911</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/660911</guid><dc:creator><![CDATA[MarcPlus]]></dc:creator><pubDate>Sun, 28 Nov 2004 09:18:48 GMT</pubDate></item><item><title><![CDATA[Reply to 3d array sehr schnell in Bitmap. Warum mit Scanline nicht schneller ? on Sun, 28 Nov 2004 09:43:06 GMT]]></title><description><![CDATA[<p>Du könntest versuchen, die Dimensionen des Arrays zu vertauschen, um evtl. eine besser Cache Auslastung zu erreichen. Aber vermutlich ist bei diesem byteweisen herumkopiere nicht viel zu machen, wirklich schnell können nur ausgerichtete 4 Byte-Blöcke kopiert werden, daher vermutlich der Scanline-Tipp. Und selbst dann hat es die CPU schwer mal eben Millionen von Pixeln umzukopieren.</p>
<p>Bye, TGGC (<a href="http://www.softgames.de/developia/viewiotd.php?cid=12351" rel="nofollow">Dem beste BdT</a>)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/660930</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/660930</guid><dc:creator><![CDATA[TGGC]]></dc:creator><pubDate>Sun, 28 Nov 2004 09:43:06 GMT</pubDate></item><item><title><![CDATA[Reply to 3d array sehr schnell in Bitmap. Warum mit Scanline nicht schneller ? on Sun, 28 Nov 2004 09:56:45 GMT]]></title><description><![CDATA[<p>Normalerweise sollte ein Zugriff per ScanLine schneller sein, alleine deswegen, weil er bei jedem Pixel[]-Zugriff die Pixel-Adresse neu aus den Koordinaten berechnet, anstatt einfach einen Zeiger zu inkrementieren.</p>
<p>Unabhängig von Scanline erzielt man bei solchen Vorgängen auf Vektoren oft erhebliche Gewinne, wenn man die Loops &quot;unrollt&quot;, um den Compiler bei der Parallelisierung zu unterstützen. Also in etwa:<br />
[cpp]<br />
<strong>u=t+1;</strong><br />
for(int x = 0; x &lt; spalte; <strong>x=x+2</strong> )<br />
{<br />
t-&gt;rgbtBlue = (BYTE)arraySat[y][x][band1];<br />
t-&gt;rgbtGreen = (BYTE)arraySat[y][x][band2];<br />
t-&gt;rgbtRed = (BYTE)arraySat[y][x][band3];<br />
u-&gt;rgbtBlue = (BYTE)arraySat[y][<strong>x+1</strong>][band1];<br />
u-&gt;rgbtGreen = (BYTE)arraySat[y][<strong>x+1</strong>][band2];<br />
u-&gt;rgbtRed = (BYTE)arraySat[y][<strong>x+1</strong>][band3];<br />
<strong>t=t+2;</strong><br />
<strong>u=u+2;</strong><br />
}<br />
// natürlich vorher gucken, ob &quot;spalte&quot; gerade Zahl ist, usw.<br />
[/cpp]<br />
Das wäre ein &quot;Unroll-Faktor&quot; von 2, weil pro Schleifendurchlauf zwei Vektor-Elemente bearbeitet werden. <strong>Zumindest bei größeren Feldern</strong> solltest du einen erheblichen Unterschied messen können. Probier' einfach mal unterschiedliche Unroll-Faktoren aus.</p>
<p>Google mal nach loop unrolling. Wichtig ist dabei, dass die Operationen innerhalb der Schleife voneinander <strong>unabhängig</strong> sind (und vom Compiler auch so erkannt werden), so dass sie gefahrlos parallelisiert werden können.</p>
<p>Na ja. Das können andere sicherlich besser erklären als ich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/660936</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/660936</guid><dc:creator><![CDATA[MagniFick]]></dc:creator><pubDate>Sun, 28 Nov 2004 09:56:45 GMT</pubDate></item><item><title><![CDATA[Reply to 3d array sehr schnell in Bitmap. Warum mit Scanline nicht schneller ? on Sun, 28 Nov 2004 10:00:11 GMT]]></title><description><![CDATA[<p>Mich würden die Ergebnisse interessieren: Mess doch einfach mal n Durchläufe für die verschiedenen Lösungsansätze! (Posten!)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/660940</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/660940</guid><dc:creator><![CDATA[MagniFick]]></dc:creator><pubDate>Sun, 28 Nov 2004 10:00:11 GMT</pubDate></item><item><title><![CDATA[Reply to 3d array sehr schnell in Bitmap. Warum mit Scanline nicht schneller ? on Sun, 28 Nov 2004 15:04:06 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>so komme gerade vom Umzug wieder und habe das mal schnell probiert mit den Unroll-Faktoren. Hat leider bisher noch keinen Geschwindigkeitsvorteil gebracht. Werde mal ein wenig zu dem Thema Googlen.</p>
<p>Vielleicht hat ja noch jemand einen anderen Vorschlag.</p>
<p>Grüße Marc</p>
]]></description><link>https://www.c-plusplus.net/forum/post/661159</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/661159</guid><dc:creator><![CDATA[MarcPlus]]></dc:creator><pubDate>Sun, 28 Nov 2004 15:04:06 GMT</pubDate></item><item><title><![CDATA[Reply to 3d array sehr schnell in Bitmap. Warum mit Scanline nicht schneller ? on Sun, 28 Nov 2004 22:20:47 GMT]]></title><description><![CDATA[<p>Einfach den ganzen Block mit memcpy rüberrkopulieren?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/661430</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/661430</guid><dc:creator><![CDATA[Tempelritter]]></dc:creator><pubDate>Sun, 28 Nov 2004 22:20:47 GMT</pubDate></item><item><title><![CDATA[Reply to 3d array sehr schnell in Bitmap. Warum mit Scanline nicht schneller ? on Mon, 29 Nov 2004 18:46:16 GMT]]></title><description><![CDATA[<p>Mein Problem ist, daß ich ein 3d-Array habe welches nicht linear erstellt wurde, sondern per Schleife eingeladen wurde.</p>
<pre><code class="language-cpp">// Bereitstellen des PLatzes fuer die m int-Zeiger ( = zeilen)
matrix3db = new unsigned char **[zeile];
for (i_image = 0; i_image &lt; zeile; i_image++)
  {
    // Bereitstellen des Platzes für die n Spalten der i.ten zeile
    matrix3db[i_image] = new unsigned char*[spalte];
    }

  for (i_image2 = 0; i_image2 &lt; zeile; i_image2++)
  { for (i_image3 = 0; i_image3 &lt; spalte; i_image3++)
  {

    // Bereitstellen des Platzes für dim
    matrix3db[i_image2][i_image3] = new unsigned char[dim];
</code></pre>
<p>Wenn ich jetzt einzelne Bänder (z. B. [zeile][spalte][2], [zeile][spalte][4] ) daraus per memcpy kopieren möchte funktioniert das wohl nicht. Sprich, ich müßte meine Speicherfreigabe ändern und das ganze linear einlesen. Das wäre aber sehr unbefriedigend, derweilen meine ganzen anderen Routinen und die Daten auf diese Speicherverwaltung ausgerichtet sind. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /><br />
oder gibt es eine Möglichkeit auch auf den wie oben beschriebenen Speicherblock den memcpy Befehl auszuführen</p>
<p>Grüße Marc</p>
]]></description><link>https://www.c-plusplus.net/forum/post/662162</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/662162</guid><dc:creator><![CDATA[MarcPlus]]></dc:creator><pubDate>Mon, 29 Nov 2004 18:46:16 GMT</pubDate></item><item><title><![CDATA[Reply to 3d array sehr schnell in Bitmap. Warum mit Scanline nicht schneller ? on Wed, 01 Dec 2004 10:21:01 GMT]]></title><description><![CDATA[<p>naja, wenn du sauber die oop durchgehalten hast, sollte es kein thema sein die zugrunde liegende datenstruktur (hier deine matrix) auf ein anderes format umzustellen.</p>
<p>du kannst hier immer nur die 3. dimension per memcpy herumkopieren. desweiteren solltest du auf zeiger-arithmetik umsteigen um die verwendung der index-operatoren ([]) zu verhindern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/663434</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/663434</guid><dc:creator><![CDATA[Sunday]]></dc:creator><pubDate>Wed, 01 Dec 2004 10:21:01 GMT</pubDate></item></channel></rss>