Devloghttps://devlog.stoepel.net/Christoph Stoepels EntwicklernotizenChristophFinanzenHobbyStatistikMoralisch verwerflich? <p> Ich lese ja regelmäßig die <em>Wirtschaftswoche</em> (WiWo). Die Meinungsartikel triefen oft neoliberal und sind entsprechend schwer zu ertragen. Der Journalismus hat aber hin und wieder einen Lichblick - womöglich Brotkrumen, die beim paywall-vernagelten Handelsblatt runterfallen. Jedenfalls lese ich dort dieses Jahr das hier: </p> <figure> <blockquote class="blockquote border-start border-4 px-2"> <p style="font-size:12px"> Die Organisation "Moral Rating Agency" führt eine Liste mit dem Namen "Dirty Dozen" – zwölf Konzerne, die sich angeblich aus Russland zurückgezogen haben, die aber in Wirklichkeit nach Informationen der "Moral Rating Agency" aber ein Großteil ihrer Geschäfte weiterlaufen lassen. Darunter bekannte Namen wie Unilever, Procter & Gamble, PepsiCo und Nestlé. Auch die Yale Universität führt eine "Liste der Schande". </p> </blockquote> <figcaption class="blockquote-footer text-end px-2"> <cite title="Wiwo.de"> <a href="https://www.wiwo.de/29348172.html">Wirtschaftswoche</a> am 23.08.2023 </cite> </figcaption> </figure> <p> Ui, ui, ui. Harte Worte: <em>Moral</em>, <em>schmutzig</em>, <em>aber</em>, <em>aber</em>, <em>Schande</em>. Naja, denke ich mir, Wirtschaftswoche eben. Aber Moment mal! Die vier Namen darin, die kommen mir doch irgendwie bekannt vor: Unilever, Procter & Gamble, PepsiCo und Nestlé. Woher nur? Aber ja! Das sind Konsumgüter Value-Aktien. Wenn man irgendetwas Robustes in seinem Depot haben wollte, das sich auch in Krisenzeiten stabil hält, dann würden die vermutlich in die engere Wahl kommen. Einen Sicherheitsanker habe ich ja selber. Also ganz genau gesagt, über die letzten 10 Jahre, vier Sicherheitsanker, nämlich: Unilever, Procter & Gamble, PepsiCo und Nestlé. </p> <p> Tja. Zufälle gibts! Zu meiner Verteidigung kann ich sagen, dass sie dieses Jahr nicht über-performed haben. Ich habe also nicht übermäßig von <a href="https://www.tagesschau.de/wirtschaft/finanzen/ezb-inflation-preiserhoehungen-gierflation-100.html">Gierflation</a> und Schande profitiert. Daher ja auch Sicherheitsanker (andere Erwartungshaltung). </p> <div id="imgFin2023" class="carousel slide mb-2" data-bs-ride="carousel"> <div class="carousel-inner mx-auto" style="width:480px"> <div class="carousel-item active" data-bs-interval="8000"> <img src="/images/2023/12/portfolio-treemap.webp" alt="Treemap Portfolio Allocation"> </div> <div class="carousel-item" data-bs-interval="8000"> <img src="/images/2023/12/portfolio-change.webp" alt="Chart Portfolio Change"> </div> </div> </div> <p> Die wenigen Einzelwerte, die ich aus Spaß noch halte, wollte ich unter 4% je Position laufen lassen. Da hat mir <em>Growth</em> (Technologie-Werte, allen voran Nvidia) aber einen Strich durch die Rechnung gemacht. Der Growth- und der Value-Anteil waren tatsächlich mal gleich groß bei jeweils ca. 15%. Nach dem Auseinanderlaufen wäre eigentlich ein Rebalancing fällig gewesen, aber ich war zu faul. Habe es einfach laufen lassen und nicht zu Gunsten von <em>Schande</em> oder ETF umgeschichtet. </p> <p> Damit bin ich dieses Jahr 2023 mit +26,25% internem Zinsfuß rausgegangen. Nach dem extrem <a href="/post/marktperformance-2022">schwachen letzten Jahr</a> pendelt sich der mehrjährige Schnitt wieder auf statistischem Mittelmaß ein. Erwartungsgemäß, möchte man sagen. Also alles gut im Depot und Grüße an Nvidia. Gute Arbeit, Leute! <p> Sun, 31 Dec 2023 10:15:00 +0100ChristophJavascriptWebAssembly Experiment <p> Schon länger wollte ich mal etwas mit <a href="https://webassembly.org/">WebAssembly</a> machen. <em>Number crunching</em> und performance-kritische Anwendung im Browser? Da bin ich dabei! Leider ist mir dazu nichts Realitätsnahes eingefallen (die klassische Schwierigkeit, wenn man zu einer Lösung das Problem sucht). Ich habe überlegt, ob man finanzmathematisch etwas implementieren könnte, aber über gleitende Durchschnitte oder Bezier-Splines mit 1000 Stützpunkten lacht sich ein Ryzen-Prozessor doch tot. Die üblichen Verdächtigen funktionieren locker in JavaScript. </p> <p> Also habe ich das <a href="https://de.wikipedia.org/wiki/Conways_Spiel_des_Lebens">Game of Life</a> von John H. Conway nochmal rausgekramt. Wie man das eben so macht, wenn man einfache Algorithmen auf größeren Datenmengen ausprobieren will. WebAssemblies (wasm) kann man in vielen Sprachen erzeugen. Ich habe es mit <a href="https://www.assemblyscript.org/">AssemblyScript</a> probiert. Der Trick daran ist, dass man das auch nach JavaScript übersetzen kann - wichtig für Vergleiche. Aber hier erstmal das Ergebnis: der Evolutionsschritt findet in WebAssembly statt, das Rendering in JavaScript, denn WebAssembly hat keinen Zugriff auf das HTML DOM. Also bekommt es das Spielfeld als typisiertes Array und gibt die nächste Generation zurück. JavaScript packt das dann in ein <a href="https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API">Canvas</a>. </p> <p id="game-of-life-host"> <img src="/images/2023/03/game-of-life.webp" class="d-block mx-auto" alt="Game of Life Screenshot"> </p> <p> Nerd-Hinweise: Ein Klick mit der linken Maustaste platziert einen sogenannten Gleiter, ein Klick mit der rechten Maustaste eine Gleiterkanone. Die Simulation wird gedrosselt auf rund 10 Generationen pro Sekunde. Wenn die Evolution zum Erliegen kommt, einfach die Seite <a href="javascript:window.location.reload();">neu laden</a>, um das Spielfeld zu resetten. </p> <p> Und hat sich der ganze Spaß nun gelohnt? Als Lernerfahrung schon, aus Performance-Sicht leider nicht. Für die Benchmark habe ich 1000 Generationen ungedrosselt laufen lassen, jeweils <em>ohne</em> Rendering, damit hier nicht die Grafikkarte oder die Rendering-Engine vom Browser dazwischen funkt. Es sollte die meiste Rechenzeit im Game-of-Life-Algorithmus verbracht werden und nicht in der Browser-Infrastruktur. Ich war vom Ergebnis so verblüfft, dass ich in zwei weiteren Browsern gegenprüfen musste. <em>WebAssembly ist signifikant langsamer als JavaScript.</em> </p> <table class="table table-sm"> <thead> <tr> <th></th> <th class="text-center">Firefox 110</th> <th class="text-center">Edge 110</th> <th class="text-center">Chrome 110</th> </tr> </thead> <tbody> <tr> <th>WebAssembly</th> <td class="text-end">4030 ms</td> <td class="text-end">10386 ms</td> <td class="text-end">15083 ms</td> </tr> <tr> <th>JavaScript</th> <td class="text-end">1019 ms</td> <td class="text-end">1096 ms</td> <td class="text-end">1077 ms</td> </tr> </tbody> </table> <p> Ich vermute, das Problem ist zu sehr datengebunden. Die Übergabe der Rohdaten (nach WebAssembly und wieder raus, <em>marshalling</em>) ist teurer als wirklich mit den Daten etwas zu tun (der Algorithmus). Das Game of Life mit mehr als 100000 Feldern ist immer noch zu anspruchslos, um damit irgendwelche Optimierungen in verschiedenen Programmiersprachen und Runtimes zu machen. </p> <p> Also Fazit: WebAssembly lohnt sich aus Performance-Sicht nicht pauschal. Vermutlich eher sehr selten. Ich denke, das ist etwas, wenn man existierenden Code in C++ oder Rust hat (Codecs, Krypto, Runtimes). Dann kann man den über Ecken auch im Browser ausführen. Wenn man eh neu entwickelt, kann man das auch direkt in JavaScript tun. Damit bin ich mir nicht mehr sicher, ob WebAssembly nicht nur ein modernes <a href="https://de.wikipedia.org/wiki/Adobe_Flash">Flash</a> oder Silverlight ist. Na mal sehen, ob da im Jahr 2030 noch ein Hahn nach kräht. </p> <script type="module" src="/images/2023/03/game-of-life.js"></script> Sat, 04 Mar 2023 10:00:00 +0100ChristophGrafikHobbyProgrammiertes Logo <p> Mir ist kürzlich aufgefallen, dass mein vor etwa 20 Jahren gebautes Logo seit ungefähr 10 Jahren nicht mehr zeitgemäß ist. Leider bin ich auch nie richtig grün mit Bildbearbeitungsprogrammen geworden. Ich glaube ich hatte das Logo deswegen seinerzeit auch bereits mit <a href="http://www.povray.org/">POV-Ray</a> gerendert, also quasi programmiert. Auf diese Art wollte ich mich auch an einem neuen Logo probieren. Ich habe mich dieses Mal für SVG (<a href="https://www.w3.org/TR/SVG11/">skalierbare Vektorgrafik</a>) entschieden, weil ich es mit einem Texteditor manipulieren kann oder mit einem Programm, das Texte manipuliert. </p> <p> Erste Idee: Es sollten idealerweise meine Initialen <em>CS</em> enthalten sein. Nun fällt auf, dass der obere Bogen des <code>S</code> ja schon ein <code>C</code> ist. Man muss das eine Zeichen innerhalb des anderen nur irgendwie sichtbar machen. Offensichtliche zweite Idee: andere Farbe! Ok, aber noch etwas subtiler wäre schön, zum Beispiel in der Geometrie. Geometrie? Geometrie? Da war doch was! Ich bin ja ein Fan von Mathematik im Allgemeinen und linearer Algebra im Besonderen. Außerdem glaube ich, dass visuelle Ästhetik unter anderem aus Mathematik kommt (Symmetrien, goldener Schnitt und Fraktale zum Beispiel). </p> <p> Also sollte das <code>S</code> mit dem eingebetteten <code>C</code> irgendwie schlau zerschnitten werden. Und hier kommt wieder die <a href="http://localhost:49682/post/spieleentwicklung-gestern-heute">Computergrafik</a> ins Spiel. Ich mag außerdem 3D-Renderings und Drahtgittermodelle und an dieser Stelle wird es extrem: ich habe einen 3D-Software-Renderer nach SVG geschrieben - also ein Programm, dem man Dinge aus 3D-Koordinaten (x, y, z) reingibt und das zweidimensionales SVG (x, y) ausgibt. Ganz ohne DirectX, OpenGL und Vulkan, stattdessen mit Modell-, Ansicht- und Projektionsmatrix, perspektivischer Division und Bildschirm-Transformation. Lange Rede kurz: Ich habe ein animierbares <a href="https://en.wikipedia.org/wiki/Octahedron">Octahedron</a> (Achtkant) hinter das <code>S</code> gepackt. Und damit ergibt sich ein "natürlicher" Schnitt in der Mitte. </p> <p> <img src="/images/2023/02/logo-full.webp" class="d-block mx-auto" alt="Logo-Grafik"> </p> <p> Die Schriftart habe ich bei <a href="https://fonts.google.com/">Google Fonts</a> gesucht und gefunden. Als MINT’ler sollte es für mich nur einigermaßen futuristisch aussehen. Das Fundstück habe ich im True Type Font (<a href="https://de.wikipedia.org/wiki/TrueType">TTF</a>) Format heruntergeladen und dort das <code>S</code> als Pfad-Spezifikation <a href="https://github.com/opentypejs/opentype.js">extrahiert</a>. Das ergibt also: </p> <ol> <li>3D-Octahedron nach 2D-SVG rendern.</li> <li>Darüber bündig den extrahierten S-Pfad legen (verschieben und skalieren bis es passt).</li> <li>Mit einem Texteditor den S-Pfad in zwei Pfade zerlegen sowie verschieden einfärben.</li> <li>Puh. Und als weiteren Spaß auch noch eine Animation integrieren, damit man sieht, dass es eigentlich 3D gemeint ist.</li> </ol> <p> Mit dem Ergebnis bin ich als Nicht-Grafiker zufrieden. Es ist zeitgemäß flach (wenig Details, keine Schattierungen) und funktioniert in Groß, Klein (als Icon) und sogar animiert. Ah, und es ist nicht gemalt sondern programmiert. </p> Sun, 12 Feb 2023 09:30:00 +0100ChristophFinanzenHobbyStatistikMarktperformance 2022 <p> Dies ist die Fortsetzung meines <a href="/post/marktperformance-2021">Marktrückblicks von 2021</a>, der wiederum eine Fortsetzung des <a href="/post/marktperformance-2020">Marktrückblicks von 2020</a> ist. Ich hatte es letztes Jahr schon beschrien: die Börsenentwicklung war da <em>so</em> gut, dass statistisch gesehen mal deutlich etwas in Abwärtsrichtung passieren musste. </p> <p> Und naja, was soll ich sagen? Wie niemandem entgangen sein dürfte, ging es abwärts. Bereinigt um Zu- und Abflüsse waren es in meinem Depot negative 19% Performance (exklusive Dividenden, die den Verlust noch leicht abmildern). Finanzmathematisch dürfte es sich bei meiner Berechnungsmethode um den <a href="https://de.wikipedia.org/wiki/Interner_Zinsfu%C3%9F">internen Zinsfuß</a> oder einen Verwandten davon handeln. </p> <picture> <source srcset="/images/2022/12/portfolio-change.webp" type="image/webp"> <source srcset="/images/2022/12/portfolio-change.png" type="image/png"> <img class="d-block mx-auto" style="width:480px; height:270px; margin-top: 0px;" src="/images/2022/12/portfolio-change.png" alt="Gewinn-Verlust-Chart-2022"> </picture> <p> Wie üblich und auch schon beim Corona-Crash 2020 habe ich die Gelegenheit zum außerordentlichen Nachkaufen genutzt. Tatsächlich stehen in diesem Jahr ausschließlich Nachkäufe in der Bilanz. Keine neuen Positionen und auch keine Verkäufe. Ich habe nirgends das Vertrauen verloren. Es ist es mir auch lieber, dass es jetzt kracht als später, denn beim vermeintlich Unvermeidlichen bin ich ungeduldig (Achtung: ich rechne Geduld in Quartalen, nicht in Stunden oder Tagen). Jetzt müsste man nur noch wissen, wann es überstanden ist. Zusammen mit meinem alten Kumpel <em>- der Statistik -</em> gehe ich insgesamt von 6 bis 12 mauen Quartalen aus. </p> <p> War 2022 also ein Reinfall, das erste von mehreren verlorenen Jahren? Nein. Abgesehen von der Beseitigung meines statistischen Unbehagens war es Kaufgelegenheit. Netto bin ich am Ende ungefähr bei 0 rausgekommen, das heißt ich habe Kursrückgänge durch Zukäufe kompensiert, jedoch nicht überkompensiert (dafür hatte ich dann doch nicht genügend Liquidität). Somit war es das erste Mal, dass mein Depot in absoluten Zahlen auf Jahressicht <em>nicht</em> gewachsen ist (ich bin seit 2014 an der Börse aktiv). Jedoch sehe ich die diesjährigen Zuflüsse als rabattierte Grundsteine für späteres Wachstum oder wie <a href="https://de.wikipedia.org/wiki/Andr%C3%A9_Kostolany"> André Kostolany</a> es ausdrückte: &raquo;Wer die Aktien nicht hat, wenn sie fallen, hat sie auch nicht, wenn sie steigen.&laquo;. </p> Sat, 31 Dec 2022 11:00:00 +0100ChristophC++GrafikSpielVisual-StudioEinfacher Ausbruch <p> Man sieht in der Software-Entwicklung immer wieder, dass die Leute eine technische Lösung einführen wollen und dann ihr Problem darauf anpassen (<em>technology driven development</em>). Wer kann es den Ingenieuren verdenken? Technologien machen Spaß, halten kreativ, schaffen Arbeit. Je komplexer desto mehr. So kommen Firmen dann zu Softwaresystemen, die am tatsächlichen Bedarf um ihrer selbst willen geschmeidig vorbei&shy;laufen. Weil ja das Problem erst noch an die Lösung angepasst werden muss, dieser Schritt dann aber nicht mehr gegangen wird, falls er denn überhaupt möglich ist. </p> <p> Warum erzähle ich das? Nun, ich habe das in meiner Freizeit natürlich auch so gemacht. Ich wollte mal wieder etwas mit Computergrafik, irgendwas mit Shadern entwickeln, also habe ich mir die Probleme <a href="/post/grafikperformance-samegame-physics">SameGame</a>, <a href="/post/ballspiel-trilogie">Ballout</a> und <a href="/post/snakegame-code-metriken">Snake</a> geschaffen. </p> <p> Jetzt war es aber mal an der Zeit, dem Minimalismus zu huldigen. Nehmen wir an, wir haben die Spielidee und wählen davon ausgehend die Werkzeuge! In diesem Fall ist mein Problem ein <a href="https://de.wikipedia.org/wiki/Breakout_(Computerspiel)">Breakout</a>-Klon und meine Lösung <em>ohne</em> prozedurale 3D-Geometrie, Beleuchtungsberechnung und Texturen. Einfach nur Rechtecke, Kreise und etwas Vektormathematik. Entwicklergolf sozusagen - wer die wenigsten Züge braucht, gewinnt. </p> <picture> <source srcset="/images/2022/03/breakout.webp" type="image/webp"> <source srcset="/images/2022/03/breakout.avif" type="image/avif"> <source srcset="/images/2022/03/breakout.png" type="image/png"> <img class="d-block mx-auto" style="width:480px; height:270px; border-top:1px solid #D7D7D7;" src="/images/2022/04/breakout.png" alt="Bildschirmfoto Breakout"> </picture> <p> Wenn man das so angeht, kommt schnell heraus, dass man die ganze Grafikkarten-Magie überhaupt nicht benötigt. Das ist auch irgendwie klar, es ging schon 1976 ohne. Man schreibt 2022 natürlich auch nicht mehr Assembler, aber man kann mal versuchen, sich auf die Bordmittel, in diesem Fall von MS Windows, zu beschränken. Es ist zugegebenermaßen etwas Augenwischerei: MS Windows ist, wenn man so will, die fetteste Abhängigkeit, die man sich überhaupt in ein Projekt holen kann. Für Spiele ist das meiner Ansicht nach okay und die Grundannahme ist hierbei, dass die zehntausenden Entwickler bei Microsoft ihre milliardenfach ausgerollte Komplexität einigermaßen im Griff haben. Hier also der Code-Umfang von <em>Breakout</em> in <a href="https://docs.microsoft.com/en-us/windows/win32/direct2d/direct2d-portal">Direct2D</a> für MS Windows. </p> <pre class="w-100 small p-1 bg-light overflow-hidden"><code><span class="text-primary">D:\Projects\Games</span> <span class="text-warning">[</span><span class="text-info">master</span><span class="text-warning">]</span>&gt; cloc.exe .\Breakout\ 35 text files. 35 unique files. 30 files ignored. <a href="https://github.com/AlDanial/cloc">github.com/AlDanial/cloc</a> v 1.90 T=0.10 s (235.4 files/s, 20617.1 lines/s) ------------------------------------------------------------------------------- Language files blank comment code ------------------------------------------------------------------------------- C++ 5 206 47 778 XML 7 0 0 361 C/C++ Header 8 65 23 204 Windows Resource File 1 51 63 163 JSON 2 0 0 53 ------------------------------------------------------------------------------- SUM: 23 322 133 1559 -------------------------------------------------------------------------------</code></pre> <p> Und schließlich die Downloads: <a href="https://christoph.stoepel.net/fwlink?id=271">Zip (32 Bit)</a> | <a href="https://christoph.stoepel.net/fwlink?id=272">Zip (64 Bit)</a>. Wie immer gilt: einfach entpacken und ausprobieren, keine Installation, keine Systemveränderungen. </p> Sat, 05 Mar 2022 10:30:00 +0100ChristophFinanzenHobbyStatistikMarktperformance 2021 <p> Dies ist die Fortsetzung meines <a href="/post/marktperformance-2020">Marktrückblicks von 2020</a>. Es lief 2021 sehr gut. Beängstigend gut. So gut, dass statistisch gesehen die nächsten Jahre ziemlich mau ausfallen müssen damit der langfristige Mittelwert wieder passt. Ich habe lange überlegt, wie die Veränderung von 34% zu interpretieren ist. <em>Wertsteigerung</em> oder doch eher <em>Kaufkraftverlust</em> (Inflation)? </p> <p> Da ich kein Volkswirt bin, muss ich mir hier mit einfacher Laienlogik helfen. Wertzuwachs hat für mich etwas von Leistung. Man hat eine besonders gute Strategie (Auswahl, Timing oder beides) und schlägt damit den Markt (dollargehandelter thesaurierender MSCI World dieses Jahr in &euro; bei 32,6%). Inflation passiert einfach, egal was man macht. Bezüglich ersterem hatte ich ja letztes Jahr den tollen Plan, immer wieder nachzukaufen. Das war sicherlich richtig. Aber <em>was</em> man kauft, war im wesentlichen bedeutungslos. 2021 war es nur wichtig, breit investiert zu sein. War ich. Ergo handelte es sich um massive (Vermögenspreis-)Inflation. </p> <p> <img src="/images/2021/12/portfolio-change.png" class="d-block mx-auto" alt="Gewinn-Verlust-Chart-2021" > </p> <p> Die Erkenntnis, dass Stock-Picking zu viel Aufwand für zu wenig Ertrag ist, reifte bei mir schon länger. Deswegen habe ich es dieses Jahr weitestgehend aufgegeben. Im Gegenteil, ähnlich wie bei <a href="/post/uber-softwarekomplexitat">Softwarekomplexität</a>, glaube ich nun auch für mein Depot: <em>einfacher ist besser</em>. Werte, die zu lange unter-performed haben (und von denen ich nicht mehr überzeugt bin), habe ich deswegen in den MSCI World umgeschichtet. Einzelwerte, die gut liefen (zum Beispiel <abbr title="Microsoft Corp.">MSFT</abbr>, <abbr title="NVIDIA Corp.">NVDA</abbr>, <abbr title="The Procter &amp; Gamble Company">PG</abbr>), habe ich natürlich laufen lassen. Ich bin jetzt aber auch nicht aktiver Rebalancer. Mein Plan für 2022 ist, den relativen Anteil der Einzelwerte durch Aufblähen der <a href="https://de.wikipedia.org/wiki/B%C3%B6rsengehandelter_Fonds">ETFs</a> (via Zuflüsse) zu reduzieren. An den nun insgesamt 12 Positionen in meinem Depot will ich festhalten. </p> <p> Ein paar Worte noch zu Anleihen. Ich habe das jetzt in 8 Jahren 4 mal probiert und bin nur einmal mit ganz wenig Gewinn da rausgegangen. Ok, die Verluste waren auch ganz wenig, aber nach meiner Erfahrung sind Anleihen keine sichere Kiste, die in jedes Depot gehören. Wenn eh Verluste nicht ausgeschlossen werden können, kann ich auch gleich defensive Aktien (Nestl&eacute;) oder ETFs nehmen. Also irgendwas habe ich hier nicht verstanden. Und ich geb's auch auf - Anleihen fasse ich nicht mehr an. </p> Thu, 30 Dec 2021 11:00:00 +0100ChristophC++GrafikSpielVisual-StudioDie Ballspiel-Trilogie <p> &raquo;Wann hast du eigentlich zuletzt einen <em>Arkustangens</em> benutzt?&laquo;<br /> &raquo;Na letzte Woche!&laquo; </p> <p> Ja okay, ich gebe es zu: davor auch einige Jahre nicht mehr. K&uuml;rzlich habe ich es gebraucht, um den Winkel zwischen einem Fixpunkt und dem Mauszeiger zu bestimmen. Konkreter den Winkel eines am Ende fixierten virtuellen Kanonenrohrs und seiner beweglichen M&uuml;ndung (gemessen zum Horizont). </p> <p> Der Leser ahnt es schon. Ein neues Spiel! Und ich nenne es <a href="https://christoph.stoepel.net/ViewSoftware?id=130">Ballout</a>. Es ist im wesentlichen ein Klon von <a href="https://de.wikipedia.org/wiki/Puzzle_Bobble">Puzzle Bobble</a> (manchmal auch <em>Bust a Move</em>), ich habe es nur nicht so getauft, um nicht in irgendwelche markenrechtlichen Schusslinien zu geraten. Es basiert wieder einmal auf der von mir selbst entwickelten <a href="/post/grafikperformance-samegame-physics">SameGame-Engine</a> und enth&auml;lt damit auch eine annehmbare physikalische Simulation. </p> <div id="imgBalloutMetrics" class="carousel slide" data-bs-ride="carousel"> <div class="carousel-inner"> <div class="carousel-item active" data-bs-interval="12500"> <picture> <source srcset="/images/2021/10/ballout.webp" type="image/webp"> <source srcset="/images/2021/10/ballout.png" type="image/png"> <img class="d-block mx-auto" style="width:480px; height:270px" src="/images/2021/10/ballout.png" alt="Bildschirmfoto"> </picture> </div> <div class="carousel-item" data-bs-interval="7500"> <img src="/images/2021/10/game-metrics.png" alt="Balkendiagramm" class="d-block mx-auto" style="width:480px; height:270px"> </div> </div> </div> <p> Nach <em>SameGame</em> und <a href="/post/snakegame-code-metriken">Snake</a> ist das nun schon das dritte Spiel auf dieser Technologie-Basis. Damit hat sich die Wiederverwendung wohl gelohnt - und nat&uuml;&uuml;&uuml;rlich war es von Anfang an als Trilogie geplant. Komplexit&auml;tsm&auml;&szlig;ig siedelt sich <em>Ballout</em> knapp &uuml;ber <em>Snake</em> an. Die Logik ist eben nicht &uuml;berm&auml;&szlig;ig extravagant wenn man die Physik und Grafik bereits einmal vorbereitet hat. </p> <p> Und jetzt nicht lange fackeln! Alle Spiele der Trilogie unter MS Windows ausprobieren: <a href="https://christoph.stoepel.net/fwlink?id=269">Zip (32 Bit)</a> | <a href="https://christoph.stoepel.net/fwlink?id=270">Zip (64 Bit)</a> </p> Tue, 12 Oct 2021 15:30:00 +0200ChristophC++GrafikSpielVisual-StudioSnakegame Code-Metriken <p> Kürzlich habe ich irgendwo einen Artikel gesehen: "Game Engine unter 50 MByte Größe". Das war als Werbung gedacht und der herausragende Punkt war also offensichtlich wie schlank der Code ist. Ich habe mich gefragt, ob die das ernst meinen. Dann wurde mir klar, dass die Entwickler vermutlich den Begriff <em>Engine</em> falsch benutzen. Ich kann nur vermuten, dass in dem Paket auch Resourcen (Modelle, Texturen, Audio) und natürlich Dokumentation mit drin sind. Mich hätte aber schon interessiert, was die Größe nur der Algorithmen einer schlanken Game Engine ist. </p> <p> Die Frage drängte sich umso mehr auf, weil ich ja vor Kurzem selbst wieder mit <a href="https://christoph.stoepel.net/ViewSoftware?id=102">SameGame</a> ein kleines Spiel geschrieben habe &dash; zugegeben ein sehr einfaches Spiel aber nichts desto trotz in modernem C++ mit GPU-Beschleunigung. Also nächster Schritt: den weitestgehend generischen Code in eine Bibliothek (<em>SameGame Engine</em>) ausgelagert und auf dieser Basis den Klassiker <em>Snake</em> nachgebaut. Am Ende sind alles nur Kugeln. Mittels <a href="https://github.com/AlDanial/cloc">cloc</a> habe ich schließlich die Codezeilen der Bibliotheken und Anwendungen durchgezählt, ausgenommen Kommentare und Leerzeilen. </p> <div id="imgSnakeMetrics" class="carousel slide" data-bs-ride="carousel"> <div class="carousel-inner"> <div class="carousel-item active" data-bs-interval="10000"> <img src="/images/2021/05/game-metrics.png" alt="Balkendiagramm" class="d-block mx-auto" style="width:480px; height:270px"> </div> <div class="carousel-item" data-bs-interval="5000"> <img src="/images/2021/05/snake.png" alt="Bildschirmfoto" class="d-block mx-auto" style="width:480px; height:270px"> </div> </div> </div> <p> Etwa ein Drittel von SameGame war allgemeiner Grafik-Code (Geometrie, Instancing), dazu noch etwas Dateibehandlung (Konfiguration und Highscores). Nicht extrahiert habe ich Physik und sowieso nicht verschiebbar war die SameGame-Spiellogik. Neu hinzu kam ein signifikanter Anteil an Visual Studio Boilerplate, aber um den muss man sich glücklicherweise nicht übermäßig selbst sorgen. So ist im Resultat der ausgelagerte Grafik-Code in etwa genauso groß wie die Snake-Logik. Oder anders ausgedrückt: Snake nur halb so groß wie es ohne wiederverwendete "Engine" wäre. </p> <p> Und hier noch die Downloads für MS Windows: <a href="https://christoph.stoepel.net/fwlink?id=265">Zip (32 Bit)</a> | <a href="https://christoph.stoepel.net/fwlink?id=266">Zip (64 Bit)</a> </p> Tue, 04 May 2021 16:00:00 +0200