我知道有相当数量的C ++,现在我想探索制作游戏。我想知道在编写仍然跨平台的硬件加速游戏(Windows / OSX / Linux)方面最好的方法是什么。这将是一个2D游戏,但足够密集,以至于CPU渲染器可能不会削减它。
我知道有OpenGL,但我似乎找不到任何关于如何以跨平台方式使用它的教程,它们都集中在一个平台上。
使用SDL也是一种可能,但我担心如果我使用它,游戏可能效果不佳。这一定是真的吗?
最后,我看到像http://www.sfml-dev.org/这样的图书馆可以让我更容易,我应该沿着这条路走下去吗?
再次感谢。
答案 0 :(得分:7)
那是胡说八道的家伙
OpenGL IS 跨平台。不需要Qt等。只需要调整一小部分:窗口API和输入API,它们是唯一依赖于特定于OS的例程的函数。
您有几种可能性:
答案 1 :(得分:3)
跨平台硬件加速2d C ++应用程序?
SDL + OpenGL。如果您使用着色器和/或扩展,也可以glee或glew。 Glee更容易使用,但看起来它不支持3.0之后的OpenGL版本。 您也可能需要SDL_image才能加载图片。
我知道有OpenGL,但我似乎找不到任何关于如何以跨平台方式使用它的教程,它们都集中在一个平台上。
SDL_Init(SDL_INIT_VIDEO);
SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, 0);//disable vsync
if (SDL_SetVideoMode(scrWidth, scrHeight, 32, SDL_OPENGL) == 0){
fprintf(stderr, "couldn't set mode %dx%d!\n", 640, 480);
SDL_Quit();
return -1;
}
glewInit();//if you use glew, shaders, extensions.
while(gameIsRunning()){//game loop
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
//OpenGL rendering here
glFlush();
SDL_GL_SwapBuffers();
}
SDL_Quit();
有关详细信息,请参阅sdl文档。
使用SDL也是一种可能,但我担心如果我使用它,游戏可能效果不佳。这一定是真的吗?
禁用vsync后,每秒可以获得几百到几千帧。精确的性能取决于您的硬件和场景复杂性 - 我有300 fps的简单3D地下城爬虫报告,使用“RAW”opengl没有显示列表/顶点缓冲对象。此外,如果您使用固定帧率或定时器驱动的引擎,您每秒的帧数将不会超出您的要求。
SDL用于将Unreal 2004移植到Linux。它也用于Doom 3 / Quake 4 linux端口。所以经过全面测试和熟知。
有关详细信息,请参阅this list。
答案 2 :(得分:2)
如果您想以跨平台方式使用OpenGL,可以使用QGLWidget将其嵌入到Qt应用程序中。
答案 3 :(得分:1)
还有wxWidgets,其中有OpenGl support。
答案 4 :(得分:1)
对我来说,问题不是要知道你是否应该使用图书馆。这是你应该使用的库。如果您想编写游戏,请找到能够解决大多数可移植性问题的库。它会让你专注于最重要的事情:游戏本身。其他人提供了更多我可以给你的图书馆建议。
我认为在你开始你的项目之前过度担心性能是错误的。处理性能问题,例如您在开发过程中遇到的任何其他问题。设计程序以隔离与其余程序逻辑分离的层中的库。如果需要,可以更轻松地切换实施。这甚至可以实验不同的实现。
即:
// separate files
class LowLevelGraphicStuff {
// abstract
};
class LowLevelGraphicStuff_SFML : public LowLevelGraphicsStuff {
// actual SFML implementation
};
class LowLevelGraphicsStuff_OGL : public LowLevelGraphicsStuff {
// actual OpenGL implementation
};
// main
// Run the game with the SFML implementation.
gameLoop(new LowLevelGraphicsStuff_SFML());
// Run the game with the OpenGL implementation.
gameLoop(new LowLevelGraphicsStuff_OGL());
答案 5 :(得分:0)
是的,请使用SFML。 SDL本身并不是硬件加速。
OpenGL确实是可移植的,但它确实具有用于创建OpenGL上下文的特定于平台的方法。 SFML solves that