Wie Spiele ohne Code weitergeben?

Für Fragen von Einsteigern und Programmieranfängern...
tryunderror
Beiträge: 57
Registriert: Di 9. Okt 2012, 17:32

Wie Spiele ohne Code weitergeben?

Beitrag von tryunderror »

Wir programmieren unter anderem Spiele in Pascal. Früher war es einfach. Man programmierte,
compilierte und schickte dann die EXE Datei herum. Aber heute haben die einen Kumpels
Fedora oder Arch oder Debian etc und dann geht das nicht. Oder doch? Wie kann ich
Spiele weitergeben ohne den Code weiterzugeben? In Java ginge das einfach, Applet hochladen
und das kann jeder dann mit Browser spielen.

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 582
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Winux (L 2.0.7 FPC 3.04)
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Wie Spiele ohne Code weitergeben?

Beitrag von fliegermichl »

Man muß den Code für jede Zielplattform compilieren (Stichwort crosscompile). Die Binaries kann man dann weitergeben.

kupferstecher
Beiträge: 266
Registriert: Do 17. Nov 2016, 11:52

Re: Wie Spiele ohne Code weitergeben?

Beitrag von kupferstecher »

tryunderror hat geschrieben:Fedora oder Arch oder Debian etc und dann geht das nicht. Oder doch?

Das sind doch alles (x86- bzw. AMD64-) Linuxe. Da reicht eine Binary und es sollte auf allen laufen. Auf einem Rasperry braucht man ein anderes Kompilat, weil sich die zugrundeliegende CPU unterscheidet. Das "Raspberry-Binary" laeuft dann aber auch auf anderen ARM-Linux-Plattformen mit passendem Befehlssatz.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 4138
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: Wie Spiele ohne Code weitergeben?

Beitrag von af0815 »

Ganz so einfach ist es nicht. Auch die benötigten Bibliotheken müssen vorhanden sein. Und auch das muss man bedenken.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Warf
Beiträge: 1421
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: MacOS | Win 10 | Linux
CPU-Target: x86_64
Wohnort: Aachen

Re: Wie Spiele ohne Code weitergeben?

Beitrag von Warf »

Lazarusanwendungen weitergeben ist beschissen (Zumindest im vergleich zu anderen Cross Plattform sprachen wie Java oder .Net mit Mono). Darum auch der Spruch write Once compile Anywhere und nicht write once use anywhere

Erst mal musst du rausfinden was für dependencies du benutzt. Eine Lazarus Anwendung benutzt ein Widgetset. z.B. Unter windows verwendest du normalerweise das Win32 Widgetset (was auf der WINAPI aufbaut). Unter Linux gibts praktisch 3 die Benutzbar sind. GTK2, QT4 und QT5. Je nach dem was du für ein lazarus installiert hast wird die entsprechende Standardversion ausgewählt. z.B. Auf meinem Manjaro wird standardmäßig QT5 verwendet (was ganz nett ist, denn im gegensatz zu QT4 und GTK 2 ists nicht seit 10 jahren outdated). Unter dem letzten Mint was ich ausprobiert hab wars allerdings ne GTK2 version. (Ich rede grade von denen aus dem paketmanager).

Um zu vermeiden das wenn du ne andere Lazarusversion benutzt dir alles um die Ohren fliegt solltest du also im Projekt das widgetset einstellen: Projektoptionen->Hinzufügen und Beeinflussen->Setze LCL WidgetSet Dropdown menü. Das was du da auswählst muss auf dem Zielsystem installiert sein. Wenn du also z.B. QT5 auswählst musst der endanweder QT5 installiert haben (das paket sollte QT, QT5 oder QT5-Devel oder so im paketmanager heißen).
Eine option das zu umgehen ist das WidgetSet Customdrawn. Damit sehen alle Controlls zwar aus als wären sie in den 90ern mit der damals aktuellen version von MS-Paint designed worden, aber es benutzt keine externen Bibliotheken und spricht direkt mit dem XServer zum zeichnen (was natürlich auch nur solange funktioniert wie auf dem Zielsystem X11 läuft, ich weiß nicht in wie fern das mit wayland compatibel ist)

Wenn du ein Spiel programmierst benutzt du sehr wahrscheinlich die SDL oder einen anderen Media Layer. Der muss natürlich auch installiert werden. Wenn du SQLite verwendest muss das auch nachinstalliert werden, etc.
Am besten setzt du dir ne VM mit Debian Stable oder Arch auf (auf jeden fall eine distro die nichts vorinstalliert hat) und versuchst so lange pakete nachzuinstallieren bis deine anwendung in der VM läuft. Die liste der Pakete kannst du dann deinen Freunden denen du das spiel geben willst geben, und dann müssen die Hoffen das es diese Pakete auch in ihrem Paketmanager gibt (manchmal heißen die komplett anders, und manchmal gibts die einfach ned, sodass man sie per hand installieren muss oder noch besser selbst vom Source kompilieren musst).
Um rauszufinden welche Libs du brauchst kannst du mal hier schauen: https://stackoverflow.com/questions/6242761/determine-direct-shared-object-dependencies-of-a-linux-binary. Dann musst du nur noch rausfinden in welchen Package die zu finden sind (unter debian gibts dpkg was das kann, unter arch kenn ich nix vergleichbares, da musst du wohl googlen)

