跨平台硬件加速2d C ++应用程序?

时间:2010-08-03 02:51:47

标签: c++ opengl sdl hardware-acceleration

我知道有相当数量的C ++,现在我想探索制作游戏。我想知道在编写仍然跨平台的硬件加速游戏(Windows / OSX / Linux)方面最好的方法是什么。这将是一个2D游戏,但足够密集,以至于CPU渲染器可能不会削减它。

我知道有OpenGL,但我似乎找不到任何关于如何以跨平台方式使用它的教程,它们都集中在一个平台上。

使用SDL也是一种可能,但我担心如果我使用它,游戏可能效果不佳。这一定是真的吗?

最后,我看到像http://www.sfml-dev.org/这样的图书馆可以让我更容易,我应该沿着这条路走下去吗?

再次感谢。

6 个答案:

答案 0 :(得分:7)

那是胡说八道的家伙

OpenGL IS 跨平台。不需要Qt等。只需要调整一小部分:窗口API和输入API,它们是唯一依赖于特定于OS的例程的函数。

您有几种可能性:

  • 滚动你自己。我不推荐这个,因为你不会学到任何有趣的东西(很难)
  • SDL。它有一个标志为硬件加速,所以它与任何其他
  • 一样好
  • SFML。这似乎很好,但不够成熟恕我直言。其他部分(网络,...)是其他库的包装器,所以我真的没有看到优势
  • GLUT。这个是邪恶的。
  • GLFW。这个很棒,真的。我已经使用它多年了。从各个角度来看,它都是完美的。唯一的限制是你只能有一个openGL窗口,但因为它适用于游戏,所以应该没问题。

答案 1 :(得分:3)

  

跨平台硬件加速2d C ++应用程序?

SDL + OpenGL。如果您使用着色器和/或扩展,也可以gleeglew。 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