handdator

Visa fullständig version : Erfarenheter av spel/grafik-motorer



esak
2015-08-03, 16:27
Jag tänkte vi kunde skapa en tråd där vi diskuterar våra erfarenheter av olika spel,- och grafik-motorer.
Det kan vara kul att höra vilka olika motorer vi använder, och dess olika för,- och nackdelar.

Själv har jag tidigare använt libGDX i ett antal år. Det är egentligen mer ett framework (open-source) men innehåller mycket färdigt.
Det bygger på OpenGL och man programmerar i Java. Man kan skapa spel för dem flesta plattformarna (det har ganska mycket mobil-fokus).
Jag tycker dess styrka är att det är lätt att komma in i, och innehåller många exempel som visar dem olika delarna i framework:et.
Dock så tycker jag att fokusen är mest på 2D. Den innehåller även stöd för 3D, men är inte i nivå med andra motorer på marknaden.

Sedan några månader tillbaka har jag börjat använda Urho3D. Det är en komplett spel-motor (open-source) som innehåller mycket out-of-the-box.
Man programmerar i C++ och/eller AngelScript/Lua. Man kan här också skapa spel för dem flesta plattformarna (t o m för Raspberry Pi).
Den har ganska bra dokumentation och många exempel, som gör att det är ganska lätt att komma igång med.
Den har stöd för både 2D och 3D, själv har jag bara använt 3D än så länge. Hittills är jag imponerad av denna motor och kan definitivt rekommendera den.
(Den har inspirerats av Ogre3D och Horde3D, jag antar att om man jobbat med dessa motorer tidigare så kan man nog komma igång ganska snabbt.)

Kristoffer
2015-08-03, 20:29
Woho, aktivitet! :P

Började med GL, men det första jag åstadkom något med (annat än tutorials) var Allegro.

LibGDX använde jag förra året till enknappsspel-utmaningen. :>

Bland fullfjättrade spel-motorer har jag testat Unity och Gamemaker, men inte så djupt och för det mesta har det bara varit genom samarbete på något jam och experiment. Sysslade med att göra banor till Quake2-motorn för länge sedan också i Worldcraft/Hammer, och har studerat Quake2-koden en del, av rent intresse.

På sistone har jag studerat kod till gamla Playstation-spel (det lilla man kommer över) och dokumentation från Sony och Psygnonsis PsyQ-SDK, för att det är intressant. En rolig utmaning (bland många andra) är att man inte har någon z-buffer. Har inte gjort mer än experiment när det kommer till eget kodande på den maskinen, men drömmer om att göra ett helt spel någon vacker dag.

Annars har jag hållt mig till egen C/C++-kod skriven specifikt för varje spel. Med hjälp från bland annat Box2D, Bullet, FMOD, Irrklang, openAL och Lua. Språkmässigt har jag hoppat runt och testat saker här och där, men har inte gjort något nämnvärt utöver C, Lua och Java.

madah
2015-08-11, 21:34
För många år sen försökte jag göra ett 3D-spel med Ogre3D, men jag har sen dess hållit mig till 2D-only.