Ich machs mittlerweile so wenn ich für meinen Server etwas programmiere, obwohl ich selbst n x86_64 linux habe, das ich mit Lazbuild auf dem Server meine Projekte kompiliere, weil ich dann sicher sein kann das, zumindest mit den standardeinstellungen es auf jeden fall funktioniert

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 582
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Winux (L 2.0.7 FPC 3.04)
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Wie Spiele ohne Code weitergeben?

Beitrag von fliegermichl »

Das hat aber rein gar nichts mit Lazarus zu tun sondern liegt an Linux und dessen diversen Versionen/Distributionen. Du kannst dein Programm genausogut in C schreiben. Dann müssen auch sämtliche externe Abhängigkeiten erfüllt sein.

MacWomble
Lazarusforum e. V.
Beiträge: 977
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 19.3 Cinnamon / FPC/Lazarus
CPU-Target: Intel i7 64/32 Bit
Wohnort: Freiburg

Re: Wie Spiele ohne Code weitergeben?

Beitrag von MacWomble »

Also ich mache das so:

Mein System ist Mint 64 Bit, in Virtualbox habe ich ein Windows (64Bit).
Ich kompiliere und teste die Programme auf beiden Systemen unabhängig voneinander.
Theoretisch könnte man dies auch für 32Bit noch ausbauen, aber das benötige ich ebenso wenig wie Mac oder Raspi (zumindest derzeit)

Der Aufwand ist so für mich nur minimal größer, da ich nur bei Bedarf die Windows-Exe erstelle, und das kommt äußerst selten vor :shock: :D .

Die notwendigen Pakete (DB-Client etc.) werden einfach per Script dazu installiert.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

Warf
Beiträge: 1421
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: MacOS | Win 10 | Linux
CPU-Target: x86_64
Wohnort: Aachen

Re: Wie Spiele ohne Code weitergeben?

Beitrag von Warf »

fliegermichl hat geschrieben:Das hat aber rein gar nichts mit Lazarus zu tun sondern liegt an Linux und dessen diversen Versionen/Distributionen. Du kannst dein Programm genausogut in C schreiben. Dann müssen auch sämtliche externe Abhängigkeiten erfüllt sein.


Deshalb hab ich geschrieben im vergleich zu Java oder Mono. Das Lazarus nicht besser ist als C stimm ich dir zu (wobei man argumentieren kann das wenn man immer QT verwendet es auch einfacher ist als 3 verschiedene Widgetsets für 3 verschiedene Plattformen zu verwenden).

Und ich muss auch Wiedersprechen. Man könnte Lazarus so bauen das es einfacher geht, z.B. könnte Lazarus alle Shared libs in die Ressourcen der Exec reinkompilieren. Da wird zwar jeder Vierenschutz anspringen, aber man hätte keine Kompatibilitätsprobleme mehr. (Nicht das ich das gut find, wär aber eine Möglichkeit)

Von Canonical gibts auch mittlerweile ne Möglichkeit, praktisch containerization für GUI Programme, keine Ahnung mehr wie das heißt, das liefert halt alle Libs in einer Datei mit

MacWomble
Lazarusforum e. V.
Beiträge: 977
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 19.3 Cinnamon / FPC/Lazarus
CPU-Target: Intel i7 64/32 Bit
Wohnort: Freiburg

Re: Wie Spiele ohne Code weitergeben?

Beitrag von MacWomble »

Warf hat geschrieben:Von Canonical gibts auch mittlerweile ne Möglichkeit, praktisch containerization für GUI Programme, keine Ahnung mehr wie das heißt, das liefert halt alle Libs in einer Datei mit


Die Sache mit den Containern finde ich absolut daneben. Bsp. RogerRouter Standard 2,4MB im Container aber knapp 250MB.
Selbst zu Zeiten günstigen Arbeitsspeichers ist ein solches Vorgehen m.E. totaler Unsinn!
Stelle man sich vor, alle Programme kämen in Containern oder als Flatpack daher ... :shock:
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

Warf
Beiträge: 1421
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: MacOS | Win 10 | Linux
CPU-Target: x86_64
Wohnort: Aachen

Re: Wie Spiele ohne Code weitergeben?

Beitrag von Warf »

