Bilderpuffer schreiben
-
Heyho,
ich bin noch Neuling und wollte mal fragen, ob das von mir erdachte Prinzip für folgende Problemstellung okay ist, oder ob es einfacher/besser geht!
ich habe ein Projekt, in dem ich viele Einzelbilder habe, die eine Sequenz darstellen. Man hat einen Dialog, mit einem Anzeigeelement, in dem das aktuelle Bild erscheint sowie ein Slider Control, mit dem man sich in der Sequenz vor- und zurück bewegen kann. Die Pfadangaben der Bilder stehen in einem Array zur Verfügung.
Nun wollte ich das Navigieren darin weitestgehend flüssig gestalten, und dazu eine Klasse FrameBuffer schreiben. Navigiert man nun mit dem Slider zu einem bestimmten Bild, wird mit niedriger Priorität in den Puffer (sagen wir mal, 101 Bilder groß - das entspräche ca. 20 mb Ram, da ein Bild 200 kb groß ist) je 50 Bilder vor und hinter dem aktuell angezeigten Bild geladen. Wenn man nun nur ein paar Bilder vor und zurück navigiert, dann werden die Bilder aus dem Ram statt von der Platte geladen.
Dazu wollte ich einen Vector verwenden - allerdings, ich benötige folgende Funktionalitäten, die ich ja dann selber implementieren müsste:
- bei Navigation müssen die ersten Bilder des Puffers gelöscht werden
- die Bilder müssen entweder nach links gerückt werden, oder ich muss eine andere Möglichkeit haben, den Puffer immer auf 100 Bilder begrenzt zu halten
- ich muss überprüfen, ob sich ein Bild schon im Puffer befindet, damit es nicht doppelt drin ist (soll ich einen parallelen Index verwenden, und wenn ja, welche Klasse ist geeignet?)Ist die Überlegung so ok, oder fällt einem erfahrenerem C++ Programmierer etwas besseres ein?
Danke schonmal!
-
Als erstes ist vermutlich ein deque geigneter für dich als ein vector - dort kannst du nämlich auch am Anfang der Sequenz problemlos Elemente löschen (pop_front()) und einfügen (push_front(), nützlich für den Rücklauf).
- ich muss überprüfen, ob sich ein Bild schon im Puffer befindet, damit es nicht doppelt drin ist (soll ich einen parallelen Index verwenden, und wenn ja, welche Klasse ist geeignet?)
Ich würde eher eine Art Smart-Pointer verwenden, die anfangs mit NULL initialisiert werden und - wenn du das Bild tatsächlich geladen hast - auf den eigentlichen Bildspeicher zugreifen:
class pic_pointer { public: pic_pointer(const string& fname) : m_name(fname),m_pic(NULL) {} ~pic_pointer() {delete m_pic;} m_pic& operator*() {load();return *m_pic;} m_pic* operator->() {load();return m_pic;} private: string m_name; Picture* m_pic; void load() { if(m_pic) return; m_pic=new Picture; ... // Bild laden } };
-
moment, also dass ich das richtig verstehe...
ich nehme als puffer einen deque, ok. in den kommen dann die instanzen des smartpointers rein, den du angedeutet hast? der lädt bei bedarf dann das bild aus dem speicher. soweit richtig?
aber, ich will ja immer ca. 100 bilder im speicher halten. es sind insgesamt >10000. wo ist das jetzt in dieser lösung zu finden? sorry für die nachfrage.. bin halt noob ^^
-
Du lädst das Bild, (wie auch immer). Und der verweis auf das Bild befindet sich im SmartPointer. Diess "Konstrukt" brauchst du ja 100 mal, da kommt die deque ins Spiel. Damit verwaltest du die 100 Pointer.
-
okay, dann habe ich das richtig verstanden. Mich hat verwirrt, dass er das auf die Überprüfung, ob ein Bild doppelt drin ist, bezogen hat (also mit Benutzung der Smartpointer der Verweis auf das Bild) - das muss ich ja schon noch implementieren.
Auf jeden Fall vielen Dank, so werd ichs versuchen!
-
DrOetker_off schrieb:
Mich hat verwirrt, dass er das auf die Überprüfung, ob ein Bild doppelt drin ist, bezogen hat (also mit Benutzung der Smartpointer der Verweis auf das Bild) - das muss ich ja schon noch implementieren.
Sorry, ich war davon ausgegangen, daß du im Bereich pos0+/-50 nur überprüfen willst, welche Bilder schon geladen sind (und der skizzierte Smart-Pointer macht diesen Test unnötig - wenn das Bild noch nicht geladen ist, lädt er es beim ersten Zugriff).