Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

15.09.2015, 18:32

In C++ mit SDL2.0 und Visual Studio 2012 programmiertes Spiel veröffentlichen

Hallo Leute,
ich habe nun meinen Tetris Klon fertig programmiert und würde das Spiel gerne ein paar Leuten schicken oder im Internet zum Download anbieten. Nun weiß ich bereits, dass ich dafür den Debug-Ordner meines Visual Studio Projekts brauche. Diesen habe ich also in ein zip-Archiv gepackt und würde das Spiel dann so releasen wollen. Die ganzen Bilder und Sounddateien, sowie die für SDL2.0 notwendigen .dll-Files habe ich natürlich drin und wenn ich auf meinem PC lediglich die .exe aus diesem Debug-Ordner (also unabhängig vom Visual Studio Projekt) ausführe, läuft das Spiel so wie es soll.

Nun zu meinem Anliegen: Welche Rolle spielt die Bit-Version (32 oder 64) des Computers, läuft mein Spiel auf allen Windows-Versionen? Meine .cpp und .h Files werden ja kompiliert und dann vom Linker "zusammengebastelt". Dann sind .dll-Files doch dafür zuständig, den Code in für den Prozessor ausführbare Befehle zu übersetzen, also Assembly? Sind die .dll-Dateien in meinem Ordner und die, die "jeder" (?) auf seinem Windows-Rechner in System32 hat, ausreichend, um das Spiel überall spielen zu können? Ich habe von einigen Fällen in Foren gelesen, dass es Fehler gab, weil bestimmte .dll-Dateien fehlen.

Ich würde es sehr begrüßen, wenn man fürs Spielen meines Spiels einfach nur diesen Ordner braucht und auf die .exe doppelklicken muss. :) Ansonsten gibt es ja noch die Visual C++ Redistributables von Microsoft. Dies sind doch Packages mit allen nötigen Dateien, um quasi alles mit Visual Studio Programmierte ausführen zu können, aber ist das wirklich notwendig? Ihr seht, bezüglich all dieser grundlegenden Fragen besteht bei mir noch einiges an Nachholbedarf, und deshalb freue ich mich über jede Hilfe.

Liebe Grüße
huzzm

ByteJunkie

Alter Hase

Beiträge: 891

Wohnort: Deutschland

Beruf: Softwareentwickler

  • Private Nachricht senden

2

16.09.2015, 09:59

Welche Dateien Du genau benötigst kann ich Dir nicht sagen, da das Projektabhängig ist. Ich benutze bis jetzt immer Inno-Setup für meine Projekte. http://www.jrsoftware.org/isinfo.php
Mach was Du nicht lassen kannst und lass was Du nicht machen kannst. ;)

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

3

16.09.2015, 10:56

a) Du brauchst die Exe. Da sind alle Quelltexte reingeflossen, also alle .cpp-Dateien, alle .h-Dateien und auch jegliche Projekte, Solutions und so weiter. Die kannst Du alle weglassen.
b) Du willst nicht den Debug-Build, sondern eigentlich den Release-Build. Der ist hochoptimiert, ohne jede Fehlerprüfungen und läuft zigmal schneller. Einfach mal in Visual Studio in der Toolbar oben auf das "Debug" klicken und stattdessen "Release" auswählen.
c) Du brauchst die DLLs von Bibliotheken, die Du benutzt, aber dynamisch dazu linkst. Wenn Du SDL, SFML oder sowas benutzt, solltest Du die entweder statisch linken oder die dazugehörige DLL neben die Exe legen.
c2) Wenn Du die Standard-Projekteinstellungen nicht verändert hast, hast Du außerdem eine "versteckte" weitere Bibliothek, nämlich die Visual Studio C++ Runtime. Deine Optionen:
- CRT statisch linken. Alle Projekte im Solution Explorer auswählen, Kontextmenü, "Projekteigenschaften", Zeile "C/C++", Zeile "Codegenerierung", Eintrag "Laufzeitbibliothek", wechseln auf selbe Option ohne "DLL" hintendran
- CRT mitinstallieren. Bei den meisten dürfte die schon vorinstalliert sein, ansonsten holst Du Dir den hier und installierst den auf dem Zielrechner, z.B. mit einem Installerskript, wie ByteJunkie schrieb.
- CRT beilegen. Du extrahierst Dir die DLLs und legst sie neben die Exe wie alle anderen DLLs. Verletzt diverse EULAs, glaube ich, aber für Dein Spiel kann Dir das egal sein.
d) Du brauchst evtl. Datendateien, die Dein Spiel/Programm zur Laufzeit nachlädt. Ob und welche das sind, weißt nur du selbst.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