MacWomble hat geschrieben:
Warf hat geschrieben:Von Canonical gibts auch mittlerweile ne Möglichkeit, praktisch containerization für GUI Programme, keine Ahnung mehr wie das heißt, das liefert halt alle Libs in einer Datei mit


Die Sache mit den Containern finde ich absolut daneben. Bsp. RogerRouter Standard 2,4MB im Container aber knapp 250MB.
Selbst zu Zeiten günstigen Arbeitsspeichers ist ein solches Vorgehen m.E. totaler Unsinn!
Stelle man sich vor, alle Programme kämen in Containern oder als Flatpack daher ... :shock:


Doch, Container haben ihren sinn, vor allem wenn man verschiedene Linux Distros abdecken will. Ich arbeite an der Uni am lehrstuhl, und wir haben ein Projekt mit dem verschiedene Studenten ihre Bachelor und Masterarbeiten machen. Das Projekt ist nicht trivial, benötigt ganz spezielle versionen vieler einzelner Komponenten. Klar kann man den Studis sage: Verwendet erst mal nen monat eurer Zeit darauf das ganze überhaupt auf eurer Distro zum laufen zu bekommen (was bei ner BA gut ein viertel der Zeit die der Studi insgesammt zu verfügung hat) oder man gibt ihnen einfach einen Docker Container und es läuft direkt am ersten Tag.


Dann ist da auch noch das Problem mit den Distros. Auf debian Stable gibt es von vielen Bibliotheken einfach keine aktuelle version (Und debian stable ist die meistverwendet distro, Ubuntu, Mint, etc. alle bauen drauf auf). Kleines beispiel die aktuelleste version von Crypto++ auf Debian Stretch ist version 5.6.4-8, die ist 6,5 Jahre alt. Wenn du eine halbwegs aktuelle version willst musst du sie aus den Experimental Repositories runterladen.
Und es gibt einfach User denen kannst du nicht zutrauen selbständig rauszufinden wo sie die benötigte Version herbekommen (und eine Readme für jede mögliche Distro zu schreiben ist auch viel zu viel aufwand). Oder noch besser wenns die software für eine Distro einfach überhaupt nicht gibt und du sie dir vom Source kompilieren musst, das kannst du sogar nicht mal jedem Linux nerd zutrauen. Währenddessen eine AppContainer (so heißt glaub ich das cannonical format) runterzuladen und doppelklick drauf zu machen schafft jeder.

Anderes beispiel Gitlab. Auf meine Server habe ich mittlerweile schon zwei mal Gitlab aufgesetzt, einmal per hand einmal mit Docker Compose. Per hand hat es 2,5 tage gedauert, damit es in einem State war mit dem es zumindest gelaufen ist, mit docker Compose c.a. 20 minuten und es updatet automatisch und alles läuft wunderbar. Sogar mit MySQL interface (was ich beim per hand aufsetzen irgendwann aufgegeben habe).

Ich mein ich hab das privat gemacht, da ist das nicht so tragisch, aber sagen wir mal du bist Chef von nem unternehmen. Was machst du da, bezahlst du jemandem 2,5 Tage, bei 15€-20€ die Stunde (also 200€-300€) oder lässt du ihn einfach einen Docker container aufsetzen in 20 minuten. Der grund warum containerization aktuell so durch die Decke geht ist weil Hardware billiger ist als Arbeitszeit.

Anderes beispiel, du bist ein Unternehmen wie Slack was ein softwareprodukt herstellt. Was ist wohl finanziell besser, einen haufen tester und it fachmänner zu bezahlen um ein Package für jede Distro rauszubringen, und das auf diesen Distros auch entsprechend zu testen, oder einen Docker container rauszubringen den du nur auf einem system testen musst, weil du garantiert bekommst das es auf jedem System gleich laufen wird?

Und das ist noch nicht alles, als Endnutzer ist der Comfort natürlich auch viel höher. Wie gesagt bei diesen AppContainern kann man die einfach runterladen und doppelklick drauf machen, und es funktioniert. Jetzt stell dir mal vor du hast 3 Programme, jeder von denen braucht ne eigene LLVM version (weils gegen die Clang API oder so bindet). Als avider C++ entwickler will man natürlich auch die neuste LLVM version haben, also benötigt man 4 LLVM versionen. Na herzlichen glückwunsch das system zu warten. Beim container ist alles mit dabei, wenn ich den container lösche sind auch alle dependencies weg, und ich muss mir nie wieder gedanken um verschiedene versionen machen. Allein verschiedene FPC versionen zu benutzen ist absolut scheiße, weil um die default FPC version zu wechseln musst du einen symlink in /usr/bin ändern, benötigst also root rechte. Ich hab sogar schon überlegt, da ich aktuell ein paar größere Projekte aus FPC 2.8er zeiten habe, die zu aufwendig sind sie zu porten (bzw ich keine zeit habe), aber immer mal wieder ein bisschen weiter dran bastel, mir die FPC und Lazarustoolchain zu dockern, damit ich einfacher meine verschiedenen FPC versionen managen kann

