1

编辑: 是否有任何预先构建的库可以为我执行此操作,使用 SDL 或在 Window、Linux、Mac、iOS 和 Android 上运行?

目前,我不确定我改变上下文的方式是否是一个很好的设计,我还没有完全完成它。我真的很担心浪费我的时间。我正在使用 SDL 进行窗口管理和事件处理。

我目前在类中包装 SDL(特别是 SDL 2)来管理它。这些是我的课程以及他们的工作:

  • Window - 描述一个窗口
  • WindowContext - 描述 Window 的上下文(抽象类)
  • WindowDelegate - 用于确定上下文何时更改、窗口何时打开/关闭等。
  • WindowEventListener - 监听来自 Window 的事件(不确定我是否应该坚持轮询而不是回调函数)

无论如何,这是它如何工作的示例:

OglWindowContext* context = new OglWindowContext;
// change context's settings
Window window(ipoint2(), idimension2(640, 480), "Test Window", 
              Window::Resizeable, context, &windowListener, 
              NULL /* window delegate */);

while(window.isOpen())
{
    window.processEvents(); // calls back events to the WindowEventListener
    window.draw(); // calls the context's draw method
}

注意:ipoint2 是一个二维点

我可以通过调用中途更改上下文:

window.setContext(new Dx9Context); // or whatever context you would like

有没有更简单的方法,或者我应该说更有效的方法来做到这一点?

4

1 回答 1

1

目前,在 Windows 的任何其他平台上,在渲染器之间切换没有多大意义,因此您对 windows、linux、mac、ios 和 android 支持的请求听起来很奇怪。也许您正在寻找一个总体上可以帮助您实现可移植性的库?

要实现一个渲染器或另一个渲染器(opengl/d3d)的运行,或者实现一般的可移植性,您需要实现某种可移植性层。

基本上,您可以从编写两个程序开始:一个在 OpenGL 中绘制旋转立方体,另一个完全独立的使用 D3D 执行相同的操作。接下来,编写结合这些的第三个程序,方法是:

  • 在一个通用接口后面抽象出与两个应用程序不同的东西
    • 例如但不限于,一旦你进入各种平台:
      • 应用控制回路
      • 渲染器(即图形输出)
      • 文件输入/输出
      • 用户输入
      • 声音的
      • 系统服务(线程等)
  • 在所有目标平台上实现通用接口
  • 仅通过抽象接口实现应用程序功能

Windows 上的 D3D 和 OpenGL 实际上可以被认为是独立的平台,但您可以在应用程序启动期间选择一个或另一个 - 选择可能会影响渲染器以及应用程序控制循环。

在运行时切换也是完全可能的,但可能太麻烦了,不值得。

您可能会注意到 SDL 实际上做了很多上述工作。

于 2012-12-17T10:25:25.367 回答