{"id":12717,"date":"2021-02-28T17:51:03","date_gmt":"2021-02-28T16:51:03","guid":{"rendered":"https:\/\/blog.mi.hdm-stuttgart.de\/?p=12717"},"modified":"2023-06-18T18:06:08","modified_gmt":"2023-06-18T16:06:08","slug":"flutter-code-optimierung","status":"publish","type":"post","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2021\/02\/28\/flutter-code-optimierung\/","title":{"rendered":"Flutter Code Optimierung"},"content":{"rendered":"\n<p>Dieser Blogeintrag befasst sich mit Optimierungsm\u00f6glichkeiten des Flutter Frameworks. Innerhalb des Blogeintrag wird darauf eingegangen was Flutter ist, warum Applikationen optimiert werden sollen und die Vorgehensweise anhand von Beispielen erl\u00e4utert.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Was ist Flutter?<\/strong><\/h2>\n\n\n\n<p>Flutter ist ein Framework von Google, welches auf den Programmiersprachen Dart, C, C++ basiert und zur Entwicklung von Nativen Cross-Platform-Apps verwendet wird. Zielplattformen sind dabei Android, IOS, Windows, MacOS, Linux, WebApp und Fuchsia.<\/p>\n\n\n\n<p>Applikationen&nbsp; die mit dem Flutter Framework&nbsp; entwickelt werden, werden in Dart geschrieben. Innerhalb dieser Entwicklung wird mittels Widgets gearbeitet. Widgets k\u00f6nnen dabei stateful und stateless arbeiten.<\/p>\n\n\n\n<p>Stateless Widgets beinhalten Kontent, welcher einmal gebaut wird und sich dann nicht mehr \u00e4ndert.<\/p>\n\n\n\n<p>Stateful Widgets sind dabei Widgets, welche interaktiv mit dem Nutzer agieren oder sich \u00e4ndern&nbsp; k\u00f6nnen, wenn sie neue Daten erhalten.&nbsp; Der Zustand eines Widgets wird dabei von der visuellen Darstellung getrennt. Wenn sich der Zustand des Widgets \u00e4ndert, ruft das State-Objekt die Methode \u201csetState()\u201d auf und weist das Framework an, das Widget neu zu zeichnen.<\/p>\n\n\n\n<p>Diese Widgets stellen sp\u00e4ter auch Teile der Oberfl\u00e4che dar. Neben einem vom Betriebssystem abh\u00e4ngigen Design, wie Material f\u00fcr Googles Android oder Cupertino f\u00fcr Apples IOS, beinhalten Widgets auch Logik, welche das Verhalten auf Gesten,&nbsp; die Datenverarbeitung und Animationen definiert. Diese Widgets k\u00f6nnen dabei auch verschachtelt werden und bilden dabei logisch eine&nbsp;Baumstruktur. &nbsp; &nbsp;<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/image5.png\"><img loading=\"lazy\" decoding=\"async\" width=\"600\" height=\"527\" data-attachment-id=\"12728\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2021\/02\/28\/flutter-code-optimierung\/image5-3\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/image5.png\" data-orig-size=\"600,527\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image5\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/image5.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/image5.png\" alt=\"\" class=\"wp-image-12728\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/image5.png 600w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/image5-300x264.png 300w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/a><figcaption>Abbildung 1: Beispielhafte Baumstruktur verschachtelter Widgets<\/figcaption><\/figure><\/div>\n\n\n\n<p>Code, der in Flutter geschrieben wurde, wird in der Flutter Engine verarbeitet.&nbsp; Der Quellcode&nbsp; kann mit Dart 2 Native als Ahead of Time (AOT) native \u00fcbersetzt werden oder mit der Dart-VM als Just in Time (JIT) ausgef\u00fchrt werden. Just in Time \u00fcbersetzter Code ist beim Start langsamer, kann aber eine bessere Spitzenleistung aufweisen, wenn er lange genug l\u00e4uft, sodass Laufzeitoptimierungen angewendet werden k\u00f6nnen.   [1,2,3,4,5]<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Warum Codeoptimierung?<\/strong><\/h2>\n\n\n\n<p>Flutter wurde zu Beginn entwickelt um auf mobilen Ger\u00e4ten Anwendung zu finden. Google wollte dabei die Barriere zwischen den Systemen brechen, damit Code nicht doppelt geschrieben werden muss und so Kosten in der Entwicklung eingespart werden k\u00f6nnen.<br>Dabei ist es jedoch gerade bei mobilen Plattformen wichtig, dass Code performant und optimiert l\u00e4uft, denn nicht optimierter Code kann dazu f\u00fchren, dass:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Applikationen, mehr Leistung und somit auch mehr Akkukapazit\u00e4t ben\u00f6tigen.&nbsp;<\/li><li>die Bedienung oft tr\u00e4ge wirkt durch Ruckler oder l\u00e4ngere Ladezeiten.<\/li><li>mehr Speicher oder Rechenleistung ben\u00f6tigt wird, welcher gerade bei \u00e4lteren Ger\u00e4ten im mobilen Bereich nicht zur Verf\u00fcgung steht.&nbsp;<\/li><li>mehr Datenvolumen bei der \u00dcbertragung ben\u00f6tigt wird.<\/li><\/ul>\n\n\n\n<p>Allein diese Gr\u00fcnden k\u00f6nnen dazu f\u00fchren, dass der Nutzer mit einer Applikation unzufrieden ist, sie nicht oder wenig nutzt oder gar deinstalliert und sich eine Alternative sucht. F\u00fcr den Entwickler hei\u00dft dies demzufolge fehlende Nutzer und daraus resultieren fehlende Einnahmen. [6,7,8]<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Codeoptimierung, was kann ich als Entwickler tun?<\/strong><\/h2>\n\n\n\n<p>Generell sollte beim Optimieren die Frage gestellt werden, wo der Code ausgef\u00fchrt wird. Eine Flutteranwendung nutzt standardm\u00e4\u00dfig folgende drei Threatarten, auf welche kurz eingegangen werden soll:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>UI-Thread: Dies ist der Main Thread, welcher Widgets verarbeitet. Er wird von einer Ereignisschleife gesteuert. Die Ereignisschleife von Flutter ist \u00e4quivalent zu Androids Main-Looper. Dieser Thread darf nicht blockiert werden! Er wird in der unteren Zeile des Performance-Overlays angezeigt.<\/li><li>Raster-Thread: Verarbeitet das Rendern und die Darstellung von Bildern. Es ist nicht m\u00f6glich&nbsp; direkt auf dem Raster-Thread oder seine Daten zuzugreifen, aber wenn dieser Thread langsam ist, resultiert dies von etwas, was im Dart-Code gemacht wurde. Die Grafikbibliothek Skia l\u00e4uft auf diesem Thread. Dieser wird in der oberen Zeile des Performance-Overlays angezeigt. Dieser Thread war fr\u00fcher als &#8220;GPU-Thread&#8221; bekannt, weil dieser f\u00fcr die GPU arbeitet. Tats\u00e4chlich l\u00e4uft dieser aber auf der CPU. Er wurde in Raster-Thread umbenannt, weil viele Entwickler f\u00e4lschlicherweise annahmen, dass der Thread auf der GPU-Einheit l\u00e4uft.<\/li><li>IO-Thread:&nbsp; Verarbeitet Kommunikationsdaten er ist f\u00fcr die Kommunikation mit der Au\u00dfenwelt zust\u00e4ndig.<\/li><\/ul>\n\n\n\n<p>Jedoch sollten auch eigene Threads genutzt werden.&nbsp; Falls in einer Anwendung zum Beispiel eine aufwendige Berechnung ausgef\u00fchrt werden soll, sollte der Compute-Thread genutzt werden. Der Compute-Thread dient dazu sehr aufwendige Berechnungen im Hintergrund zu berechnen, damit die Applikation w\u00e4hrenddessen weiterarbeiten kann und das User Interface nicht stehen bleibt bis die Berechnung fertig ist.<\/p>\n\n\n\n<p>Durch dieses Wissen ist es als Entwickler m\u00f6glich, Tools zu nutzen, um den eigenen Code zu optimieren. Als Entwicklertools stehen dabei unter anderem die Dart Dev Tools auf dem Entwicklerger\u00e4t und das Performance Overlay auf dem Endger\u00e4t zur Verf\u00fcgung. Wie diese aussehen zeigen die nachfolgenden Grafiken.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/image7.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"640\" data-attachment-id=\"12730\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2021\/02\/28\/flutter-code-optimierung\/image7-3\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/image7.png\" data-orig-size=\"1999,1249\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image7\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/image7-1024x640.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/image7-1024x640.png\" alt=\"\" class=\"wp-image-12730\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/image7-1024x640.png 1024w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/image7-300x187.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/image7-768x480.png 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/image7-1536x960.png 1536w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/image7.png 1999w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption>Abbildung 2: Einblick in die Dart Dev Tools<\/figcaption><\/figure><\/div>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/performance-overlay.png\"><img loading=\"lazy\" decoding=\"async\" width=\"534\" height=\"342\" data-attachment-id=\"12733\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2021\/02\/28\/flutter-code-optimierung\/performance-overlay\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/performance-overlay.png\" data-orig-size=\"534,342\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"performance-overlay\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/performance-overlay.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/performance-overlay.png\" alt=\"\" class=\"wp-image-12733\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/performance-overlay.png 534w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/performance-overlay-300x192.png 300w\" sizes=\"auto, (max-width: 534px) 100vw, 534px\" \/><\/a><figcaption>Abbildung 3: Einblick in das Performance Overlay<\/figcaption><\/figure><\/div>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow\">\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow\">\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow\">\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow\">\n<p>Das Dart Dev Tool dient zur Auswertung des Speichers, dem Debugging, dem Logging, zum \u00dcberwachen des Traffics und vieles mehr.&nbsp;Das Performance Overlay dient zum \u00fcberwachen der Threads mit besonderem Schwerpunkt auf dem UI-Thread und den GPU-Thread, die im Folgenden n\u00e4her erl\u00e4utert werden.Durch das Performance Overlay k\u00f6nnen unter anderem Janks aufgesp\u00fcrt werden. Jank ist eine Art Ruckler, der dem Nutzer dadurch auff\u00e4llt, dass zum Beispiel eine Animation nicht fl\u00fcssig wirkt.Dies liegt daran, dass ein Frame nicht rechtzeitig fertig geladen wurde und sich somit mit dem n\u00e4chsten Frame innerhalb der Berechnung \u00fcberschneidet.In den fortfolgenden Grafiken wird das Jank veranschaulicht, dabei stehen die d\u00fcnnen, wei\u00dfen Vertikallinien f\u00fcr den Beginn der Berechnung eines Frames, die gr\u00fcnen, horizontalen Balken f\u00fcr die Dauer der Berechnung eines Frames.&nbsp;Die linke Abbildung zeigt den Optimalfall. Jeder Frame wurde fertig berechnet, bevor der N\u00e4chste beginnt. Die rechte Abbildung \u00fcberspringt einen Frame, da sich der vorherige Frame bei der Berechnung mit dem vorherigen Frame \u00fcberschneidet, die Animation wirkt demzufolge ruckelig.&nbsp;Jank tritt an den Stellen auf, an denen der UI-Thread eine hohe Auslastung in Form eines Spikes anzeigt.&nbsp;<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/Bild_2021-02-28_172744.png\"><img loading=\"lazy\" decoding=\"async\" width=\"414\" height=\"114\" data-attachment-id=\"12734\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2021\/02\/28\/flutter-code-optimierung\/bild_2021-02-28_172744\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/Bild_2021-02-28_172744.png\" data-orig-size=\"414,114\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"Bild_2021-02-28_172744\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/Bild_2021-02-28_172744.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/Bild_2021-02-28_172744.png\" alt=\"\" class=\"wp-image-12734\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/Bild_2021-02-28_172744.png 414w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/Bild_2021-02-28_172744-300x83.png 300w\" sizes=\"auto, (max-width: 414px) 100vw, 414px\" \/><\/a><figcaption>Abbildung 4: Veranschaulichung von Jank.<\/figcaption><\/figure><\/div>\n\n\n\n<p>[9,10,11,12,17]<\/p>\n<\/div><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Ans\u00e4tze zum Optimieren&nbsp;<\/strong><\/h2>\n\n\n\n<p>Beim Optimieren von Code gibt es, wie bereits erl\u00e4utert, mehrere Ans\u00e4tze, auf die mehreren Beispielen eingegangen werden soll.<\/p>\n\n\n\n<h2 class=\"has-medium-font-size wp-block-heading\"><strong>Beispiel 1<\/strong><\/h2>\n\n\n\n<p>Beim Optimieren wird oftmals gesagt \u201cthere is no free lunch\u201d, was soviel bedeutet, dass wenn in eine Richtung optimiert wird, es in eine andere schlechter wird.&nbsp;Somit geht es beim Optimieren oft darum die richtige Balance zu finden. Auf mobilen Endger\u00e4ten muss dabei oft zwischen Speicher oder Performance abgewogen werden.<\/p>\n\n\n\n<p>Beeinflusst werden kann dies bei Flutter durch die geeignete Widgetwahl, was durch ein Beispiel schnell deutlich wird.<\/p>\n\n\n\n<p>Unter der Annahme, dass ein Bild aus dem Internet angezeigt werden soll, besteht die M\u00f6glichkeit die Widgets namens Network Image und Cached Network Image zu nutzen.<\/p>\n\n\n\n<p>Das Widget Network Image l\u00e4dt Bilddaten aus dem Internet immer neu, sobald es aufgerufen wird und ist dadurch etwas langsamer und ben\u00f6tigt mehr Akku durch die Datenverbindung. Es hat jedoch den Vorteil, dass wenig Speicher auf dem Ger\u00e4t ben\u00f6tigt wird, w\u00e4hrend die Anwendung genutzt wird.<\/p>\n\n\n\n<p>Wird stattdessen das Widget Cached Network Image verwendet, so wird das Bild nur einmal aus dem Internet heruntergeladen. Dies ist sp\u00e4ter beim erneuten Anzeigen schneller, da es auf dem Ger\u00e4t gespeichert und aus dem Ger\u00e4tespeicher geladen werden kann, auch wenn sp\u00e4ter keine Datenverbindung mehr zur Verf\u00fcgung stehen sollte.<\/p>\n<\/div><\/div>\n<\/div><\/div>\n<\/div><\/div>\n\n\n\n<h2 class=\"has-medium-font-size wp-block-heading\"><strong>Beispiel 2<\/strong><\/h2>\n\n\n\n<p>Eine weitere sehr einfache aber effektive \u00c4nderung bei Flutter ist das Erstellen von eigenen Widgets falls dieses Widget mehrfach genutzt werden. Veranschaulicht wird dies in einem nachfolgenden Beispiel in dem zwei Listen erstellt werden, die jeweils 1000 Widgets als Listitem beinhalten. Zum Veranschaulichen des Problems dient hierbei Abbildung 7. Bewusst wurde hier auf den Flutter eigenen Listbuilder verzichtet und eine for-schleife genommen, die 1000 Mal die Items erstellt.<\/p>\n\n\n\n<p>In Abbildung 8 wird das Widget immer neu aufgebaut, somit ben\u00f6tigt Flutter 1000*5 = 5000 Berechnungsschritte, denn es werden die Widgets (List Title, Padding, Image, Network Image Text) immer neu aufgebaut und verschachtelt.<\/p>\n\n\n\n<p>In Abbildung 9 wird das Widget in eine neue Klasse als Stateless definiert, somit ben\u00f6tigt Flutter 1000*1 = 5000 Berechnungsschritte, da die Struktur von List Title durch die Klasse bekannt ist und durch das Stateless nur mit unterschiedlichen Informationen gef\u00fcttert wird.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/image10.png\"><img loading=\"lazy\" decoding=\"async\" width=\"287\" height=\"607\" data-attachment-id=\"12719\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2021\/02\/28\/flutter-code-optimierung\/image10-2\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/image10.png\" data-orig-size=\"287,607\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image10\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/image10.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/image10.png\" alt=\"\" class=\"wp-image-12719\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/image10.png 287w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/image10-142x300.png 142w\" sizes=\"auto, (max-width: 287px) 100vw, 287px\" \/><\/a><figcaption>Abbildung 5: App mit zwei Listen&nbsp;&nbsp;<\/figcaption><\/figure><\/div>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/image9.png\"><img loading=\"lazy\" decoding=\"async\" width=\"390\" height=\"326\" data-attachment-id=\"12732\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2021\/02\/28\/flutter-code-optimierung\/image9-2\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/image9.png\" data-orig-size=\"390,326\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image9\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/image9.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/image9.png\" alt=\"\" class=\"wp-image-12732\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/image9.png 390w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/image9-300x251.png 300w\" sizes=\"auto, (max-width: 390px) 100vw, 390px\" \/><\/a><figcaption>Abbildung 6: Code zur Erzeugung beider Listen<\/figcaption><\/figure><\/div>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/image15.png\"><img loading=\"lazy\" decoding=\"async\" width=\"702\" height=\"249\" data-attachment-id=\"12724\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2021\/02\/28\/flutter-code-optimierung\/image15\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/image15.png\" data-orig-size=\"702,249\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image15\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/image15.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/image15.png\" alt=\"\" class=\"wp-image-12724\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/image15.png 702w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/image15-300x106.png 300w\" sizes=\"auto, (max-width: 702px) 100vw, 702px\" \/><\/a><figcaption>Abbildung 7:&nbsp; Schlechter Code &#8211; Widget Struktur wird immer neu aufgebaut<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/image13.png\"><img loading=\"lazy\" decoding=\"async\" width=\"721\" height=\"300\" data-attachment-id=\"12722\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2021\/02\/28\/flutter-code-optimierung\/image13\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/image13.png\" data-orig-size=\"721,300\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image13\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/image13.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/image13.png\" alt=\"\" class=\"wp-image-12722\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/image13.png 721w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/image13-300x125.png 300w\" sizes=\"auto, (max-width: 721px) 100vw, 721px\" \/><\/a><figcaption>Abbildung 8: Verbesserter Code &#8211; Widget Struktur ist Flutter nach einmaligem Erstellen bekannt<\/figcaption><\/figure>\n\n\n\n<h2 class=\"has-medium-font-size wp-block-heading\"><strong>Beispiel 3<\/strong><\/h2>\n\n\n\n<p>Da viele Anwendungen an mehreren Stellen Bilder verwenden in Form von Icons oder um eigenen Inhalt darzustellen macht es hier Sinn, dass die Bilder in entsprechender Aufl\u00f6sung dargestellt werden. Das kann gerade bei einer Liste, wie in Beispiel 2 zu sehen war, sehr viel Leistung einsparen. Denn wenn Bilder in einer zu gro\u00dfen Aufl\u00f6sung hinterlegt sind, muss Flutter sie innerhalb der Applikation unter anderem&nbsp; Einlesen, Komprimieren und Rendern. Daher sollte in so einem Fall ein Thumbnail in angepasster Aufl\u00f6sung angeboten werden. Dadurch werden deutlich weniger Daten \u00fcbertragen, falls diese von Extern geladen werden m\u00fcssen oder spart Speicher, wenn diese, zum Beispiel als Icon, Teil der App sind.<\/p>\n\n\n\n<p>Durch die Anwendung eines gefilterten Bildes kann ein Junk vermieden werden, besonders wenn dies mit einer Animation kombiniert wird. W\u00fcrde man diese Filterung nicht vorab berechnen, m\u00fcsste sie f\u00fcr jeden Frame in einer Animation angewendet werden. Somit sollte auf Filter und leistungshungrige Funktionen zur Laufzeit m\u00f6glichst verzichtet werden, da diese sehr viele Ressourcen ben\u00f6tigen.&nbsp;<\/p>\n\n\n\n<p>In folgender Grafik wird ein Ausschnitt des Performance Overlays angezeigt, der durch eine einfache Animation mit Filter verursacht wird im Vergleich zu einer Animation ohne Filter.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"alignleft size-large is-resized\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/image1.gif\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"12718\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2021\/02\/28\/flutter-code-optimierung\/image1-3\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/image1.gif\" data-orig-size=\"248,468\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image1\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/image1.gif\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/image1.gif\" alt=\"\" class=\"wp-image-12718\" width=\"243\" height=\"460\" \/><\/a><figcaption>Abbildung 9:&nbsp; Darstellung der Animation mit Filter<\/figcaption><\/figure><\/div>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"alignright size-large\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/image14-1.gif\"><img loading=\"lazy\" decoding=\"async\" width=\"248\" height=\"468\" data-attachment-id=\"12736\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2021\/02\/28\/flutter-code-optimierung\/image14-1\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/image14-1.gif\" data-orig-size=\"248,468\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image14-1\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/image14-1.gif\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/image14-1.gif\" alt=\"\" class=\"wp-image-12736\" \/><\/a><figcaption>Abbildung 10:&nbsp; Darstellung der Animation ohne Filter<\/figcaption><\/figure><\/div>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/Bild_2021-02-28_173719.png\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"12738\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2021\/02\/28\/flutter-code-optimierung\/bild_2021-02-28_173719\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/Bild_2021-02-28_173719.png\" data-orig-size=\"183,120\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"Bild_2021-02-28_173719\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/Bild_2021-02-28_173719.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/Bild_2021-02-28_173719.png\" alt=\"\" class=\"wp-image-12738\" width=\"243\" height=\"159\" \/><\/a><figcaption>Abbildung 11:&nbsp; Performance Overlay <br>links: erh\u00f6hte GPU-Auslastung durch permanentes Rendern der Frames<br>rechts: geringe GPU-Auslastung durch optimierten Code ohne Filter<br><\/figcaption><\/figure><\/div>\n\n\n\n<h2 class=\"has-medium-font-size wp-block-heading\"><strong>Beispiel 4<\/strong><\/h2>\n\n\n\n<p>Eine weitere kleine Anpassung, welche die App fl\u00fcssiger wirken lassen kann, ist das Anpassen von \u00dcbergangsanimationen. \u00dcbergangsanimationen tragen oft dazu bei, dass eine Applikation stimmiger wirkt oder der Nutzer ein besseres Verst\u00e4ndnis daf\u00fcr bekommt, was er gerade macht.&nbsp;Das Anpassen des Animationsverlaufs kann daf\u00fcr sorgen, dass Animationen stimmiger zum Kontext sind oder auch schneller wirken, obwohl die Animationsdauer exakt gleich bleibt. Je nachdem welche Operation gerade ausgef\u00fchrt wird, sollte ein Entwickler daher testen, welche Animationskurve den gew\u00fcnnschten Effekt erziehlt.<\/p>\n\n\n\n<p>Die folgende Animation dauert in Fall A und Fall B beides Mal 300 Millisekunden, jedoch wirkt Animation B schneller durch einen nichtlinearen Verlauf der Animation.&nbsp;<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/image8.gif\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"12731\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2021\/02\/28\/flutter-code-optimierung\/image8\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/image8.gif\" data-orig-size=\"232,368\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image8\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/image8.gif\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/image8.gif\" alt=\"\" class=\"wp-image-12731\" width=\"232\" height=\"368\" \/><\/a><figcaption>Abbildung 12: Zwei Animationen mit jeweils 300 Millisekunden Laufzeit &#8211; rechts wirkt schneller<\/figcaption><\/figure><\/div>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/Bild_2021-02-28_174107.png\"><img loading=\"lazy\" decoding=\"async\" width=\"332\" height=\"356\" data-attachment-id=\"12741\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2021\/02\/28\/flutter-code-optimierung\/bild_2021-02-28_174107\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/Bild_2021-02-28_174107.png\" data-orig-size=\"332,356\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"Bild_2021-02-28_174107\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/Bild_2021-02-28_174107.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/Bild_2021-02-28_174107.png\" alt=\"\" class=\"wp-image-12741\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/Bild_2021-02-28_174107.png 332w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/Bild_2021-02-28_174107-280x300.png 280w\" sizes=\"auto, (max-width: 332px) 100vw, 332px\" \/><\/a><figcaption>Abbildung 13: Animationskurve der beiden Animationen<\/figcaption><\/figure><\/div>\n\n\n\n<p>[13,14,15,16,17]<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Konklusion<\/strong><\/h2>\n\n\n\n<p>Das Optimieren einer Applikation, gerade im mobilen Bereich, ist sehr sinnvoll. Jedoch sollte nicht von vornherein bereits vorhandene Widgets nachgebaut werden, da dies die Wartbarkeit verschlechtert. Da Flutter Widgets bereits performant arbeiten, ist bei nachgebauten Widgets nicht sicher, ob diese den gew\u00fcnschten Effekt erzielen. Daher sollte darauf geachtet werden, dass die bereits vorhandenen Widgets an der richtigen Stelle ordnungsgem\u00e4\u00df eingesetzt werden. Wenn es sich um aufwendige Funktionen handelt, sollte gepr\u00fcft werden, ob diese nicht optimiert oder weggelassen werden k\u00f6nnen.<\/p>\n\n\n\n<p>Beim Pr\u00fcfen auf Performance sollte dabei nie im Debugmode oder in einem Simulator getestet werden, da diese nicht die echte Leistung widerspiegeln. Stattdessen sollte im Profile Mode auf echten Ger\u00e4ten getestet werden.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Referenzen:<\/h2>\n\n\n\n<ol class=\"wp-block-list\"><li>https:\/\/dart.dev\/overview#platform<\/li><li>https:\/\/api.flutter.dev\/flutter\/widgets\/StatelessWidget-class.html<\/li><li>https:\/\/flutter.dev\/docs\/development\/ui\/interactive<\/li><li>https:\/\/flutter.dev\/docs\/development\/ui\/layout<\/li><li>https:\/\/blog.coodoo.io\/was-ist-eigentlich-flutter-96e6a91a39bc<\/li><li>https:\/\/www.dev-insider.de\/app-performance-testen-und-optimieren-a-596192\/<\/li><li>https:\/\/dzone.com\/articles\/a-developers-guide-to-optimizing-mobile-app-perfor<\/li><li>https:\/\/moguru.de\/softwareentwicklung\/flutter-app-entwicklung\/<\/li><li>https:\/\/flutter.dev\/docs\/perf\/rendering\/ui-performance<\/li><li>https:\/\/medium.com\/flutterdevs\/flutter-performance-optimization-17c99bb31553<\/li><li>https:\/\/flutter.dev\/docs\/perf\/rendering\/shader<\/li><li>https:\/\/flutter.dev\/docs\/perf\/rendering\/ui-performance<\/li><li>https:\/\/blog.codemagic.io\/how-to-improve-the-performance-of-your-flutter-app.\/<\/li><li>https:\/\/api.flutter.dev\/flutter\/animation\/Curves-class.html<\/li><li>https:\/\/flutter.dev\/docs\/development\/tools\/devtools\/performance<\/li><li>https:\/\/flutter.dev\/docs\/perf\/rendering\/ui-performance<\/li><li>http:\/\/semantic-portal.net\/flutter-get-started-another-platform-android-async-ui<\/li><\/ol>\n","protected":false},"excerpt":{"rendered":"<p>Dieser Blogeintrag befasst sich mit Optimierungsm\u00f6glichkeiten des Flutter Frameworks. Innerhalb des Blogeintrag wird darauf eingegangen was Flutter ist, warum Applikationen optimiert werden sollen und die Vorgehensweise anhand von Beispielen erl\u00e4utert. Was ist Flutter? Flutter ist ein Framework von Google, welches auf den Programmiersprachen Dart, C, C++ basiert und zur Entwicklung von Nativen Cross-Platform-Apps verwendet wird. [&hellip;]<\/p>\n","protected":false},"author":995,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[1,649,653,662],"tags":[],"ppma_author":[679],"class_list":["post-12717","post","type-post","status-publish","format-standard","hentry","category-allgemein","category-interactive-media","category-mobile-apps","category-web-performance"],"aioseo_notices":[],"jetpack_featured_media_url":"","jetpack-related-posts":[{"id":21163,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2021\/09\/15\/cloud-basierter-password-manager\/","url_meta":{"origin":12717,"position":0},"title":"Cloud basierter Password Manager","author":"bs103","date":"15. September 2021","format":false,"excerpt":"von Benjamin Schweizer (bs103) und Max Eichinger (me110) Abstract K\u00f6nnen Passwort Manager Anbieter meine Passw\u00f6rter lesen? Wir wollten auf Nummer sichergehen und haben unseren Eigenen entwickelt. Dieser Artikel zeigt auf welche Schritte wir hierf\u00fcr unternehmen mussten.Dabei haben wir unser Frontend mittels Flutter und unser Backend in AWS umgesetzt. Au\u00dferdem gehen\u2026","rel":"","context":"In &quot;Cloud Technologies&quot;","block_context":{"text":"Cloud Technologies","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/scalable-systems\/cloud-technologies\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/09\/image0-4-150x150.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/09\/image0-4-150x150.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/09\/image0-4-150x150.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/09\/image0-4-150x150.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/09\/image0-4-150x150.png?resize=1050%2C600&ssl=1 3x"},"classes":[]},{"id":26965,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2025\/02\/28\/wie-baut-man-eine-ci-cd-pipeline-mit-jenkins-auf\/","url_meta":{"origin":12717,"position":1},"title":"Wie baut man eine CI\/CD Pipeline mit Jenkins auf?","author":"Cedric Gottschalk","date":"28. February 2025","format":false,"excerpt":"Im Rahmen der Vorlesung \"System Engineering und Management (143101a)\" haben wir es uns zum Ziel gesetzt, mehr \u00fcber CI\/CD Pipelines zu lernen und eine eigene Pipeline f\u00fcr ein kleines Projekt aufzusetzen. Wir haben uns dabei entschieden, Jenkins f\u00fcr die CI\/CD Pipeline einzusetzen und eine kleine ToDo App mit dem Framework\u2026","rel":"","context":"In &quot;System Engineering&quot;","block_context":{"text":"System Engineering","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/system-designs\/system-engineering\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/ToDo-List-CICD-1.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/ToDo-List-CICD-1.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/ToDo-List-CICD-1.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/ToDo-List-CICD-1.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/ToDo-List-CICD-1.png?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/ToDo-List-CICD-1.png?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":22395,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/02\/27\/applikationsinfrastruktur-einer-modernen-web-anwendung\/","url_meta":{"origin":12717,"position":2},"title":"Applikationsinfrastruktur einer modernen Web-Anwendung","author":"Jannik Smidt","date":"27. February 2022","format":false,"excerpt":"ein Artikel von Nicolas Wyderka, Niklas Schildhauer, Lucas Cr\u00e4mer und Jannik Smidt Projektbeschreibung In diesem Blogeintrag wird die Entwicklung der Applikation- und Infrastruktur des Studienprojekts sharetopia beschrieben. Als Teil der Vorlesung System Engineering and Management wurde besonders darauf geachtet, die Anwendung nach heutigen Best Practices zu entwickeln und dabei kosteneffizient\u2026","rel":"","context":"In &quot;Interactive Media&quot;","block_context":{"text":"Interactive Media","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/interactive-media\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/02\/Bildschirmfoto_2022-02-27_um_18.59.07.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/02\/Bildschirmfoto_2022-02-27_um_18.59.07.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/02\/Bildschirmfoto_2022-02-27_um_18.59.07.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/02\/Bildschirmfoto_2022-02-27_um_18.59.07.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/02\/Bildschirmfoto_2022-02-27_um_18.59.07.png?resize=1050%2C600&ssl=1 3x"},"classes":[]},{"id":27939,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2025\/09\/11\/entwickeln-eines-ki-tools-zum-generieren-von-strukturierten-lerninhalten\/","url_meta":{"origin":12717,"position":3},"title":"Entwickeln eines KI-Tools zum Generieren von strukturierten Lerninhalten","author":"Jonathan Aupperle","date":"11. September 2025","format":false,"excerpt":"F\u00fcr den Kurs \"Software Development for Cloud Computing\" wollte ich eine Anwendung entwickeln, mit der konkrete Aufgaben f\u00fcr ein gegebenes Lernziel generiert werden k\u00f6nnen. Der Nutzer stellt dabei Informationen zum Lernziel, sowie seines aktuellen Niveaus und der geplanten Lerndauer zur Verf\u00fcgung. Auf dieser Basis k\u00f6nnen dann die konkreten Aufgaben, die\u2026","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/allgemein\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/08\/grafik.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/08\/grafik.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/08\/grafik.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/08\/grafik.png?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":24203,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2023\/02\/26\/die-zukunft-ist-serverless\/","url_meta":{"origin":12717,"position":4},"title":"Die Zukunft ist Serverless?","author":"Michael Partes","date":"26. February 2023","format":false,"excerpt":"\u00dcberblick Die \u201cCloud\u201d ist ein Begriff, der in den letzten Jahren immens an Bedeutung gewonnen hat. H\u00e4ufig wird sie f\u00fcr die Bereitstellung von Diensten und Services genutzt. Im Lauf der Zeit haben sich dabei verschiedene Architekturen entwickelt, die in der Cloud eingesetzt werden und unterschiedliche Ans\u00e4tze f\u00fcr die Handhabung des\u2026","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/allgemein\/"},"img":{"alt_text":"","src":"https:\/\/lh5.googleusercontent.com\/hnARrH3Mz7d41IhTltMgTCpuUfKpg8k6ur_0Ir46moShZzCf53cVBMeUogOFgp2yD-maHIuCu3CIOsnqE_oBCOrEEaB-KfPc8lsQ5jWanA8hFVPvMdC5XYLBboHJ_lUbrtMT5aVqtMNUjTbsLQQNuoM","width":350,"height":200,"srcset":"https:\/\/lh5.googleusercontent.com\/hnARrH3Mz7d41IhTltMgTCpuUfKpg8k6ur_0Ir46moShZzCf53cVBMeUogOFgp2yD-maHIuCu3CIOsnqE_oBCOrEEaB-KfPc8lsQ5jWanA8hFVPvMdC5XYLBboHJ_lUbrtMT5aVqtMNUjTbsLQQNuoM 1x, https:\/\/lh5.googleusercontent.com\/hnARrH3Mz7d41IhTltMgTCpuUfKpg8k6ur_0Ir46moShZzCf53cVBMeUogOFgp2yD-maHIuCu3CIOsnqE_oBCOrEEaB-KfPc8lsQ5jWanA8hFVPvMdC5XYLBboHJ_lUbrtMT5aVqtMNUjTbsLQQNuoM 1.5x"},"classes":[]},{"id":23945,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2023\/02\/05\/jamstack-und-astro-vor-und-nachteile-einer-serverless-architektur\/","url_meta":{"origin":12717,"position":5},"title":"JAMStack und Astro:  Vor- und Nachteile einer serverless Architektur","author":"zack walker","date":"5. February 2023","format":false,"excerpt":"Einleitung Seit den fr\u00fchen Tagen der Web-Entwicklung hat die Performance von Websites eine wichtige Rolle gespielt. W\u00e4hrend sich das Internet im Laufe der Jahre weiterentwickelt hat, haben sich auch die Anforderungen an die Performance von Websites erh\u00f6ht. Benutzer erwarten eine schnelle und reibungslose Nutzererfahrung, unabh\u00e4ngig von der Gr\u00f6\u00dfe ihres Ger\u00e4ts\u2026","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/allgemein\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/02\/Screenshot-2023-02-05-at-22.08.11.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/02\/Screenshot-2023-02-05-at-22.08.11.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/02\/Screenshot-2023-02-05-at-22.08.11.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/02\/Screenshot-2023-02-05-at-22.08.11.png?resize=700%2C400&ssl=1 2x"},"classes":[]}],"jetpack_sharing_enabled":true,"authors":[{"term_id":679,"user_id":995,"is_guest":0,"slug":"rj021","display_name":"Rafael Janetzko","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/73ac03f7b33b0354a0b563876931f088d082c4d930e5cba8618f933ff5878f17?s=96&d=mm&r=g","0":null,"1":"","2":"","3":"","4":"","5":"","6":"","7":"","8":""}],"_links":{"self":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts\/12717","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/users\/995"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/comments?post=12717"}],"version-history":[{"count":3,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts\/12717\/revisions"}],"predecessor-version":[{"id":12757,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts\/12717\/revisions\/12757"}],"wp:attachment":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/media?parent=12717"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/categories?post=12717"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/tags?post=12717"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/ppma_author?post=12717"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}