MacWomble
Lazarusforum e. V.
Beiträge: 977
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 19.3 Cinnamon / FPC/Lazarus
CPU-Target: Intel i7 64/32 Bit
Wohnort: Freiburg

Re: Wie Spiele ohne Code weitergeben?

Beitrag von MacWomble »

Bei mir kommt nur Software auf as System, welche nativ und ohne Container läuft.

Sicher bergen Container manche Vorteile, aber es gibt auch Nachteile:
- Speicherbedarf und Anspruch an Rechenleistung ist höher
- Containerinhalte werden nicht im normalen Turnus aktualisiert
- Verteilung von Containern ist u.U. teurer und aufwändiger (Serverspace, Traffic, Aktualisierungen)

Für manche Anwendungen mag es ja Sinn ergeben, z.B. wenn für Studenten ein Paket mit allen notwendigen Programmen und Daten bereit gestellt werden soll.

Meine Software wird in kleineren und mittleren Betrieben eingesetzt und in der Regel sind die System dort mit Linux Mint ausgestattet.
Die paar Abhängigkeiten, die es dann noch zu erfüllen gilt werden über ein Script realisiert. Die Ersteinrichtung mache ohnehin ich, was meine Aufgabe von deinen Wünschen unterscheidet. Dennoch sehe ich kein Problem darin, eine Version für Linux und eine Version für Windows bereit zu stellen. Im Extremfall muss ich halt zwei oder drei Installationspakete schnüren (für Windows evtl. ein Setup-Programm, für Linux eher ein Script oder eine deb, welche dann ja auch die Abhängigkeiten kennt und nachfordert.

Es ist halt von Fall zu Fall unterschiedlich und ich werde nie ein Freund von Containern werden. Alleine schon die Vorstellung, x Varianten ein und derselben Bibliothek in einem System zu wissen, ist für mich absoluter Horror. (Wenn ich das möchte, werde ich wieder Windowsentwickler ;-) )
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

Warf
Beiträge: 1421
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: MacOS | Win 10 | Linux
CPU-Target: x86_64
Wohnort: Aachen

Re: Wie Spiele ohne Code weitergeben?

Beitrag von Warf »

Sicher bergen Container manche Vorteile, aber es gibt auch Nachteile:

Diese Nachteile wurden mittlerweile, zumindest bei Docker zum großteil ausgebügelt
MacWomble hat geschrieben:- Speicherbedarf und Anspruch an Rechenleistung ist höher

Speicherverbrauch ja, aber nicht sonderlich viel, du hast im worst case nen halbes Linux system, was 200MB frisst. Aber, docker container teilen gemeinsame grundkomponenten. Für Serversoftware wird gerne ein Alpine Linux als grunddocker verwendet. D.h. alle Dockercontainer die auf dem selben Alpine aufbauen sharen diese dateien. Somit ist der Speicherverbrauch von einem Container eventuell mit 200mb viel größer als die Normale Anwendung, sobald du aber 2 Docker container hast die drauf aufbauen ist der Overhead pro container nur noch die hälfte, bei 3 ein drittel und so weiter. Z.B. auf meinem Server habe ich mehrere Container die alle samt einen MySQL server brauchen, der für jeden dieser Container auch gedockert ist. Zwar laufen dann 3-4 MySQL server auf meinem Server, aber es wird dennoch nur einmal Speicherplatz belegt (Und das mehrere MySQL Instanzen laufen ist grad auf einem Server aus sicherheitstechnischer sicht sogar erwünscht)
Was Rechenleistung angeht verlierst du bei docker fast nichts (Docker läuft auf >99% nativer performance CPU wise und nur Netzwerktraffic ist etwas hintendran mit knapp 80-90% nativer leistung da docker Effektiv ein NAT zwischen schaltet), solang docker auf dem selben OS läuft (also Linux Container auf Linux Host, distro mehr oder weniger egal). Wenn du natürlich auf Windows nen Linux Container startest wird ne VM gestartet und du bist wieder bei der selben Performance die du mit KVM bekommst
MacWomble hat geschrieben:- Containerinhalte werden nicht im normalen Turnus aktualisiert

