Resourcen/Assets archivieren und zugreifen



  • Hallo miteinander,

    da ich gerade an einem Projekt arbeite wo ich eine immense Anzahl an Bildern habe, die ich via SDL_image nutze, wollte ich diese nun irgendwie verpacken. D.h. in ein (komprimiertes) ZIP-Archiv wäre aktuell das einfachste, aber wie würde sich dann der Zugriff gestalten? Dazu habe ich mir überlegt, einfach beim Start der Programms das Archiv zu entpacken, den temporären (!) Pfad zu speichern in einer Variable und dann per IMG_load(path) auf die Bilder zuzugreifen. Beim (sauberen) Beenden des Programms sollte dann der jeweilige Ordner gelöscht werden.

    Nun stellen sich einige Fragen: 😕

    • Ist diese Überlegung "effizient" genug - gibt es bessere Ideen?
    • Welche (möglichst kompakten/kleinen/einfachen) Bibliotheken lassen sich hier empfehlen?
    • Noch irgendwelche Ideen?

    Noch am Rande: dies ist für Windoof 🙄

    Gruß


  • Mod

    Warum nicht gleich in den Arbeitsspeicher laden (evtl erst bei Bedarf)? Früher oder später willst du die Bilder doch sowieso dort haben. Damit fallen alle potentiellen Probleme weg.



  • Das habe ich auch im Kopf gehabt, jedoch habe ich keinen Plan, wie ich das in den RAM bekomme und dann noch SDL_image dazu überrede diese zu nutzen 🙄
    Wie wäre da so die Herangehensweise?



  • Dieser Thread wurde von Moderator/in volkard aus dem Forum C++ (auch C++0x) in das Forum Spiele-/Grafikprogrammierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.





  • Beim Versuch ZZlib zu benutzen stoße ich auf massive Probleme. Schon wenn ich versuch zziplib zu compilieren meckert der Compiler:

    1> Generating Code...
    1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppBuild.targets(1151,5): warning MSB8012: TargetPath(D:\Depot\Lunatic\Contrib\zziplib-0.13.59\msvc8\Release\zziplib.lib) does not match the Library's OutputFile property value (D:\Depot\Lunatic\Contrib\zziplib-0.13.59\msvc8\zziplib-Release.lib). This may cause your project to build incorrectly. To correct this, please make sure that $(OutDir), $(TargetName) and $(TargetExt) property values match the value specified in %(Lib.OutputFile).
    1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppBuild.targets(1153,5): warning MSB8012: TargetName(zziplib) does not match the Library's OutputFile property value (zziplib-Release). This may cause your project to build incorrectly. To correct this, please make sure that $(OutDir), $(TargetName) and $(TargetExt) property values match the value specified in %(Lib.OutputFile).
    1>zip.obj : warning LNK4078: multiple '.text' sections found with different attributes (60501020)

    Und wenn ich dann auch noch das in mein Projekt packe und versuche zu compilieren wird es erst richtig lustig:

    1>zziplib-Release.lib(d000050.o) : warning LNK4078: multiple '.text' sections found with different attributes (E0300020)
    1>LIBCMT.lib(dosmap.obj) : error LNK2005: __errno already defined in MSVCRT.lib(MSVCR100.dll)
    1>LIBCMT.lib(invarg.obj) : error LNK2005: __invoke_watson already defined in MSVCRT.lib(MSVCR100.dll)
    1>LIBCMT.lib(read.obj) : error LNK2005: __read already defined in MSVCRT.lib(MSVCR100.dll)
    1>LIBCMT.lib(lseek.obj) : error LNK2005: __lseek already defined in MSVCRT.lib(MSVCR100.dll)
    1>LIBCMT.lib(crt0dat.obj) : error LNK2005: __initterm_e already defined in MSVCRT.lib(MSVCR100.dll)
    1>LIBCMT.lib(crt0dat.obj) : error LNK2005: _exit already defined in MSVCRT.lib(MSVCR100.dll)
    1>LIBCMT.lib(crt0dat.obj) : error LNK2005: __exit already defined in MSVCRT.lib(MSVCR100.dll)
    1>LIBCMT.lib(crt0dat.obj) : error LNK2005: __cexit already defined in MSVCRT.lib(MSVCR100.dll)
    1>LIBCMT.lib(crt0dat.obj) : error LNK2005: __amsg_exit already defined in MSVCRT.lib(MSVCR100.dll)
    1>LIBCMT.lib(mlock.obj) : error LNK2005: __unlock already defined in MSVCRT.lib(MSVCR100.dll)
    1>LIBCMT.lib(mlock.obj) : error LNK2005: __lock already defined in MSVCRT.lib(MSVCR100.dll)
    1>LIBCMT.lib(write.obj) : error LNK2005: __write already defined in MSVCRT.lib(MSVCR100.dll)
    1>LIBCMT.lib(hooks.obj) : error LNK2005: "void __cdecl terminate(void)" (?terminate@@YAXXZ) already defined in MSVCRT.lib(MSVCR100.dll)
    1>LIBCMT.lib(crt0init.obj) : error LNK2005: ___xi_a already defined in MSVCRT.lib(cinitexe.obj)
    1>LIBCMT.lib(crt0init.obj) : error LNK2005: ___xi_z already defined in MSVCRT.lib(cinitexe.obj)
    1>LIBCMT.lib(crt0init.obj) : error LNK2005: ___xc_a already defined in MSVCRT.lib(cinitexe.obj)
    1>LIBCMT.lib(crt0init.obj) : error LNK2005: ___xc_z already defined in MSVCRT.lib(cinitexe.obj)
    1>LIBCMT.lib(winxfltr.obj) : error LNK2005: __XcptFilter already defined in MSVCRT.lib(MSVCR100.dll)
    1>LIBCMT.lib(errmode.obj) : error LNK2005: ___set_app_type already defined in MSVCRT.lib(MSVCR100.dll)
    1>LINK : warning LNK4098: defaultlib 'MSVCRT' conflicts with use of other libs; use /NODEFAULTLIB:library
    1>LINK : warning LNK4098: defaultlib 'LIBCMT' conflicts with use of other libs; use /NODEFAULTLIB:library
    1>zziplib-Release.lib(file.obj) : error LNK2019: unresolved external symbol ___zzip_get16 referenced in function _zzip_file_open
    1>zziplib-Release.lib(zip.obj) : error LNK2001: unresolved external symbol ___zzip_get16
    1>zziplib-Release.lib(zip.obj) : error LNK2019: unresolved external symbol ___zzip_get64 referenced in function ___zzip_fetch_disk_trailer
    1>zziplib-Release.lib(zip.obj) : error LNK2019: unresolved external symbol ___zzip_get32 referenced in function ___zzip_fetch_disk_trailer
    1>D:\Depot\Lunatic\Source\Debug\Lunatic.exe : fatal error LNK1120: 3 unresolved externals

    Es ist so, dass ich keine Ahnung hatte wie das mit zlib verknüpft werden muss und nach einigem Forschen habe ich einfach das zlib SDK (zlib125-dll) in /msvc/zlib/* vom zziplib-Ordner aus gesehen gepackt. In meinem Projekt habe ich die zziplib-Release.lib (aus dem msvc8-Ordner) referenziert und den zziplib-Ordner selber als Additional Include folder eingetragen.

    Auch wenn ich das hier einfach mal hingeklatscht habe, kann jemand was darüber aussagen? Oder wenigstens mir diese scheiß Abhängigkeiten erklären?!



  • In den ersten Warnings steht eh genau was das Problem ist. Der Rest kommt vermutlich davon dass deine exe eine andere Runtime linkt als deine .lib.



  • Hast du denn welche Vorschläge, wie ich das lösen könnte?



  • Wie wärs damit die oben genannten Probleme zu beheben, also z.B. mal deine Projektdateien fixen sodass exe und lib die selbe Runtime linken!?



  • Das ist mir schon klar, nur dachte ich es gibt gute Tipps, was ich versuchen könnte 🙄
    Zumindest habe ich bei zziplib die Warnungen bzgl. dem Output-File gelöst, aber das mit dem multiple .text nicht. Weil ich keine Ahnung habe woher das tatsächlich kommt bzw. wie das zustanden kommt!

    // Edit: Wie soll ich die passende Runtime auswählen?



  • Hast du die Probleme mit der Runtime gefixed? Hast du die Library überhaupt mal mit deinem Compiler kompiliert oder verwendest du irgendeinen veralteten Build den du irgendwo gefunden hast? Die '.text' Warnungen könnten nämlich daher kommen wie du ja sicherlich schon in der MSDN gelesen hast...

    EDIT: Die passende Runtime wählst du aus indem du für die .exe und die .lib in den Projekteigenschaften unter C/C++ > Code Generation die Runtime Library auf den selben Wert stellst (vorzugsweise die der jeweiligen Konfiguration entsprechende dll (Debug vs. kein Debug)).



  • Also ich hab das jetzt mit den Runtimes verstanden und hab zziplib zu MT-DLL umkonfiguriert! Nun sind die meisten Fehler, logischerweise, weg! Außerdem habe ich alles selber compiliert mit dem Compiler in VS.

    In der Lib:

    1>zip.obj : warning LNK4078: multiple '.text' sections found with different attributes (60501020)

    Im Spiel:

    1>zziplib.lib(d000050.o) : warning LNK4078: multiple '.text' sections found with different attributes (E0300020)
    1>zziplib.lib(file.obj) : error LNK2019: unresolved external symbol ___zzip_get16 referenced in function _zzip_file_open
    1>zziplib.lib(zip.obj) : error LNK2001: unresolved external symbol ___zzip_get16
    1>zziplib.lib(zip.obj) : error LNK2019: unresolved external symbol ___zzip_get64 referenced in function ___zzip_fetch_disk_trailer
    1>zziplib.lib(zip.obj) : error LNK2019: unresolved external symbol ___zzip_get32 referenced in function ___zzip_fetch_disk_trailer
    1>D:\Depot\Lunatic\Source\Debug\Lunatic.exe : fatal error LNK1120: 3 unresolved externals



  • 5 min google bringen mich zu der Vermutung dass du fetch.c nicht zu deiner Projektdatei hinzugefügt hast...



  • Man ist das einerseits peinlich und andererseits bescheuert. Wieso ist das File nicht Teil des Projekts? (Es klappt jetzt, nur musst ich noch dem multiple text auf die Schliche kommen)

    Danke dir. 🙄



  • Was genau ist denn dieses ominöse d000050.o?



  • Das File befindet sich nirgends in meiner Ordnerstruktur.



  • Osbios schrieb:

    SDL_image kann auch Bilder direkt aus dem Ram laden.

    Na, dann einfach als png (packt besser als zlib allein) hintereinanderschreiben in ein großes file und per filemapping drauf zugreifen.



  • Habe ich mir auch gedacht, aber ich habe nun eine tolle Möglichkeit mit zziplib, was schon funktioniert, alles zu zippen und eine "Ordnerstruktur" für die Files zu nutzen. PNGs nutze ich eh 😉

    // Ich sehe gerade, dass Memory Leak mir ausspuckt, dass zziplib leaked 😮 73k Bytes ungefähr. Das werde ich weiter austesten.



  • zzlib hat doch sicher zlib als Abhängigkeit, hast du die auch mit dem richtigen Compiler gebaut?



  • zlib habe ich nicht gebaut, weil in der Readme stand, man soll das SDK oder was auch immer nehmen, welches die DLL, Includes und eine prebuilt LIB enthält.


Anmelden zum Antworten