16.09.2015, 11:13

Hallo Leute,
ich habe nun meinen Tetris Klon fertig programmiert und würde das Spiel gerne ein paar Leuten schicken oder im Internet zum Download anbieten. Nun weiß ich bereits, dass ich dafür den Debug-Ordner meines Visual Studio Projekts brauche.

Halt, halt, halt, Moment, Stop. Nein, gerade den "Debug Ordner" brauchst du nicht. Was du brauchst, ist ein Relase-Build deiner .exe. Debug-Builds sind nicht zur Weitergabe gedacht, sondern nur zur Entwicklung der Anwendung. Ein Debug-Build wird per default nicht optimiert etc. Zur Weitergabe der Anwendung ist, wie der Name schon sagt, der Release-Build gedacht...

Nun zu meinem Anliegen: Welche Rolle spielt die Bit-Version (32 oder 64) des Computers, läuft mein Spiel auf allen Windows-Versionen?

64-Bit Windows kann sowohl 32-Bit als auch 64-Bit Anwendungen ausführen, 32-Bit Windows kann nur 32-Bit Anwendungen ausführen...

Meine .cpp und .h Files werden ja kompiliert und dann vom Linker "zusammengebastelt". Dann sind .dll-Files doch dafür zuständig, den Code in für den Prozessor ausführbare Befehle zu übersetzen, also Assembly?

Compiler und Linker übersetzen deine Anwendung in für den Prozessor ausführbahre Befehle. Deine .exe enthält Maschinencode. Eine DLL ist lediglich eine Programmbibliothek (ebenfalls in Form von Maschinencode), die erst während das Programm gestartet wird bzw. schon am Laufen ist, dazugeladen wird, das ist alles. Das macht Sinn für Bibliotheken, die von sehr vielen Programmen verwendet werden, denn anstatt den ganzen Maschinencode einer Bibliothek immer wieder in jedes Programm zu kopieren (genau das passiert effektiv mit statischen Bibliotheken), können alle Programme einfach die selbe DLL verwenden. Außerdem kann die DLL unabhängig von den Programmen, die sie verwenden, upgedated werden. Ansonsten müssten, wann immer eine Bibliothek upgedated wird, sämtliche Programme, die diese Bibliothek verwenden, ebenfalls neu kompiliert und gelinked werden, um die neue Version der Bibliothek zu verwenden...

Sind die .dll-Dateien in meinem Ordner und die, die "jeder" (?) auf seinem Windows-Rechner in System32 hat, ausreichend, um das Spiel überall spielen zu können? Ich habe von einigen Fällen in Foren gelesen, dass es Fehler gab, weil bestimmte .dll-Dateien fehlen.

Nicht unbedingt. Mit Visual C++ erstelle Anwendungen brauchen in der Regel die entsprechenden Visual C++ Laufzeitbibliotheken. Ein Debug-Build braucht dabei die Debug-Lauftzeitbibliotheken, ein Release-Build die Release-Laufzeitbibliotheken. Die Debug-Lauftzeitbibliotheken werden nur auf einem Rechner installiert sein, auf dem auch Visual Studio installiert ist. Die Release-Laufzeitbibliotheken können überall mit der Visual C++ Redistributable installiert werden.

