【问题标题】:C++ OpenGL application as a web service作为 Web 服务的 C++ OpenGL 应用程序
【发布时间】:2010-10-27 09:22:45
【问题描述】:

我们用 C++ 创建了一个 OpenGL 应用程序,它可以可视化一些物理模拟。基本应用程序包含在一个由简单 GUI 使用的 DLL 中。它目前在台式 PC 上运行,但我们有将其变成 Web 服务的想法。

由于模拟需要专用硬件,其想法是用户可以通过他/她的浏览器与我们的应用程序交互作为服务,然后该服务将结果呈现为图像(jpg 或任何适当的),然后可以在浏览器中显示/更新。

我的问题: 如何“轻松”将描述的 C++ 应用程序转换为在某些服务器上运行的 Web 服务,以便我可以通过 Web 访问它?我应该看什么样的技术/API?有没有解决类似问题的现实例子?

【问题讨论】:

  • 图片多久更新一次?
  • 这将是在每次用户交互之后。有点模糊,但典型的场景是:参数更改 -> 一些时间进行模拟 -> 渲染和写入图像 -> 更新浏览器图像。所以在这种情况下没有硬实时需求。
  • 您计划同时支持多少用户?是每个人都可以访问,还是只有已知的一组用户可以访问?是否所有用户都能看到其他用户的操作 - 一个应用程序实例,还是多个?
  • 这将是一个一对一的场景。所以用户之间没有共享视图。没有同时交互。也许我们稍后会尝试在同一台机器上同时运行多个模拟实例,但为了争论,让我们从简单的开始,说一个模拟,一个用户。
  • 你找到解决这个问题的方法了吗?

标签: c++ web-services api opengl


【解决方案1】:

这是可能的,但您将遇到的一个主要困难是尝试从 Web 服务中使用 OpenGL。您需要移植它以进行 100% 的屏幕外渲染并在没有窗口上下文的情况下工作。这将是我的第一步,而且并不总是微不足道的。

此外,从 web 服务正确维护和管理您的 opengl 上下文非常困难,而且所涉及的开销可能非常痛苦。根据渲染的数量和类型,您可能会遇到一些问题。

【讨论】:

    【解决方案2】:

    如果你需要它来很好地扩展,CGI 可能会有点慢和 hacky。

    那里有一些 C++ Web 框架,请参阅 this question

    就 OpenGL 而言,您可能需要使用 Jay 所说的帧缓冲区扩展。 然后,您可以将图像渲染为纹理,并使用 glGetTexImage() 来获取像素数据。从那里只需使用随附的库保存为您想要的任何图像格式。

    【讨论】:

      【解决方案3】:

      我有一个类似的project/question,虽然它不是 Web 服务,但它需要在 Windows 服务中进行 OpenGL 渲染。让它在 Vista 上运行时遇到了很多问题,尽管最终它在 XP 上运行正常的 OpenGL。

      我终于尝试使用Mesa,我将其构建为我的服务的私有 DLL。这是一个很棒的决定,因为我现在可以真正进入 OpenGL 调用,看看哪里出了问题。它在服务下的软件模式下运行良好,虽然没有硬件加速,但运行良好。

      【讨论】:

        【解决方案4】:

        如果您的用户交互需求很简单,我会考虑 CGI。应该很容易理解。

        就获取 OpenGL 程序的输出而言,我会看一下帧缓冲区扩展。这应该使您可以轻松地渲染到内存中,然后可以将其输入到 JPEG 压缩器中。

        【讨论】:

          【解决方案5】:

          我猜你已经可以访问一些网络服务器,例如阿帕奇或类似的。在这种情况下,您可以尝试CppServ

          您只需要配置您的网络服务器,以便它可以与 CppServ 通信。然后,我建议您开发一个 servlet(查看网站上的文档),该 servlet 又与您现有的 dll 进行通信。由于 dll 了解有关 OpenGL 的所有信息,因此创建 jpeg 图像等应该没有问题。

          【讨论】:

            【解决方案6】:

            使用诸如 Flex 之类的东西来创建一个支持 Web 的“控制界面”,以及将 opengl 渲染作为视频流式传输的服务器后端怎么样?基本上,您通过 Flex 应用程序重定向键盘/鼠标输入,并使用它使用标准电影组件显示“实时”3D 活动。

            当然,魔鬼在细节中......

            【讨论】:

              【解决方案7】:

              你可以尝试使用google的O3D API,不要做任何服务,这样会简单得多。

              【讨论】:

              • 如果我错了,请纠正我,但问题是一切仍将在客户端本地运行,对吗?这是一个“问题”,因为模拟非常繁重,我们希望在几乎任何带有浏览器的系统上的任何用户(甚至可能是移动用户)都可以使用它们。
              • 您确定能够以经济高效的方式运行如此繁重的服务吗?可从浏览器访问的客户端解决方案对您来说会便宜得多。
              【解决方案8】:

              这个答案可能听起来非常基础和初级,你试过这种方法吗

              1. 将矢量数据从服务器发送到客户端,反之亦然(只是坐标等)

              2. 在客户端渲染。

              这意味着服务器只是在做计算,数字是来回传递的。

              我同意这不是一种尝试对每个对象/模型和纹理进行矢量化的简单方法,但速度非常快,因为不是通过繁重的图形图像,而是只发送矢量数据。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2013-11-19
                相关资源
                最近更新 更多