Größere Unternehmen aktualisieren ihre Dockerimages im selben Zyklus wie ihre Stable Releases, zumindest im Server sektor ist Docker standard, und es ist eher die Ausnahmen wenn jemand nicht Docker verwendet. Natürlich hat das beim Server auch Sicherheitstechnische gründe (Wenn eine Software in einem Container ne sicherheitslücke hat ist das schlimmste was passieren kann das jemand diesen Container infiziert, dein Hauptsystem bleibt sicher), aber du wirst kaum ein größeres Softwareprojekt finden das nicht gedockert ist.
In den meisten größeren Unternehmen wird das Docker image sogar voll automatisiert von die CI/CD pipeline gebaut, und du hast z.T. eher das problem das die nicht docker version outdated ist. (CI/CD ist auch so ne sache die erst seit Containerization wirklich gut geworden ist)
MacWomble hat geschrieben:- Verteilung von Containern ist u.U. teurer und aufwändiger (Serverspace, Traffic, Aktualisierungen)

Der Initiale Traffic ist mehr, aber wie gesagt, docker shared grundelemente. Und Updates werden auch nur deltas geladen, also wenn du einen Container updatest werden nur die Dateien im Container überschrieben die auch wirklich geändert wurden. Und Updates gehen mit docker compose einfacher als alles andere, Seit dem ich docker compose benutze musste ich keine einzige software auf meinem server mehr per hand updaten, und in den 1-2 Jahren seit dem ich fast meinen ganzen Server gedockert hab ist auch noch nichts kaputt gegangen (im gegensatz dazu wenn man per hand alles konfiguriert).

Als jemand der selbst nen Server mit mehreren Diensten managed, kann ich dir sagen das alles außer Docker zu verwenden schlicht und ergreifend unsinnig, es kostet mehr zeit, ist Unsicherer, und wenn du verkackst kannst du alle deine Services auf einmal kaputt machen.
Außerdem, ein Terrabyte SSD kostet nur 80€. d.h. Wenn du durch docker 4 Stunden arbeitszeit für eine Fachinformatiker bei 20€/h einsparst, hast du den speicheroverhead für die Nächsten tausend Dockercontainer bereits rausgeholt.

Und ich habe oben auch kurz mal CI/CD angeschnitten, es gibt natürlich noch extrem viele andere dinge für die Containerisation essentiell ist. Z.B. Wenn du einen CloudServervice, z.B. bei AWS einrichtest, muss deine Serversoftware als Container vorliegen, denn Amazon muss innerhalb weniger Sekunden diese Software auf duzenden Rechnern aufziehen können, und die auch wieder Runterwerfen können, ohne das erst mal ein paar stunden Dependencies installiert werden können. Oder wenn du Multiple Worker über Kubernetis Managest geht das alles über docker, weil du mit sehr wenig aufwand die Anzahl an containern erhöhen oder veringern kannst, während Docker sich um die Dateisynchronisation und Netzwerk Managing kümmert

Damit schweifen wir aber ein bisschen vom Thema ab, da es jetzt eher um die Container für Serversoftware, bzw commandline programme (wird auch sehr gerne für Buildtoolchains verwendet, und um ehrlich zu sein, für manche FPC sachen wie FPC für android würde so eine docker toolchain sogar sinn machen) geht.

Das AppContainer format von Cannonical hat im allgemeinen 2 Ziele, 1. Programme sollen auf jedem Linux unabhängig von der Distro laufen, 2. Alte Programme für die die Dependencies schlicht weg nicht mehr auf neueren Kernel versionen laufen sollen damit auch auf modernen Linuxsystemen laufen. Und dafür sind die echt perfekt. Grade wenn alte Software hat auf Linux echte probleme, da du in den Paketmanagern für gewöhnlich keine alten Dependencies mehr findest, und bei Major Kernel Updates z.T. die Rückwärtskompatibilität gebrochen wird (im gegensatz zu windows, was heut noch Windows95 Software unterstützt)
Grade für Spiele bietet es sich mMn sogar an, da ein Spiel normalerweise sich eh im MB bereich befinden vom speicherverbauch (wenn nicht sogar multible GB groß), der Overhead also praktisch nicht merkbar ist

sstvmaster
Beiträge: 332
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: OS: Windows 10 | Lazarus: 2.0.8 + Fixes + Trunk 32bit
CPU-Target: 32Bit
Wohnort: Dresden

Re: Wie Spiele ohne Code weitergeben?

Beitrag von sstvmaster »

OT:
Warf hat geschrieben:... Fachinformatiker ... 20€/h ...

Den hätte ich auch gern. Real eher ab 80€/h netto.
LG Maik

MacWomble
Lazarusforum e. V.
Beiträge: 977
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 19.3 Cinnamon / FPC/Lazarus
CPU-Target: Intel i7 64/32 Bit
Wohnort: Freiburg

Re: Wie Spiele ohne Code weitergeben?

Beitrag von MacWomble »

sstvmaster hat geschrieben:OT:
Warf hat geschrieben:... Fachinformatiker ... 20€/h ...

Den hätte ich auch gern. Real eher ab 80€/h netto.


