UIImageView vs UIView w / Image - Effizienz

8

Dies ist nicht wirklich eine Frage über ein spezifisches Problem, sondern eher eine Aufforderung, in die richtige Richtung zu zeigen.

Ich mache eine App, wo ich mehrere Bilder (gespeichert als JPG) gleichzeitig auf einen Bildschirm lade und das muss so sein, dass ich sie nicht löschen kann, weil sie alle angezeigt werden sofort.

Ich habe versucht, 30 Bilder mit etwa 800px * 600px Auflösung naiv zu laden und dachte, dass es nur die 'komprimierte' Größe der Bilder in den Speicher lädt (das sind ungefähr 200 KB) - also insgesamt 6 MB? Natürlich, später mehrere Speicherwarnungen, erkannte ich, wie dumm ich war. Also habe ich sie jetzt auf ca. 400px * 300px neu dimensioniert und mein iPhone 4S kommt mit den Speicheranforderungen zurecht.

Ich habe ursprünglich ein UiView verwendet, wo ich in der drawRect ein benutzerdefiniertes Bild gezeichnet habe, aber die Umstellung auf die Verwendung von UIImageView hat die Situation dramatisch verbessert. Die App ist so viel schneller und reaktionsschneller. Ich habe auch festgestellt, dass das Ausschalten der Rasterung in meiner Ebene einen großen Unterschied in der Leistung hat.

Diese Art von "Entdeckungen" hat mich viele Stunden gekostet, und ich habe mich gefragt, ob es bestimmte Designmuster oder Ressourcen gibt, mit denen ich meine Bilder so effizient wie möglich auf den Bildschirm laden kann. vor allem in Bezug auf die Verwendung so wenig Speicher wie möglich - gibt es gute Faustregeln? Warum hat die Verwendung von UIImageView vs UiView w / image so einen Unterschied gemacht?

Wäre sehr dankbar, wenn jemand helfen könnte.

Danke.

    
Vazzyb 11.01.2012, 22:59
quelle

2 Antworten

9

Bei der Implementierung von -drawRect: wird dem System ein Bitmap-Bild mit derselben Größe wie Ihre Ansicht zugewiesen (schließlich benötigen Sie einen Puffer, in den Sie zeichnen können). Wenn Sie nur ein Bild zeichnen, das Sie bereits geladen haben, haben Sie auf einen Schlag die Speicherbelegung für dieses Bild verdoppelt (weil Sie die geladene Kopie und die zweite gerade gezeichnete Kopie haben) / p>

In ähnlicher Weise erfordert das Rastern von Layern das Zuweisen von Bitmap-Bildern mit der gleichen Größe wie die Ebene, sodass ein Puffer für die Rasterung vorhanden ist. Wenn Sie das einschalten, wird auch der Speicher ausgelagert (proportional zur Größe der Ebene).

Die Grundregel ist, dass Sie keine zusätzliche Arbeit leisten. Die Verwendung von -drawRect: zum Zeichnen eines Bildes ist zusätzliche Arbeit. Die Rasterung eines Layers ist eine zusätzliche Arbeit (abhängig davon, was der Layer ist, kann es sich jedoch um einmalige Leistungskosten und konstante Speicherkosten handeln, um später Leistung zu sparen, z. B. wenn es sich um CAShapeLayer handelt oder wenn dies der Fall ist Schatten zeichnen). Große Bilder im Speicher zu behalten, die immer verkleinert werden, bevor sie auf den Bildschirm gerendert werden, ist zusätzliche Arbeit (skalieren Sie sie einfach einmal, wenn Sie das Bild laden, und behalten Sie die skalierte Kopie bei.)

Eine andere Sache, die Sie beachten sollten, ist, dass wenn Sie Bilder zeichnen wollen, Sie versuchen sollten, UIImageView zu verwenden, wenn Sie das können. Es ist im Allgemeinen der schnellste und billigste Weg, um ein Bild auf den Bildschirm zu bekommen, und es ist relativ flexibel.

    
Kevin Ballard 11.01.2012, 23:48
quelle
8

Das Entwurfsmuster ist grundsätzlich% ce_de%. Apple hat viel Zeit damit verbracht, es schnell zu machen, und Apple darf private APIs verwenden, die Sie nicht sind.

Wenn Sie das selbst machen wollen, sollten Sie versuchen, ein UIImageView pro Bild zu verwenden. Sie laden einfach ein Bild und legen es als CALayer Eigenschaft eines content fest. Der CALayer kann seinen Inhalt im GPU-Speicher zwischenspeichern und andere Optimierungen vornehmen, die mit öffentlichen APIs nicht möglich sind.

Sie können viel über die schnelle Entwicklung Ihrer Benutzeroberfläche erfahren, wenn Sie sich die Entwicklungsvideos von Apple ansehen. Sie enthalten viele Tipps und "Insider-Informationen", die entweder nicht in der schriftlichen Dokumentation enthalten sind oder in den Dokumenten schwer zu finden sind. Die Entwicklungsvideos sind hier: Ссылка . Einige gute für Ihre Frage relevant:

  • iOS - "Verständnis von iOS View Compositing"
  • WWDC 2011 - "UIKit Rendering verstehen"
  • WWDC 2011 - "Praktische Zeichnung für iOS-Entwickler"
  • WWDC 2011 - "Core Animation Essentials"
  • WWDC 2010 - "Kernanimation in der Praxis"
rob mayoff 11.01.2012 23:53
quelle