Ich würde es sehr begrüßen, wenn man fürs Spielen meines Spiels einfach nur diesen Ordner braucht und auf die .exe doppelklicken muss. :) Ansonsten gibt es ja noch die Visual C++ Redistributables von Microsoft. Dies sind doch Packages mit allen nötigen Dateien, um quasi alles mit Visual Studio Programmierte ausführen zu können, aber ist das wirklich notwendig?

Wenn die Visual C++ Redistributable auf dem Rechner vorhanden ist, kannt man dein Spiel "einfach per Doppelklick starten". Es gibt auch noch andere Wege, aber ich würde diesen empfehlen...

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dot« (16.09.2015, 11:19)


5

16.09.2015, 14:50

Ich habe nun wie ihr es beschrieben habt, den Release-Build erstellt. Es ist eigentlich ziemlich logisch, dass für ein fertiges Spiel der Release Ordner verwendet werden muss, aber ich hatte mich halt noch nie damit beschäftigt und bisher immer nur den Debug Ordner als "Normalzustand" angesehen, aber naja. Jetzt bin ich ja schlauer. :D

Zur Bit-Version: Ich habe ja eine Win32-Anwendung erstellt und sofern erübrigt sich meine Frage dazu. Das läuft also auf beiden Versionen und somit auf allen Windows PCs.
Das mit den .dll-Dateien habe ich jetzt auch vollständig verstanden. Die nötigen dll-Dateien von den SDL libraries sind im Ordner beigefügt (liegen also neben der .exe). Das sollte nun auch funktionieren.


Ich habe nun - mysteriöser Weise - ein Problem mit dem Release-Build. Das Spiel funktioniert so wie es soll wenn ich die Debug-Version ausführe. Wenn ich allerdings das Release-Spiel öffne, "spinnt" das Programm ein bisschen: Der erste Tetris-Block fällt mit viel zu großer Geschwindigkeit auf den Bode, das Programm wechselt mit Hochfrequenz vom Pause in den Nicht-Pause Zustand, dementsprechend zeigt es den Pause-Screen an, dann wieder nicht, etc. (ohne, dass ich "ESC" für die Pause drücke!?) Jegliche Eingaben über die Tastatur (WASD oder Pfeiltasten zum Steuern der Blöcke) werden ignoriert. Als ob mein Spiel nicht released werden möchte, es spinnt wie gesagt komplett. Und ich verstehe nicht so ganz, warum. Hängt das mit den "Optimierungen" zusammen? Habe ich schlechten Code geschrieben (beispielsweise bezüglich der InputHandler-Klasse, welche die Eingaben über die Tastatur regelt)?

Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von »huzzm« (17.09.2015, 20:16)


dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

16.09.2015, 15:03

Und wenn du dein Spiel in Visual Studio mit dem Debugger ausführst, läuft es völlig ohne Fehler durch?

7

16.09.2015, 17:23

Und wenn du dein Spiel in Visual Studio mit dem Debugger ausführst, läuft es völlig ohne Fehler durch?
Ja genau! Komisch oder?

8

16.09.2015, 18:23

Sicher dass das Spiel die Framerate mit einberechnet?

9

16.09.2015, 18:39

Sicher dass das Spiel die Framerate mit einberechnet?
Die Framerate wird "künstlich" konstant auf 60 FPS gehalten. Ich benutze also eine fixed framerate, mittels SDL_Delay().

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

10

16.09.2015, 19:33

Fehler, die nur im Release-Build auftreten, liegen üblicherweise an nicht initialisierten Variablen. Du kannst auch in den Projekteinstellungen mal im Release-Build die Debuginformationen aktivieren. Damit kannst Du auch den Release-Build debuggen, selbst wenn das sehr unzuverlässig ist, weil der Compiler die Reihenfolge der Befehle umordnet und bisweilen komplette Variablen rausoptimiert. Solche Fehler findest Du allerdings auch im Debug-Build, indem Du mal durch Dein Spiel durchsteppst und nach komischen Zahlen wie Hex 0xcccccccc oder 0xcdcdcdcd Ausschau hältst.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

Werbeanzeige