Då är det främst SDL (http://www.libsdl.org/) och SFML (http://www.sfml-dev.org/). Båda är väl egentligen väldigt simpla och tänkta att användas som bas att bygga sin egna spelmotor ovanpå. SFML kan lite mer och har en mer genomtänkt design, men SDL har (hade?) bättre platformsstöd.

På senare tid så har jag börjat använda OpenGL (ES 2) direkt istället (men fortfarande SDL2 för att skapa fönster och läsa input). Detta var pga SDL2 med SDL_RenderCopy var för långsamt även för ett simpelt 2D-spel på Raspberry Pi.

Gällande skriptspråk så har jag mest använt Squirrel (http://squirrel-lang.org/). Har kollat lite snabbt på Lua, men jag gillade inte syntaxen.

Jordgubben
2015-08-17, 14:52
Jag har mest experimenterat med text-basserade saker de senaste åren. I den svängen finns det (så långt jag letat) tre stora namn att känna till: Twine (http://twinery.org/)Inform/ (http://inform7.com/) och Ren'py (http://renpy.org/). Alla saknar dock något jag behöver. Inform kräver ett tangentbord (det får fullständigt spel på mobila webbläsare), Twine har nästan inget stöd för sofistikerad logik på baksidan och Ren'y kan öht. inte exportera till webb. Eftersom ingen av dem har allt jag behöver bygger jag istället mitt eget verktyg i JavaScript (samt lite HTML/CSS i för framsidan).

Kristoffer
2015-09-26, 22:50
På sistone har jag experimenterat med javascript, webGL och html5. Mycket trevligt att leka med måste jag säga såhär i efterhand. Tidigare använde jag js endast motvilligt för att få menyer och knappar till webbsidor att fungera. Inte samma entusiasm som nu när jag använt språket till spel och grafik. Gav mig även på att skriva en mjukvarurenderare (i js! ^0^), inte det smartaste kanske... men roligt. Jag ska ta och skriva en ordentlig blogg om ämnet senare.

flodihn
2015-10-01, 03:06
Forst o framst vill jag prata om min egen motor som jag byggde ihop med C++ plus olika bibliotek.
Korde MVC for att separera olika komponenter i systemet.

Jag hade Ogre3D for rendering.
SDL for musik, natverk, mus, tagentbord, joystick.
ODE for fysik.

(Sedan hade jag borjat bygga in LUA for logik men anvande det aldrig fullt ut).

Mina erfarenheter:

Ogre3D:
Pros:
Endast renderare, vilket gor det enkelt att anvande som komponent i egenbyggd motor.
Stabilt och fungerar pa alla platforma, stod for opengl och directX genom andra en enkel config-fil.
Kan fa valdigt bra resultat pa grafiken, tror den basta i open source-varlden iallfall.
Cons:
Monolitiskt byggd, vilket inte ar ett stort problem da skadan inte gar bortom renderingen.
Inte speciellt bra prestanda, antaligen p.g.a lite val over-engineerad objeckt-orientering.
Ogre3d anvander singletons validgt mycket vilket hindrar den fran effektiv multi-threading.

SDL:
Pros:
C interface (sa man behover inte mecka med C++).
Modulbaserat, man bygger med libsdlmixer, libsdlnetwork etc sa far man det man behover.
Cons:
Inga egentligen, ifallfall for dom delarna jag anvande SDL for.

ODE:
Pros:
Valdigt litet fysik bibliotek, stoder i stort sett allt man vill, inkluderat compex vs complex mesh kollidering.
Cons:
Kan vara lite meckigt att bygga och konfigurera, men fungerar bra nar man val gjort det.


LUA:
Pros:
Logik i lua ar valdigt skont, nastan lika bra som Python.
Bra stod for C/C++ integration.
Cons:
Har ett skummt state-baserat system som kan vara svart att satta sig in i och forsta nar man bryggar via C/C++.


Har aven anvant Unity mycket pa senare ar. Tycker det ar valdigt bra allround motor, om man vill gora next-gen-grafik sa kanska CryEngine eller liknande ar battre, men for dom flesta spel ar Unity ett bra val.
Tyvarr ar Unity aven helt monolistik, du kan inte byta ut eller av-aktivera olike delar, exempelvis fysik om du inte anvander det. Antar det ar mest ett problem for Unity developers som maste arbeta med kodbasen.

Kristoffer
2015-10-02, 04:48
Du glömde bland Lua Cons: array index börjar vid 1 istället för 0. :P I övrigt gillar jag absolut Lua.

Jordgubben
2015-10-03, 10:18
Cons? Att "arrayer" (eller snarare det man använder istället) indexeras från 1 ett är ju en feature. Att indexera från 0 är en evolutionär rest får C där arrayer egentligen bara är minnespekare och "a[i]" egentligen är "*(a + type_size * i)".
Den stora missen är att a[-1] inte refererar till det sista elementet (även om det bör gå att lösa med metatabeller).

Python och Ruby gör rätt i andra änden, men det blir fel eftersom de indexerar från noll framifrån:(



DeLorean:~ jakob$ python
Python 2.7.10 (default, Jul 14 2015, 19:46:27)
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.39)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> a = [1,2,3]
>>> a[1]
2
>>> a[-1]
3
>>> print "@_@"
@_@
>>> exit()
DeLorean:~ jakob$ irb
irb(main):001:0> a = [1,2,3]
=> [1, 2, 3]
irb(main):002:0> a[1]
=> 2
irb(main):003:0> a[-1]
=> 3
irb(main):004:0> print "Q~Q"
Q~Q=> nil
irb(main):005:0> exit()
DeLorean:~ jakob$ lua
Lua 5.2.3 Copyright (C) 1994-2013 Lua.org, PUC-Rio
> a ={1,2,3}
> print(a[1])
1
> print(a[-1])
nil
> print(">.<")
>.<
> os.exit()
DeLorean:~ jakob$


När ska vi får ett högnivå-språk som gör det här ordentligt?

madah
2015-10-03, 12:23
Att lua använder 1-based-index var en av anledningarna till att jag har hållit mig borta från det språket (och även från Matlab).

En klassiker i detta sammahang:
http://c2.com/cgi/wiki?WhyNumberingShouldStartAtZero

Det finns många exempel på där båda sätten används: t ex månader och dagar är 1-based; men timmar, minuter och sekunder är 0-based.
Det bästa är ju om man blandar också, t ex Java's getMonth() är 0-based, där 0 är januari.