... und dann wäre der noch günstig.

Aber darum geht es ja hier nicht. Ich will auch keine Grundsatzdiskussion vom Zaun brechen, nur weil die Frage 'wie verteile ich ein Spiel' im Raum steht.
Aber ich verwende Linux, weil es um Welten schneller ist, als manch anderes OS, und das mache ich mir durch Container nicht wieder kaputt.
Und Container benötigen mächtig Rechenzeit und Systemleistung, wie ich bei diversen Programmen feststellen musste.
Die Docker- oder Flatpack-Versionen brauchten immer ein vielfaches an Ladezeit der nativen Anwendung sowie meist mindestens den hundertfachen Plattenspeicher.
Der Arbeitsspeicher wurde ebenfalls strapaziert und bei mehreren Dockeranwendungen gleichzeitig (ausgeführt) kam es sogar vor, dass der Auslagerungsspeicher benutzt wurde. Auf meinem Rechner mit Linux und 8GB RAM kam das sonst noch nie vor.
Deswegen meine Meinung: Docker bzw. Container 'können' sinnvoll sein, aber in den meisten Fällen ist das m.E. Mumpitz.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

Warf
Beiträge: 1421
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: MacOS | Win 10 | Linux
CPU-Target: x86_64
Wohnort: Aachen

Re: Wie Spiele ohne Code weitergeben?

Beitrag von Warf »

sstvmaster hat geschrieben:Den hätte ich auch gern. Real eher ab 80€/h netto.


War das ergebnis vom google für Durchschnittsgehalt. Laut StepStone (und vieler weiterer quellen, aber stepstone scheint die seriöseste zu sein) ist das durchschnittsgehalt für Fachinformatiker im bereich systemintegration (darüber reden wir ja) über ganz Deutschland 20€-30€ pro Stunde. Laut . 80€/h ist ein bisschen sehr hoch, immerhin ist das so ziemlich das Durchschnittsgehalt von nem Masterabsolventen in den ersten paar Jahren. Ich bezweifle das ein nicht studierter Fachinformatiker so viel verdient (zumindest im durchschnitt)

Und Container benötigen mächtig Rechenzeit und Systemleistung, wie ich bei diversen Programmen feststellen musste.

Glaub ich dir nicht. IBM hat sich die Performance mal angeschaut und dazu ein Paper veröffentlicht, welches in diesem Stackoverflow post schön zusammengefasst wurde: Link.

Ich hab grad selbst einen kleinen Test gefahren, folgendes C++ Programm:

Code: Alles auswählen

#include<iostream>
#include<chrono>
 
int fib(int i) {
  if (i==0) return 0;
  if (i==1) return 1;
  return fib(i-1) + fib(i-2);
}
 
using namespace std::chrono;
int main() {
  int res = 0;
  auto s = steady_clock::now();
  for (int i=0;i<40;i++)
    res += fib(i);
  std::cout<<res<<"\n";
  auto e = steady_clock::now();
  auto delta = duration_cast<duration<double>>(e-s);
  std::cout << delta.count() << " seconds\n";
  return 0;
}

10 Mal in nem Debian Stable Docker und 10 mal auf meinem Nativen System laufen lassen. Die durchschnittliche zeit Nativ war 1,09 sekunden und auf docker 1,10 Sekunden.Das ist weniger als 1% performanceunterschied, zu ähnlichen ergebnissen kam auch die IBM Studie.

Und auch wenn man sich anschaut wie Docker funktioniert, würde es überhaupt keinen sinn ergeben das es viel langsamer laufen würde. Die Kernelebene wird komplett vom nativen System übernommen, d.h. der Prozess läuft, auch wenn er in nem Dockercontainer ist, letztendlich auf nem nativen Linux (Und wird in htop auch als ganz normaler Prozess angezeigt), praktisch das einzige was von Docker "emuliert" werden muss ist das Netzwerk, den rest übernimmt alles der native kernel.

Die Docker- oder Flatpack-Versionen brauchten immer ein vielfaches an Ladezeit der nativen Anwendung sowie meist mindestens den hundertfachen Plattenspeicher.

Ladezeit ist ein ganz anderes Thema, als Rechenleistung. Docker hat ewige Ladezeiten, das stimmt, das liegt an der Effizienten Speicherung der Docker container, wenns aber einmal geladen ist hast du performancemäßig keinen unterschied.
Zur größe, wie gesagt speichert docker nur Deltas, also nur unterschiede. z.B. wenn ich nen Debian:stable container bei mir starte und nichts damit mache verbraucht dieser keinen speicher, weil sich noch nichts geändert hat (im vergleich zu dem image von dem der container erstellt wurde). Mach ich jetzt ein apt-get update so ist der speicherverbauch bei 17 MB (die größe der Package repositories). Natürlich muss alles was der Container benutzt auch in diesem gespeichert werden. Wenn du also GTK benutzt müssen die vollen 800 MB von GTK im container gespeichert werden.

