Warum C Code in vielen Spieleprogrammier bücher bzw. Tutorial
-
Was ist der eigentlich der Unterschied zwischen einer Engine und einer z.B. DirectX Bibliothek? Ich hab das immer noch nicht begriffen.
Gruß Blacky
-
Engine siehe hier: https://secure.wikimedia.org/wikipedia/de/wiki/Gameengine
Directx stellt die Funktionen zur Verfügung, um die Darstellungen, die die Engine generiert, auf dem Bildschirm anzuzeigen, mal so ganz grob gesagt.
-
BlackFalcon schrieb:
Ja gut im grunde genommen kann eh jeder machen was/wie er es will. Mich wundert nur das in den meisten Spieleprogrammierbücher die von C++ sprechen nur C Code enthalten. Naja vielleicht sollte ich aber auch mal ein Buch zu ende lesen.
Ich lerne jetzt sowieso erst mal c++ mit diesem Buch: http://www.amazon.de/Einführung-die-Programmierung-mit-C/dp/3868940057/ref=sr_1_5?s=books&ie=UTF8&qid=1306216911&sr=1-5 ist zwar teuer aber eine gute Lektüre vor allem vergeht mir nicht der Spaß am lesen an diesem Buch was bei mir der Hauptgrund ist warum ich keine Bücher fertig bekomme
Mann, der Preis von diesem Buch ist in den vergangenen Jahren ja heftigst angestiegen.
Früher bekam man so ein Buch für 50 €.
-
dot schrieb:
Flori() schrieb:
Der Autor des von mir benannten Buches sagt auch folgendes:
Wann immer Sie vor der Aufgabe stehen etwas in C++ realisieren zu müssen, das in C einfacher machbar ist, dann rate ich Ihnen schweren Herzens, auf C-Code zurückzugreifen.
Ich glaub der Autor hat nicht so wirklich verstanden was C++ ist...
Objektorientierte Bloatware!
-
BlackFalcon schrieb:
60€ für ein Buch über C++ Programmierung halte ich ehrlichgesagt für rausgeschmissenes Geld
Wenn damit leichter lerne, ist mir der Preis völlig egal. Es darf nur nicht zuviel kosten.
Wann ist denn für dich zu viel?
Also > 70 € für ein Programmierbruch sind eigentlich nicht normal.
Wie schon gesagt, der Standardpreis für die wirklich guten Bücher, also nicht solche 30 € in 10 h Lernbücher ohne Inhalt, liegt bei 50 €.
-
Ich weiß es! schrieb:
dot schrieb:
Flori() schrieb:
Der Autor des von mir benannten Buches sagt auch folgendes:
Wann immer Sie vor der Aufgabe stehen etwas in C++ realisieren zu müssen, das in C einfacher machbar ist, dann rate ich Ihnen schweren Herzens, auf C-Code zurückzugreifen.
Ich glaub der Autor hat nicht so wirklich verstanden was C++ ist...
Objektorientierte Bloatware!
...Aber wie du siehst ist der Autor damit bei weitem nicht allein...
-
Nexus schrieb:
Der Wrapper schrieb:
Die meisten APIs sind nunmal C basiert, dazu gehört auch die SDL, OpenAL und OpenGL, 3 wichtige Bibliotheken für die Spieleprogrammierung.
SDL ist nicht wichtig, da es eine austauschbare Highlevel-Bibliothek ist.
In der Open Source Szene oder für kleine Projekte ist die SDL wichtig und gerade Spieleprogrammieranfänger profitieren von ihr deutlich.
Klar kann man sie auch gegen eine eigenen Highlevel-Bibliothek austauschen und eigenes crossplattformfähiges Threading, Tastatur- und Joysticksteuerung usw. in seinen Code einbauen, aber warum sollte man sich diese Arbeit machen?
Insofern ist die SDL eine super Bibliothek.
Für 30 Mio € teure Großprojekte kann man natürlich auch alles selber in den Code einbauen, wenn es die gekaufte 3d Engine nicht schon von Haus aus mitbringt. Aber für Kleinstprojekte muß man sich so etwas ja nun wirklich nicht antun.Mit SFML existiert inzwischen auch eine massiv bessere Alternative, besonders für C++.
Klar, die SFML ist ja auch in C++ geschrieben und nicht in C, wie die SDL.
Aber daraus folgt auch, daß sie eigentlich nur für C++ Code sinnvoll ist, für alle anderen Spiele in anderen Programmiersprachen, also Python, Pascal usw. nimmt man dann doch besser die SDL weil diese eben in C geschrieben ist und die meisten Programmiersprachen eben spielend mit C Code klarkommen.
Was im umgekehrten Fall, also C++ Code eben meist nicht der Fall ist.
Da müssen dann von Phyton zu C nach C++ Zwischenwrapper bzw. Bindings her und die machen das ganze dann wieder langsam oder einfach nur fetter.Und mit Low-Level-Frameworks wie OpenGL muss man auch nicht unbedingt zu tun haben, wenn man Spiele programmiert. Das hängt sehr von den genauen Ansprüchen ab. Sobald man abstrahierende Frameworks verwendet, gibt es vieles direkt für C++, z.B. die Open-Source-Grafikbibliotheken Irrlicht und Ogre.
Irrlicht und Ogre sind fertige 3d Grafikengines und nicht nur Grafikbibliotheken.
Hättest du OSG gesagt, ja, dann würde es anders aussehen.
-
Burkhi schrieb:
Engine siehe hier: https://secure.wikimedia.org/wikipedia/de/wiki/Gameengine
Man beachte den Unterschied:
Grafikengine != GameengineEine Grafikengine ist nur eine Teilmenge aus einer Gameengine.
OGRE oder Irrlich sind z.B. keine Gameengines, sondern nur eine Grafikengines.
Dafür ist Crystal Space eine Gameengine.Directx stellt die Funktionen zur Verfügung, um die Darstellungen, die die Engine generiert, auf dem Bildschirm anzuzeigen, mal so ganz grob gesagt.
Das ist falsch.
Diesen Teil macht nur Direct3d, eine Teilmenge von DirectX
DirectX kümmert sich auch um die Soundausgabe und Eingabegeräte etc.
-
Der Wrapper schrieb:
Klar kann man sie auch gegen eine eigenen Highlevel-Bibliothek austauschen und eigenes crossplattformfähiges Threading, Tastatur- und Joysticksteuerung usw. in seinen Code einbauen, aber warum sollte man sich diese Arbeit machen?
Ich habe nicht von Selbstmachen gesprochen. Aber davon, dass SDL nicht essentiell für das Funktionieren einer Grafikanwendung ist, weil man in vielen Fällen gerade so gut eine Alternative nutzen kann.
Der Wrapper schrieb:
Aber daraus folgt auch, daß [SFML] eigentlich nur für C++ Code sinnvoll ist, für alle anderen Spiele in anderen Programmiersprachen, also Python, Pascal usw. nimmt man dann doch besser die SDL weil diese eben in C geschrieben ist und die meisten Programmiersprachen eben spielend mit C Code klarkommen.
SFML hat ein C-Binding, also geht auch dieser Vorteil von SDL verloren. Damit bleibt nicht mehr viel übrig, das für SDL spricht.
Übrigens hat SFML auch Bindings für .NET, Ruby, Python und D. Soweit ich weiss, gibt es auch Leute, die ein Java- und Haskell-Binding implementieren.
Der Wrapper schrieb:
Irrlicht und Ogre sind fertige 3d Grafikengines und nicht nur Grafikbibliotheken.
Danke für den Hinweis. Den Begriff "Engine" habe ich noch nie gemocht...
-
Nexus schrieb:
Der Wrapper schrieb:
Klar kann man sie auch gegen eine eigenen Highlevel-Bibliothek austauschen und eigenes crossplattformfähiges Threading, Tastatur- und Joysticksteuerung usw. in seinen Code einbauen, aber warum sollte man sich diese Arbeit machen?
Ich habe nicht von Selbstmachen gesprochen. Aber davon, dass SDL nicht essentiell für das Funktionieren einer Grafikanwendung ist, weil man in vielen Fällen gerade so gut eine Alternative nutzen kann.
Das die SDL essentiell für das Funktionieren einer Grafikanwendung wäre, steht auch nirgends in meinem Posting.
Der Wrapper schrieb:
SFML hat ein C-Binding, also geht auch dieser Vorteil von SDL verloren. Damit bleibt nicht mehr viel übrig, das für SDL spricht.
Übrigens hat SFML auch Bindings für .NET, Ruby, Python und D. Soweit ich weiss, gibt es auch Leute, die ein Java- und Haskell-Binding implementieren.
Dann schau dir mal an, wie bei C++ Bibliotheken Bindings zu anderen Sprachen gemacht werden, also schau es dir low Level an, dann stößt du genau auf das, was ich geschrieben habe.
Deswegen ist die SFML eben kein guter Ersatz für SDL, wenn man z.b. in C oder einer anderen nicht C++ Sprache programmiert.
Der Wrapper schrieb:
Irrlicht und Ogre sind fertige 3d Grafikengines und nicht nur Grafikbibliotheken.
Danke für den Hinweis. Den Begriff "Engine" habe ich noch nie gemocht... :)[/quote]
Das ändert aber nichts daran, daß Engine nunmal der Begriff ist für Engines.
Grafikbibliotheken sind viel abstrakter, das kann alles sein, schon eine Lib, die dir hilft eine JPEG oder PNG Datei zu laden, ist eine Grafikbibliothek.
Sie ist aber dann noch keine Grafikengine.
-
Der Wrapper schrieb:
Das die SDL essentiell für das Funktionieren einer Grafikanwendung wäre, steht auch nirgends in meinem Posting.
Okay, es steht etwas anders. Aber SDL ist aus dem gleichen Grund auch keine wichtige Bibliothek für die Spieleprogrammierung.
"Wichtig" bedeutet für mich "sollte man kennen" bzw. "man hat einen grossen Vorteil davon, wenn man es kennt". Und das ist meiner Meinung nach bei SDL nicht gegeben, zumindest nicht mehr als bei anderen ähnlichen Bibliotheken.
Der Wrapper schrieb:
Dann schau dir mal an, wie bei C++ Bibliotheken Bindings zu anderen Sprachen gemacht werden, also schau es dir low Level an, dann stößt du genau auf das, was ich geschrieben habe.
Du meinst, dass das Ganze durch ein Binding langsamer wird? Und ausgerechnet bei SDL bringst du das Geschwindigkeits-Argument?
-
Also ich hab in meinem ganzen Leben noch nie ein Problem gesehen das in reinem C besser lösbar ist als in C++...
Ach, ich finde fscanf teilweise echt deutlich besser als mit std::ifstream zu arbeiten.
-
Auch wenn ich das nicht nachvollziehen kann, fscanf() gibts auch in C++...
-
Wie macht man eigentlich das hier in C++ ?
printf( Text, "%-10.4s %-10.2f %-10.i" )
Also quasi "formatierte linksbündige Ausgabe".
-
boost::format.
-
Das reine C++ bietet da also quasi nichts vergleichbares an?
Würde dann ja eigentlich ( von Boost mal abgesehen ) die Verwendung von Ansi-C-Code rechtfertigen.
-
Ich seh es so:
Beim Spieleprogrammieren wirst sehr oft ueber Bibliotheken(DirectX,OpenGL,SDL ... ) getrieben. Bibliotheken haben sehr oft ein C-Interface (Binaerkompatiblitaet fuer andere compiler, bindings fuer andere sprachen werden einfacher).
Also hasst Du sowieso scho eine C-like Aufrufsyntax am Hals.Um das in gutes c++ zu überfuehren, muesstest halt viel wrappen. Wrappen bedeutet oft "kopie" -> performance ade.
Hinzu kommt, das grad c++ einen viel alltaegliches abnimmt, das aber oft performancetechnisch sehr naiv umsetzt. Man kann auch in C++ sehr porformant programmieren, klar, aber man muss sich an den einfachsten C++ Dingen da gedanken drueber machen.
In C sind die Dinge offensichtlicher. Man sieht kopien ! man denkt in kopien, weil jede kopie expliziet getaetigt wird. Man macht sich expliziet ueber Ressourcen im Vorfeld Gedanken. In C++ geht vieles im Hintergrund ...Fazit:
Um performant in C++ Spiele Programmieren zu koennen, muss man sich bissi von dem C++ Hallo World Schema trennen, mehrere Dinge hinterfragen, in c++ untypische Richtungen denken. Und die Technik, die geschwindigkeitsnachteile wieder rausholen kann, ohne den Geschriebenen Code wie einen C-Dialekt aussehen zu lassen -> generische Programmierung -> aka Templates ist halt auch eines der Komplexesten und kompliziertesten Themen in C++.Ciao ...
-
RHBaum schrieb:
Also hasst Du sowieso scho eine C-like Aufrufsyntax am Hals.
Deswegen musst du dein Programm aber noch lange nicht in C schreiben.
RHBaum schrieb:
Um das in gutes c++ zu überfuehren, muesstest halt viel wrappen. Wrappen bedeutet oft "kopie" -> performance ade.
Gerade in C++ stimmt das so eben nicht unbedingt. Und die API zu Wrappen ist für ein gutes Design nicht wirklich eine notwendige Vorrausetzung. Manche C-style APIs (z.B. OpenGL) lassen sich rein prinzipiell nur sehr schlecht objektorientiert Wrappen, was aber auch gar kein Problem ist.
RHBaum schrieb:
Hinzu kommt, das grad c++ einen viel alltaegliches abnimmt, das aber oft performancetechnisch sehr naiv umsetzt.
An was denkst du da so z.B.? Mir fällt grad kein Sprachmittel ein das ein vernünftiger C++ Compiler "performancetechnisch naiv" umsetzt...
RHBaum schrieb:
Fazit: [...]
Du sagst also um mit C++ gut programmieren zu können muss man C++ beherrschen. Ja, dem kann ich nur zustimmen, aber das trifft auf jede beliebige andere Sprache auch zu...
-
It0101 schrieb:
Das reine C++ bietet da also quasi nichts vergleichbares an?
Ähm, klar doch, printf() ist natürlich auch Teil von C++...
Allerdings würde man in C++ besser Streams verwenden und dafür gibts z.B. das. Die Streams bieten so sogar die Möglichkeit zwischen dem Vorzeichen und der Zahl aufzufüllen, was mit printf() afaik nicht geht. Und sie sind dabei natürlich typsicher...
-
dot schrieb:
dafür gibts z.B. das.
Aber das ist relativ umständlich zu verwenden. Für jede auszugebende Variable eine Zeile und deutlich mehr geschreibsel...
Also da bevorzuge ich immernoch printf...