Gibt es in VB Net eine virtuelle Kopie (Mehrere Variablen zeigen auf denselben Speicherbereich)

  • VB.NET

Es gibt 23 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Gibt es in VB Net eine virtuelle Kopie (Mehrere Variablen zeigen auf denselben Speicherbereich)

    Bin an einem alten Programm, da wird dasselbe Bild in zwei Variablen geladen (mehrmals Variablen Array).
    Der einfachste Weg die Speicherbelastung zu vermeiden wäre, dass die zweite Bild Variable auf denselben Speicherbereich zeigt.
    Falls Deine Frage im Titel steht und die Du Dir die Frage noch nicht beantwortet hast:

    VB.NET-Quellcode

    1. Dim BildInVariable1 = Image.FromFile(PfadZurDatei)
    2. Dim BildInVariable2 = BildInVariable1
    Und schon hast Du dasselbe Bild in 2 Variablen, will heißen: beide Variablen zeigen auf dasselbe Objekt. Wenn mithilfe einer Variable das Bild geändert wird, würde man über die andere Variable jene Änderungen ebenfalls sehen, weil beide Variablen auf dasselbe Objekt verweisen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    Das gleiche in Grün:

    VB.NET-Quellcode

    1. Dim Bild(5) As Image
    2. Bild(1) = Image.FromFile(PfadZurDatei)
    3. Bild(5) = Bild(1)

    Und schon ist in Bild(5) dasselbe wie in Bild(1)
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    VaporiZed schrieb:

    Und schon ist in Bild(5) dasselbe wie in Bild(1)


    Ja, der Inhalt ist am Anfang der gleiche.
    Aber ich nehme an das, wenn man danach Bild(1) ändert hat Bild(5) noch den ursprünglichen Inhalt. Jedenfalls ist das bei Integer so.
    Das heißt, es wird auch zweimal der Ramspeicher mit den Bilddaten belegt und vermutlich nicht erst wenn Bild(1) geändert wird.
    Ich will aber erreichen, dass die Bilddaten nur einmal Speicherplatz belegen, auch wenn einmal Bild(1) und ein anderes Mal Bild(5) benutzt wird.
    Oder ich muss, wie ich befürchte, aufwändigere Änderungen vornehmen, damit die Bilddaten nur einmal im Speicher sind.

    Elephant schrieb:

    Oder ich muss, wie ich befürchte, aufwändigere Änderungen vornehmen, damit die Bilddaten nur einmal im Speicher sind.
    Kannst Du mal etwas detaillierter beschreiben, was Du eigentlich vor hast?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Quasi-Vollzitat eines Vorposts an dieser Stelle entfernt ~VaporiZed

    ich würde dann einfach zwei Variablen verwenden. Eine für die Bilder und in der zweiten wird halt ein Index auf die Bildvariable geführt. Damit wäre doch das Problem gelöst. So kann man doch ressourceschonend die Bilder im Speicher halten.

    Oder habe ich (wieder einmal) das Problem falsch verstanden?

    Gruß Achilleus

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    Achilleus schrieb:

    Oder habe ich (wieder einmal) das Problem falsch verstanden?
    Das war auch mein Problem. :/
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Integer: Wertevariable.

    VB.NET-Quellcode

    1. Dim a = 1 'a !hat! den Wert 1
    2. Dim b = a 'b !hat! denselben Wert wie a, also 1
    3. a = 2 'a !hat! den neuen Wert 2
    4. 'b bleibt bei Wert 1

    Image: Referenzvariable.

    VB.NET-Quellcode

    1. Dim a = Image1 'a !zeigt/verweist/hat eine Referenz! auf Image1
    2. Dim b = a 'b !zeigt/verweist/hat eine Referenz! auf dasselbe wie a, also Image1
    3. 'ändert a jetzt Image1, ist Image1 verändert; da b auf dasselbe wie a verweist, kann man die Änderung in b ebenfalls sehen
    4. 'ABER:
    5. a = Image2 'a !zeigt/verweist/hat eine Referenz! auf Image2
    6. 'b !zeigt/verweist/hat eine Referenz! immer noch auf Image1


    Wenn Du ein Bild aus einer Datei einmal lädst und diese in eine Variable packst und mit 10000 Variablen darauf verweist, hast Du das Bild einmal im Speicher.
    Wenn Du ein Bild aus einer Datei 10000x lädst und diese !jeweils! in eine Variable packst, hast Du das eine Bild 10000x im Speicher.
    Wenn Du fünf Bilder aus je einer Datei je 1x lädst und diese in je eine Variable packst, hast Du fünf Bilder im Speicher.

    Elephant schrieb:

    Aber ich nehme an das
    Probier es einfach mal.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    Achilleus schrieb:

    ich würde dann einfach zwei Variablen verwenden. Eine für die Bilder und in der zweiten wird halt ein Index auf die Bildvariable geführt.

    Ja, in meinem Fall zwei Variablen Arrays und das sind die befürchteten aufwändigeren Änderungen.
    Bei der Frage ging es mir darum, ob es eine Möglichkeit gibt das zu vermeiden.
    @Elephant Ich verstehe immer noch nicht, was Du erreichen willst. Also:

    RodFromGermany schrieb:

    Kannst Du mal etwas detaillierter beschreiben, was Du eigentlich vor hast?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    Kannst Du mal etwas detaillierter beschreiben, was Du eigentlich vor hast?

    Es gibt eine Mindestgröße (in einer Piturebox mit z. B. 4 x 4 Pixel ist nichts zu erkennen).
    Je nach Auflösung des Monitors wird errechnet bis zu wie viel Bilder, ohne die Mindestgröße zu unterschreiten geladen werden können.
    Der Anwender wählt dann die gewünschte Anzahl aus und je nachdem was die maximale Anzahl an Bildern ist und was sonst noch an Programmen im Speicher ist, kann es sein das der Speicher nicht ausreicht.
    Dieser Punkt, an dem der Speicher nicht mehr ausreicht, soll hat möglichst spät eintreten.
    Da jedes Bild zweimal vorhanden ist, lässt sich da am besten da ansetzen, um nicht soviel Speicher zu belegen.

    Elephant schrieb:

    Da jedes Bild zweimal vorhanden ist
    Wo sind zwei Bilder vorhanden? Im Speicher oder auf dem GUI? Und natürlich: Warum ist jedes Bild zweimal vorhanden? Werden beide benötigt? Wird ein Bild zweimal aus derselben Datei geladen?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Elephant schrieb:

    um nicht soviel Speicher zu belegen.
    Bevor Du hier irgend ein Spiel (das ist es wohl) programmierst, solltest Du Deine Philosophie / Dein Datenmodell so präzise wie möglich formulieren.
    Du verrennst Dich hier in Speicherzugriffen und wer weiß was, Dein Problem liegt dabei ganz woanders:
    Deine Spezifikation ist unpräzise also falsch :!:
    Merke:
    Die meisten Software-Fehler entstehen durch eine falsche oder fehlerhafte Spezifikation, denn gegen diese wird getestet.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Elephant schrieb:

    Beide Bilder werden in der GUI benötigt, im Speicher nicht.
    Warum ist das so?
    Das wäre redundanz, und Redundanz führt zu Fehleranfälligkeit.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Elephant schrieb:

    Ja, der Inhalt ist am Anfang der gleiche.
    Aber ich nehme an das, wenn man danach Bild(1) ändert hat Bild(5) noch den ursprünglichen Inhalt. Jedenfalls ist das bei Integer so.
    Das heißt, es wird auch zweimal der Ramspeicher mit den Bilddaten belegt und vermutlich nicht erst wenn Bild(1) geändert wird.


    Muss nochmal kurz einhaken, weil ich glaube das du noch nicht verstanden hast, dass deine Vermutung falsch ist. Integer verhält sich nicht wie ein Bild. Das Bild liegt hier nur 1-mal im Speicher. Bild(1) und Bild(5) zeigen auf das gleiche Bild. Änderst du ein Pixel an Bild(1) hat Bild(5) diesen auch geändert, weil es dasselbe Bild ist.

    Elephant schrieb:

    Zurzeit sind beide Bilder im Speicher […] Die zwei Bilder stammen aus derselben Datei.
    Aber lädst Du diese Datei mit eigenem Code selber zweimal in den Speicher oder wie kommst Du darauf, dass das Bild 2x im Speicher ist? Nur weil es 2x angezeigt wird, heißt das nicht, dass es 2x im Speicher ist.

    Und ergänzend zum Vorpost: Abhängig davon, wieviele Bilder es sind, ob sie bei jedem Programmlauf gebraucht werden und ob es immer die gleichen sind, kannst Du sie auch als Ressourcen ins Projekt übernehmen. Dann hast Du jedes Bild genau 1x im Speicher und kannst sagen: An Gitterposition (1, 8) und an (9, 20) ist Ressourcenbild1, an Gitterposition (4, 2) und an (1, 98) ist Ressourcenbild2, …
    Denn das ist das, was Post#9 und entsprechend #17 sagen wollen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    VaporiZed schrieb:

    Aber lädst Du diese Datei mit eigenem Code selber zweimal in den Speicher oder wie kommst Du darauf, dass das Bild 2x im Speicher ist?

    Habe ein Testprogramm geschrieben, um das Problem zu zeigen.
    Aber selbst mit dem Bild X mal laden ist der Fehler mit Out Of Memeory erst nach viel mehr Bilder laden als im eigentlichen Programm aufgetreten.
    Habe zwar in meinem Programm bei mehr Bildern den Out Of Memeory Fehler, aber der Grund muss eine anderer sein als die Anzahl der Bilder.
    Thema ist also jetzt beendet und ich muss erstmal den eigentlichen Grund für den Fehler finden.

    Danke für eure Hilfe.

    Elephant schrieb:

    Habe ein Testprogramm geschrieben, um das Problem zu zeigen.
    Häng das mal an.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!