Außerdem, und das sage ich hier immer wieder, Speicher kostet nix. SSD speicher kostet 6-8 ct pro Gigabyte. Eine typische Lazarusanwendung benötigt QT5, libx11 und dann noch standard Linux systemlibs (libc, libdl). Die systemlibs sind schon im docker image drin, der einzige extra speicher ist also QT und libx11. Das sind zusammen nicht mal 600 MB. Das heißt, die effektiven Kosten für den overhead sind c.a. 4 ct.

Der Arbeitsspeicher wurde ebenfalls strapaziert und bei mehreren Dockeranwendungen gleichzeitig (ausgeführt) kam es sogar vor, dass der Auslagerungsspeicher benutzt wurde. Auf meinem Rechner mit Linux und 8GB RAM kam das sonst noch nie vor.

Der Grund dafür ist auch sehr einfach. Die libraries werden ganz normal über den nativen Kernel geladen. Wenn du zwei mal die selbe Libary laden möchtest wird diese nicht zwei mal geladen, sondern nur einmal und in beide Prozesse gelinkt. Wenn also der RAM verbrauch höher ist, liegt das daran das unterschiedliche libs (unterschiedliche versionen benutzt werden). Und das ist ja genau das was du willst. Du willst garantieren das die Dependency version die selbe auf dem Zielsystem ist wie die die du zum entwickeln verwendest. Sagen wir du willst das nativ machen, dann führt kein weg dran vorbei, (exakt) diese version mitzuliefern (z.B. durch ein script das die runterlädt), und dann muss die auch geladen werden. Du gewinnst also nichts. Klar kannst du sagen ich benutz einfach die version aus dem Paketmanger und hoffe das die pi mal daumen die richtige version ist. Aber das ist ja genau das was du vermeiden willst. Genau deshalb haben wir diese diskussion ja.
Ich führe mein beispiel von der Crypto++ nochmal an. Auf debian ist die höchste version die du bekommst die version 5.5, auf arch die version 8.x. d.h. wenn du garantieren möchtest das dein programm auf einem fremden linux läuft, ohne das du ein script schreiben musst was für jede einzelne DIstribution auf dem markt den paketmanager korrekt anspricht (z.B. bei debian dann experimental runterlädt), musst du die binaries direkt runterladen/mitliefern. Dann wiederum hast du aber keinen vorteil mehr gegenüber Docker.

Auf meinem Rechner mit Linux und 8GB RAM kam das sonst noch nie vor.

8GB RAM sind ja auch nix. Mein 6 jahre alter Laptop hatte bereits 8 GB ram. 8GB DDR4 Ram kosten 30€. Ich bin aktuell am überlegen in meinem Hauptrechner auf 64 GB (von 32) zu upgraden. Der laptop Markt hat ein bisschen verpennt, sodass man heute noch 8GB modelle findet, aber jeder vernünftige PC hat heutzutage hat mindestens 16GB. Moderne Handys haben bereits 8GB ram (z.B. das One Plus 6 was letztes jahr rauskam)

Deswegen meine Meinung: Docker bzw. Container 'können' sinnvoll sein, aber in den meisten Fällen ist das m.E. Mumpitz.

Ich würde es genau anders rum sagen. Container sind in den meißten fällen Sinnig, können natürlich aber auch Mumpitz sein, wenn man z.B. einen ewig alten rechner hat, der eventuell sogar noch auf ner HDD läuft und keinen RAM hat.

Aber darum geht es ja hier nicht. Ich will auch keine Grundsatzdiskussion vom Zaun brechen, nur weil die Frage 'wie verteile ich ein Spiel' im Raum steht.

Es ist doch äußerst relevant, denn wenn man garantieren will das die Dependencies vorhanden sind, sind container die beste Möglichkeit. Sie garantieren korrekte dependencies und sind für den Endnutzer einfach zu bedienen. Du brauchst nicht mal adminrechte um in einem Docker container eine neue Dependency zu installieren. Ja sie brauchen mehr speicher, und ja sie brauchen mehr ram, wenn man den Overhead von ein paar hundert MB in beiden nicht verkraften kann ists die falsche Lösung. Sie sind nicht langsamer, oder in irgendeiner form unperfomanter, außer beim Starten (und das auch nur bei docker, andere Container formate sind da effizienter, Docker ist halt für Server optimiert, die müssen einmal starten und laufen dann für Monate).
Für entwickler sind Container sogar auch eine super lösung. So kannst du z.B. recht einfach dein CI/CD so konfigurieren das jedes mal wenn du einen GIT branch auf den Master branch mergest, die CI vollautomatisiert einen Dockercontainer baut und den in ein Docker Register hochlädt. Somit musst du als entwickler nichts mehr machen um deine Anwendung zu publishen. Der nutzer lädt einfach das Image aus dem Register runter, und hat immer die neuste version. Voll automatisiert. Nie wieder kleinlich Release builds per hand zusammen bauen. Mit dem Kommandozeilen programm Lazbuild kannst du das sogar relativ problemlos für Lazarusanwendungen bauen

