5

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

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

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

最后,我看到了像http://www.sfml-dev.org/这样的库,据说它更容易,我应该走那条路吗?

再次感谢。

4

6 回答 6

7

这是胡说八道的家伙

OpenGL跨平台的。不需要Qt之类的。只有少数部分必须修改:窗口 API 和输入 API,它们是唯一依赖于操作系统特定例程的函数。

你有几种可能性:

  • 滚动你自己的。我不推荐这个,因为你不会学到任何有趣的东西(几乎)
  • SDL。它有一个可以硬件加速的标志,所以它和其他任何东西一样好
  • SFML。这看起来不错,但还不够成熟,恕我直言。其他部分(网络,...)是其他库的包装器,所以我没有真正看到优势
  • 过剩。这个是邪恶的。
  • GLFW。这个很棒,真的。我已经使用它多年了。从各个角度来看都是完美的。唯一的限制是您只能有一个 openGL 窗口,但由于它是用于游戏的,所以应该没问题。
于 2010-08-03T06:36:40.347 回答
3

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

SDL + OpenGL。如果您使用着色器和/或扩展,也许还会高兴高兴。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 端口。因此,它经过了彻底的测试并且众所周知。

有关更多信息,请参阅此列表

于 2010-08-03T14:02:29.963 回答
2

如果您希望以跨平台方式使用 OpenGL,您可以使用 QGLWidget 将其嵌入到 Qt 应用程序中。

于 2010-08-03T03:02:03.440 回答
1

还有wxWidgets,它支持 OpenGL

于 2010-08-03T06:14:57.157 回答
1

对我来说,问题不在于你是否应该使用库。这是您应该使用的库。如果您想编写游戏,请找到可以为您解决大多数可移植性问题的库。它会让你专注于最重要的事情:游戏本身。其他人给出了我本可以给你的更多图书馆建议。

我认为在您开始项目之前过度担心性能是错误的。像您在开发过程中遇到的任何其他问题一样处理性能问题。设计您的程序以将库与程序逻辑的其余部分隔离在一个层中。如果需要,切换实现会更容易。这甚至允许试验不同的实现。

IE:

// 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());
于 2010-08-03T13:39:30.253 回答
0

是的,选择 SFML。SDL 本身并不是硬件加速的。

OpenGL 确实是可移植的,但它确实具有用于创建 OpenGL 上下文的特定于平台的方法。SFML 解决了这个问题

于 2010-08-03T13:02:21.900 回答