How are components in larger game engines implemented?

StackMasher

Well-Known Member
OP
Member
Joined
Nov 29, 2016
Messages
136
Trophies
0
Age
20
XP
370
Country
A lot of games allow you to choose multiple renderers, input libraries etc but how do they do this? I'm thinking they would have to have some sort of a standardized interface for each component, but if-else statements would probably add a lot of overhead and all the components are statically linked with the main game
 

catlover007

Developer
Developer
Joined
Oct 23, 2015
Messages
721
Trophies
1
XP
3,925
Country
Germany
In most cases(I know of), interfaces with static or dynamic dispatch are used.
To illustrate this, here is bit of Java/C++ mix like pseudo code

Solution #1, using dynamic dispatch:
Code:
interface Renderer {
RenderThis()
RenderThat()
}

class RendererDirectX implements Renderer{
...
}

class RendererOpenGL implements Renderer{
...
}

if(options.renderer == "directx"){
renderer = new RendererDirectX();
}else{
renderer = new RendererOpenGL();
}

Solution #2, using static dispatch(which is more performant, but the destination needs to known at compile time):
Code:
class Renderer {
#ifdef PLATFORM_WII
Renderer rendererImpl = new RendererWii();
#else
Renderer rendererImpl = new RendererOpenGL();
#endif

RenderThis() {
rendererImpl.renderThis();
}

RenderThat() {
rendererImpl.renderThat();
}
}
If you are more familiar with C++, a interface is basically a class containing only pure virtual methods
 
  • Like
Reactions: StackMasher

StackMasher

Well-Known Member
OP
Member
Joined
Nov 29, 2016
Messages
136
Trophies
0
Age
20
XP
370
Country
In most cases(I know of), interfaces with static or dynamic dispatch are used.
To illustrate this, here is bit of Java/C++ mix like pseudo code

Solution #1, using dynamic dispatch:
Code:
interface Renderer {
RenderThis()
RenderThat()
}

class RendererDirectX implements Renderer{
...
}

class RendererOpenGL implements Renderer{
...
}

if(options.renderer == "directx"){
renderer = new RendererDirectX();
}else{
renderer = new RendererOpenGL();
}

Solution #2, using static dispatch(which is more performant, but the destination needs to known at compile time):
Code:
class Renderer {
#ifdef PLATFORM_WII
Renderer rendererImpl = new RendererWii();
#else
Renderer rendererImpl = new RendererOpenGL();
#endif

RenderThis() {
rendererImpl.renderThis();
}

RenderThat() {
rendererImpl.renderThat();
}
}
If you are more familiar with C++, a interface is basically a class containing only pure virtual methods
awesome thanks
 

Site & Scene News

Popular threads in this forum

General chit-chat
Help Users
    Xdqwerty @ Xdqwerty: *yawn*