<?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[Schnelles anzeigen von Bitmaps]]></title><description><![CDATA[<p>Hallo,<br />
Hab da mal eine Frage bezüglich des schnellen Darstellens von Bitmaps.<br />
Ich möchte in einem zeitkritischen System viele Bilder hintereinander anzeigen lassen. Die Bildinformationen stehen dabei in einem char Array (imageBits) zur Verfügung.</p>
<p>Momentan mach ich das mit BitBlt bzw. StretchBlt.<br />
Hier mal mein Codebeispiel:</p>
<pre><code class="language-cpp">SetDIBits(client_capAlterDC,client_hbmScreen,0,texSizeY,imageBits,(BITMAPINFO*)&amp;bi,DIB_RGB_COLORS);

if (display_mode == 0) 
{
	SetStretchBltMode(client_hWndDC,COLORONCOLOR);
	StretchBlt(client_hWndDC,0,0,g_ClientSizeX,g_ClientSizeY,client_capAlterDC,0,0,texSizeX,texSizeY,SRCCOPY);
}
else if (display_mode == 1) 
{
	BitBlt( client_hWndDC, 0, 0, g_ClientSizeX, g_ClientSizeY, client_capAlterDC, 0, 0, SRCCOPY);
}
</code></pre>
<p>Das funktioniert auch ganz gut, nur ist es viel zu langsam. Laut Messungen mittels GetTickCount() hab ich rausgefunden, das da 30-40 ms benötigt werden um ein Bild anzeigen zu lassen.<br />
Is natürlich viel zu viel.</p>
<p>Gibt es Alternativen zu den beiden Methoden, die sehr viel schneller arbeiten?</p>
<p>Hatte auch schon die Idee gehabt, das ganze mit DirectDraw zu machen, nur hab ich davon keine blassen Schimmer.</p>
<p>Bin für Ideen und Tips dankbar.<br />
Schönen Gruß<br />
<a href="http://Stone.mk" rel="nofollow">Stone.mk</a></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/157496/schnelles-anzeigen-von-bitmaps</link><generator>RSS for Node</generator><lastBuildDate>Wed, 22 Jul 2026 13:45:08 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/157496.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 26 Aug 2006 15:02:49 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Schnelles anzeigen von Bitmaps on Sat, 26 Aug 2006 15:02:49 GMT]]></title><description><![CDATA[<p>Hallo,<br />
Hab da mal eine Frage bezüglich des schnellen Darstellens von Bitmaps.<br />
Ich möchte in einem zeitkritischen System viele Bilder hintereinander anzeigen lassen. Die Bildinformationen stehen dabei in einem char Array (imageBits) zur Verfügung.</p>
<p>Momentan mach ich das mit BitBlt bzw. StretchBlt.<br />
Hier mal mein Codebeispiel:</p>
<pre><code class="language-cpp">SetDIBits(client_capAlterDC,client_hbmScreen,0,texSizeY,imageBits,(BITMAPINFO*)&amp;bi,DIB_RGB_COLORS);

if (display_mode == 0) 
{
	SetStretchBltMode(client_hWndDC,COLORONCOLOR);
	StretchBlt(client_hWndDC,0,0,g_ClientSizeX,g_ClientSizeY,client_capAlterDC,0,0,texSizeX,texSizeY,SRCCOPY);
}
else if (display_mode == 1) 
{
	BitBlt( client_hWndDC, 0, 0, g_ClientSizeX, g_ClientSizeY, client_capAlterDC, 0, 0, SRCCOPY);
}
</code></pre>
<p>Das funktioniert auch ganz gut, nur ist es viel zu langsam. Laut Messungen mittels GetTickCount() hab ich rausgefunden, das da 30-40 ms benötigt werden um ein Bild anzeigen zu lassen.<br />
Is natürlich viel zu viel.</p>
<p>Gibt es Alternativen zu den beiden Methoden, die sehr viel schneller arbeiten?</p>
<p>Hatte auch schon die Idee gehabt, das ganze mit DirectDraw zu machen, nur hab ich davon keine blassen Schimmer.</p>
<p>Bin für Ideen und Tips dankbar.<br />
Schönen Gruß<br />
<a href="http://Stone.mk" rel="nofollow">Stone.mk</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1124963</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1124963</guid><dc:creator><![CDATA[stone.mk]]></dc:creator><pubDate>Sat, 26 Aug 2006 15:02:49 GMT</pubDate></item><item><title><![CDATA[Reply to Schnelles anzeigen von Bitmaps on Sat, 26 Aug 2006 15:19:43 GMT]]></title><description><![CDATA[<p>hm... also ich glaub, bitblt is schon das schnellste was geht mit der GDI, vielleicht kann GDI+ mehr. Aber bitblt kopiert doch eigentlich nur den Inhalt rüber, von daher, ich denk ma liegt an windows. Mit DirectDraw gehts sicherlich schneller, oder SDL, wenn man das in ein fenster kriegen kann. Ich glaub SDL is leichter zu lernen, wennd ddraw gar nich kannst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1124971</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1124971</guid><dc:creator><![CDATA[Maxi]]></dc:creator><pubDate>Sat, 26 Aug 2006 15:19:43 GMT</pubDate></item><item><title><![CDATA[Reply to Schnelles anzeigen von Bitmaps on Sat, 26 Aug 2006 15:28:03 GMT]]></title><description><![CDATA[<p>hm, es muss nicht Fullscreen sein. Momentan wird das ganze auch in einem Fenster dargestellt.<br />
Da klingt SDL gar nicht mal schlecht.</p>
<p>Wie würde denn sowas mit SDL aussehen? Kann man SDL leicht einbinden?<br />
Oder haste vielleicht ein paar Tutorials zu dem Thema?</p>
<p>Vielen Dank erst mal.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1124975</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1124975</guid><dc:creator><![CDATA[stone.mk]]></dc:creator><pubDate>Sat, 26 Aug 2006 15:28:03 GMT</pubDate></item><item><title><![CDATA[Reply to Schnelles anzeigen von Bitmaps on Sat, 26 Aug 2006 15:29:04 GMT]]></title><description><![CDATA[<p>Probier mal die DrawDib-Funktionen:</p>
<blockquote>
<p>The DrawDib functions provide high performance image-drawing capabilities for device-independent bitmaps (DIBs). DrawDib functions support DIBs of 8-bit, 16-bit, 24-bit, and 32-bit image depths.</p>
<p>DrawDib functions write directly to video memory. They do not rely on functions of the graphics device interface (GDI).</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/1124978</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1124978</guid><dc:creator><![CDATA[geeky]]></dc:creator><pubDate>Sat, 26 Aug 2006 15:29:04 GMT</pubDate></item><item><title><![CDATA[Reply to Schnelles anzeigen von Bitmaps on Sat, 26 Aug 2006 16:07:21 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/41">@geeky</a><br />
hab grad mal DrawDib ausprobiert, nur wird mir nix angezeigt.<br />
Habs so probiert:</p>
<pre><code class="language-cpp">HDRAWDIB hdd;
hdd = DrawDibOpen();

LPBITMAPINFOHEADER lpbi;

DrawDibDraw(hdd, client_hWndDC, 0, 0, g_ClientSizeX, g_ClientSizeY, lpbi, imageBits, 0, 0, texSizeX, texSizeY, 0);
</code></pre>
<p>Wo könnte der Fehler liegen?<br />
Vielen Dank<br />
<a href="http://stone.mk" rel="nofollow">stone.mk</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1124997</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1124997</guid><dc:creator><![CDATA[stone.mk]]></dc:creator><pubDate>Sat, 26 Aug 2006 16:07:21 GMT</pubDate></item><item><title><![CDATA[Reply to Schnelles anzeigen von Bitmaps on Sat, 26 Aug 2006 16:26:43 GMT]]></title><description><![CDATA[<p>Du füllst die BITMAPINFOHEADER Struktur nicht aus, sondern übergibst nicht nen nicht initialisierten Pointer.</p>
<p>Übrigens aufpassen: Die Funktion zeichnet direkt auf den Screen, d.h. du übermalst möglicherweise Fenster.<br />
Außerdem sind die Dst-Angaben Screen-Koordinaten und beziehen sich nicht aufs DC!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1125012</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1125012</guid><dc:creator><![CDATA[geeky]]></dc:creator><pubDate>Sat, 26 Aug 2006 16:26:43 GMT</pubDate></item><item><title><![CDATA[Reply to Schnelles anzeigen von Bitmaps on Sat, 26 Aug 2006 16:27:13 GMT]]></title><description><![CDATA[<p>Wie müßte diese LPBITMAPINFOHEADER Struktur denn aussehen?<br />
Was muss man denn da reinschreiben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1125015</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1125015</guid><dc:creator><![CDATA[stone.mk]]></dc:creator><pubDate>Sat, 26 Aug 2006 16:27:13 GMT</pubDate></item><item><title><![CDATA[Reply to Schnelles anzeigen von Bitmaps on Sat, 26 Aug 2006 16:37:51 GMT]]></title><description><![CDATA[<p>Bei SetDIBits() füllst du auch BITMAPINFO aus ?<br />
Darin ist soviel ich weiss die BITMAPINFOHEADER-Struktur enthalten (bmiHeader oder so).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1125020</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1125020</guid><dc:creator><![CDATA[geeky]]></dc:creator><pubDate>Sat, 26 Aug 2006 16:37:51 GMT</pubDate></item><item><title><![CDATA[Reply to Schnelles anzeigen von Bitmaps on Sat, 26 Aug 2006 16:49:54 GMT]]></title><description><![CDATA[<p>Wenn du da noch Child-Fenster oder sowas drüber legen willst, würde ich die DrawDib-Methode lieber nicht verwenden.</p>
<p>Wenn es nen Spiel oder sowas wird, wäre vermutlich günstiger gleich DirectX oder ähnliches zu verwenden.</p>
<p>Ansonsten lässt sich BitBlt noch beschleunigen, wenn die Pixeldaten vorher in DDBs mit gleicher Farbtiefe wie der Display-DC vorbereitet werden.</p>
<p>Hmm, du könntest auch die Performance von StretchDIBits() testen!!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1125033</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1125033</guid><dc:creator><![CDATA[geeky]]></dc:creator><pubDate>Sat, 26 Aug 2006 16:49:54 GMT</pubDate></item><item><title><![CDATA[Reply to Schnelles anzeigen von Bitmaps on Sat, 26 Aug 2006 16:50:28 GMT]]></title><description><![CDATA[<p>habs jetzt so gemacht:</p>
<pre><code class="language-cpp">LPBITMAPINFOHEADER lpbi;
lpbi-&gt;biSize        = sizeof(BITMAPINFOHEADER);
lpbi-&gt;biWidth       = texSizeX;
lpbi-&gt;biHeight      = texSizeY;
lpbi-&gt;biPlanes      = 1;
lpbi-&gt;biBitCount    = channels * 8;
lpbi-&gt;biCompression = BI_RGB;

DrawDibDraw(hdd, client_hWndDC, 0, 0, g_ClientSizeX, g_ClientSizeY, lpbi, serverOGLBits, 0, 0, texSizeX, texSizeY, 0);
</code></pre>
<p>Allerding wird immer noch nix angezeigt.<br />
Woran könnts liegen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1125034</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1125034</guid><dc:creator><![CDATA[stone.mk]]></dc:creator><pubDate>Sat, 26 Aug 2006 16:50:28 GMT</pubDate></item><item><title><![CDATA[Reply to Schnelles anzeigen von Bitmaps on Sat, 26 Aug 2006 16:59:51 GMT]]></title><description><![CDATA[<p>Child-Fenster weden nicht verwendet, nur das einen Hauptfenster. Wird auch kein Spiel werden. StretchDIBits() hab ich auch schon getestet, was auch nicht viel schneller lief.</p>
<p>Unabhängig davon, wie könnte ich denn die Daten in DDBs mit gleicher Farbtiefe umwandeln?</p>
<p>Danke<br />
<a href="http://stone.mk" rel="nofollow">stone.mk</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1125041</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1125041</guid><dc:creator><![CDATA[stone.mk]]></dc:creator><pubDate>Sat, 26 Aug 2006 16:59:51 GMT</pubDate></item><item><title><![CDATA[Reply to Schnelles anzeigen von Bitmaps on Sat, 26 Aug 2006 17:00:05 GMT]]></title><description><![CDATA[<p>LPBITMAPINFOHEADER ist ein Pointer!<br />
Zitat MSDN: &quot;Most of the pointer-type names begin with a prefix of P or LP&quot;</p>
<p>LPBITMAPINFOHEADER ist demnach ein Pointer auf eine BITMAPINFOHEADER-Struktur.<br />
So nur zeigt ein nicht-intialisierter Pointer nach irgendwo im Ram!<br />
Du schreibst also quasi die Daten der Struktur einfach irgendwo in den RAM!<br />
Das könnte Zugriffsverletzungen geben!<br />
Wenn Du es so schreibst:</p>
<pre><code class="language-cpp">BITMAPINFOHEADER bi;
lpbi.biSize        = sizeof(BITMAPINFOHEADER);
lpbi.biWidth       = texSizeX;
lpbi.biHeight      = texSizeY;
lpbi.biPlanes      = 1;
lpbi.biBitCount    = channels * 8;
lpbi.biCompression = BI_RGB;

DrawDibDraw(hdd, client_hWndDC, 0, 0, g_ClientSizeX, g_ClientSizeY, &amp;bi, serverOGLBits, 0, 0, texSizeX, texSizeY, 0);
</code></pre>
<p>..dengelt es der Compiler das Speicher für die Struktur reserviert wird und mittels &amp; kriegst du den Pointer auf die BITMAPINFOHEADER-Struktur im Speicher.</p>
<p>Was mir ansonsten noch einfallen könnte:<br />
Möglicherweise musst du noch biSizeImage ausfüllen.<br />
Wird FALSE zurückgegeben ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1125043</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1125043</guid><dc:creator><![CDATA[geeky]]></dc:creator><pubDate>Sat, 26 Aug 2006 17:00:05 GMT</pubDate></item><item><title><![CDATA[Reply to Schnelles anzeigen von Bitmaps on Sat, 26 Aug 2006 17:06:09 GMT]]></title><description><![CDATA[<p><a href="http://stone.mk" rel="nofollow">stone.mk</a> schrieb:</p>
<blockquote>
<p>Unabhängig davon, wie könnte ich denn die Daten in DDBs mit gleicher Farbtiefe umwandeln?</p>
</blockquote>
<p>Wieviele Bilder willst du denn darstellen ? Wird das ne Animation ?</p>
<p>Ich würde es vermutlich so machen:<br />
Mit CreateCompatibleDC() nen temporären DC erzeugen.<br />
Mittels CreateCompatibleBitmap() ne DDB erzeugen.<br />
DDB in das temp. DC selektieren.<br />
Mittels StretchDIBits() die DIB in das temporäre DC und somit auf die DDB blitten.<br />
Fertig.</p>
<p>Sowas hab ich zuletzt auf nem alten 400 mhz rechner gemacht, hat da noch bei ner 1024x768 Bitmap etwa 10ms später beim blitten der DDBs gegenüber der DIBs gebracht, ob das heutzutage wirklich noch was bringt glaube ich eigentlich auch nicht mehr wirklich.</p>
<p>Nachteil natürlich: Es wird zwar später wenn du Glück hast (also nichtmal sicher) schnell, aber dafür dauert es natürlich vorher länger und frisst RAM.</p>
<p>Wenn du die Daten zur Laufzeit irgendwoher beziehst und direkt anzeigen willst, bringt das rein gar nichts so.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1125048</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1125048</guid><dc:creator><![CDATA[geeky]]></dc:creator><pubDate>Sat, 26 Aug 2006 17:06:09 GMT</pubDate></item><item><title><![CDATA[Reply to Schnelles anzeigen von Bitmaps on Sat, 26 Aug 2006 17:17:04 GMT]]></title><description><![CDATA[<p>Es sollen so ca. 20 Bilder pro Sekunde angezeigt werden (also ne Animation), die zur Laufzeit generiert werden.</p>
<p>Also es funktioniert jetzt mit DrawDibDraw.<br />
Hab auch bleich mal die Performance im Vergleich zu StretchBlt getestet.</p>
<p>mit StretchBlt braucht er für ein Bild 1024x1024 ca. 31-32 ms<br />
mit DrawDibDraw braucht er für ein Bild 1024x1024 ca. 15-16 ms</p>
<p>was ja schon mal eine verbesserung ist. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":-)"
      alt="🙂"
    /><br />
Werd demnächst mal testen, ob das mit SDL noch schneller geht.</p>
<p>Vielen Dank erstmal für deine Hilfe und deine Zeit.<br />
Gruß <a href="http://stone.mk" rel="nofollow">stone.mk</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1125053</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1125053</guid><dc:creator><![CDATA[stone.mk]]></dc:creator><pubDate>Sat, 26 Aug 2006 17:17:04 GMT</pubDate></item><item><title><![CDATA[Reply to Schnelles anzeigen von Bitmaps on Sat, 26 Aug 2006 17:21:35 GMT]]></title><description><![CDATA[<p>Die BITMAPINFOSTRUKTUR kannste z.B. noch global machen bzw. aus der Zeichen-Funktion raushauen und einmal ausfüllen, dann frisst die Speicherreservierung dafür schonmal keine Zeit mehr, falls du das nicht sowieso schon machst.<br />
Vermutlich lässt sich am meisten Performance gewinnen, wenn du irgendwie den Zeichenbereich verkleinern kannst. Wenn sich das Bild z.B. nur oben rechts irgendwo ändert, sollte auch nur der geänderte Bereich neu gezeichnet werden und nicht gleich alles...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1125058</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1125058</guid><dc:creator><![CDATA[geeky]]></dc:creator><pubDate>Sat, 26 Aug 2006 17:21:35 GMT</pubDate></item><item><title><![CDATA[Reply to Schnelles anzeigen von Bitmaps on Sat, 26 Aug 2006 17:28:57 GMT]]></title><description><![CDATA[<p>Die Bitmapinfostruktur mach ich nur einmal am Anfang.<br />
Leider ändert sich das Bild immer komplett, so das man da nix kleiner machen könnte.</p>
<p>Hab jetzt noch bissel rumgetestet. Läuft ganz prima. Ist auch ein ganzes stück schneller geworden.</p>
<p>Besten Dank für die Tips</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1125065</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1125065</guid><dc:creator><![CDATA[stone.mk]]></dc:creator><pubDate>Sat, 26 Aug 2006 17:28:57 GMT</pubDate></item><item><title><![CDATA[Reply to Schnelles anzeigen von Bitmaps on Sat, 26 Aug 2006 21:03:36 GMT]]></title><description><![CDATA[<p>Wenn du etwas Zeitkritisches vor hast, würde ich nicht die GDI benutzen. Zwar unterstützt dein Prozessor das Blitting sogar Hardwaremäßig, allerdings ist es trotzdem alles etwas langsam, da die Berechnungen hauptsächlich über den Prozessor laufen.<br />
Benutze am Besten eine Schnittstelle die die Grafikbeschleunigung deiner Grafikkarte nutzt wie z.B. DirectX. Der vorteil ist, dass während die Grafikkarte rechnet, der Prozessor bereits andere Dinge erledigen kann.</p>
<p>DirectDraw gibt es nichtmehr, da es mit Direct3D zusammengelegt worden ist. Man kann aber nach wievor auf dessen Funktionen zugreifen. Ich denke mal wenn du nur 2 Dimensionale Bitmaps darstellen willst und das auch noch möglichst schnell, solltest du damit gut bedient werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1125154</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1125154</guid><dc:creator><![CDATA[Perner]]></dc:creator><pubDate>Sat, 26 Aug 2006 21:03:36 GMT</pubDate></item><item><title><![CDATA[Reply to Schnelles anzeigen von Bitmaps on Sun, 27 Aug 2006 21:12:19 GMT]]></title><description><![CDATA[<p>Btw: Wie sieht die Performance im Vergleich zu BitBlit() aus?</p>
<p>Ich habe eben mal damit rumgespielt, aber keine Verbesserung zwischen DrawDib und BitBlit feststellen können ..<br />
(Ich kannte die Möglichkeit bisher gar nicht.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1125757</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1125757</guid><dc:creator><![CDATA[don_basto]]></dc:creator><pubDate>Sun, 27 Aug 2006 21:12:19 GMT</pubDate></item></channel></rss>