PS: Ich wollte mich eigentlich zurückhalten, aber:
Aber ich verwende Linux, weil es um Welten schneller ist, als manch anderes OS, und das mache ich mir durch Container nicht wieder kaputt.

Linux ist im allgemeinen nicht schneller als Windows. Linux ist schneller im booten weil es weniger laden muss als Windows, das heißt aber nicht das du dir nicht auch dein linux so zumüllen kannst das es langsamer ist. Windows startet z.B. immer OneDrive, Windows Defender, Windows Firewall und ne ganze reihe anderer systemdienste, was du in einem frischen Linux system einfach nicht hast. Im gegensatz dazu möchte ich gerne an die Zeit erinnern als Canonical Ubuntu vollkommen zugemüllt hat mit allen möglichen adwares und sonstigem, sowie Unity. Da war Ubuntu von der perfomance vergleichbar zu Vista.
Generell, wenn es um grafischen kram geht ist Windows schneller als Linux, da es im system integriert ist. Bei nicht grafischen Programmen ist Linux schneller als Windows da es darauf besser optimiert ist. In linux ist das dateisystem viel schneller, in Windows wiederum das Starten von Prozessen und laden von Executables (Linux's fork mechanik ist absolut beschissen, selbst das optimiert clone ist immernoch langsamer als Windows) und Bibliotheken.
Pauschal zu sagen Linux wäre schneller als Windows ist schlicht weg falsch.

Wenn du mal was lustiges sehen willst mach das folgende, schreib eine anwendung die eine datei öffnet, einen childprozess forkt, und dann terminiert. Der childprozess lädt dann die selbe executable via exec und macht dann genau das selbe. Nach ein paar hundert iterationen wirst du merken das Linux zum forken eines neuen Prozesses bereits schon mehrere Sekunden bis Minuten braucht. Unter windows kannst du lang versuchen einen Syscall zu finden der mehr als ein paar millisekunden braucht (außer natürlich blockende calls wie Sleep oder Read). Nach 65 tausend iterationen sind schließlich auch alle möglichen Filedeskriptoren von Linux aufgebraucht (denn Linux erzeugt ein FileDescriptor leak beim forken) was letzendlich dazu führt das du keine neuen Programme mehr starten kannst, keine Dateien mehr öffnen kannst, und das wird über kurz oder lang zu einem Kompletten systemcrash führen. Solches verhalten suchst du unter Windows ziemlich vergeblich, moderne Windows versionen sind nahezu unkaputtbar.

Versteh mich nicht falsch, ich benutze gerne Linux, lieber als Windows, aber zu behaupten es wäre schneller, oder im allgemeinen besser, ist schlicht weg falsch. Für das was ich damit mache/machen will ist Linux unendlich viel besser als Windows, es erlaubt mir volle Kontrolle und die GNU Utilities sind genial, aber für andere Nutzer ist z.B. die eigenschaft das du bei Linux ohne die Konsole nicht weit kommst, oder die Tatsache das du bei Linux z.T. einfach wissen musst wie das system funktioniert um alltägliche dinge zu erledigen, ein riesen Problem. (Und bevor jetzt von jemanden die antwort kommt "du kannst auch ohne die Konsole arbeiten", darf diese person mir doch bitte erklären wie ich ohne die Konsole oder halbwegs tief greifendes wissen über Window Manager einen Skalierungsfaktor für nur einen Bildschirm (von mehreren) einstelle. Wenn man einen High DPI und einen normalen bildschirm hat ist das unerlässlich)

Windows hat ein riesen Problem, rückkompatibilität. In Windows 10 sind bis heute Code stücke drin die garantieren sollen das Windows 95 Software immernoch drauf läuft. Das ist z.T. ein grund dafür das manche Sachen nicht so sonderlich schnell laufen. Das ist mMn. keine sonderlich gute Entscheidung von MS gewesen, die hätten alle paar versionen einen Cut machen sollen, z.B. das Win 7 Bis WinXP unterstützt, Windows 10 bis Windows 7 oder so, aber Microsoft hat extrem viele Firmenkunden, da kann ich das irgendwie verstehen. Und dafür braucht man unter Windows keine Container wenn man ältere Software ausführen will (was ja der Hauptgrund ist warum Canonical das AppContainer format entwickelt hat)

Antworten