对于实时图形编程,C ++的最佳替代方案是什么?

时间:2008-09-16 14:29:51

标签: c++ graphics 3d real-time

C ++只是让我微量管理自己的内存,让我输入太多(hello std::vector<Thingy>::const_iterator it = lotsOfThingys.begin()),并且编译时间长,让我感到烦恼,这太耗费了我的时间。什么是严肃的实时图形编程的唯一最佳选择?垃圾收集是必须的(必要时能够避免使用垃圾),速度必须与C ++竞争。访问C libs的合理故事也是必须的。

(完全披露:我对此有自己的答案,但我很有兴趣看到其他人发现其他C ++是实时图形工作的良好替代品。)

编辑:感谢大家的深思熟虑的回复。鉴于这个问题确实没有“正确”的答案,我不会选择任何特定的答案。除此之外,我只选择我喜欢的语言作为C ++替代方案,这实际上并不公平。

30 个答案:

答案 0 :(得分:18)

D Programming Language怎么办?

评论中要求的一些链接:

Win32 Api

Derelict (Multimedia lib)

答案 1 :(得分:18)

我不会丢弃C ++。事实上,我会考虑将Boost添加到您的C ++库中,这使得该语言更加实用。你的例子将成为:

BOOST_FOREACH( Thingy& t, lostOfThingys ) {
    // do something with 't'
}

Boost拥有大量有助于使C ++成为更好语言的工具。

答案 2 :(得分:17)

C#是一种很好的语言,符合您的要求,它非常适合图形,这要归功于微软努力为它提供了很棒的工具和库,如Visual Studio和XNA。

答案 3 :(得分:15)

我不同意你的前提。仔细而恰当地使用C ++是一种很棒的语言,特别是对于像实时图形这样的领域,速度至关重要。

如果您设计好系统并使用stl容器和智能指针,内存管理就变得简单了。

如果您使用

std::vector::const_iterator it = lotsOfThingys.begin())会变得更短

using namespace std;
typedef vector::const_iterator ThingyConstIter;

通过使用预编译的头文件或使用PIMPL习惯用法将系统分解为合理的自包含模块,可以显着缩短编译时间。

答案 4 :(得分:14)

实时+垃圾收集不太匹配我害怕。

如果垃圾收集器可以随时启动并花费不确定的处理量,那么做任何实时响应都会有点困难......

答案 5 :(得分:13)

也许是一种混合方法。 Python和C ++是一个很好的组合(例如,参见PyGame)。

答案 6 :(得分:13)

我们不要忘记提及新的“自动”用途:

auto it = lotsOfThingys.begin(); // Let the compiler figure it out.
auto it2 = lotsOfFoos.begin();
if (it==it2) // It's still strongly typed; a Thingy iter is not a Foo iter.

答案 7 :(得分:12)

编译到机器代码的Lisp的一些变体几乎与C ++一样快,对于这种编程。 Naughty Dog团队创建了一个名为Game Oriented Assembly Lisp的Lisp版本,用于创建多个AAA标题,包括Jak和Daxter系列。游戏行业中Lisp方法的两个主要障碍是C / C ++开发的根深蒂固的本质(工具和人力资源都投入大量的C / C ++),以及难以找到有才华的工程师。游戏编程领域和Lisp语言。

业内许多编程团队正在转向混合方法,其中实时代码,尤其是图形和物理代码,是用C或C ++编写的,但游戏逻辑是用更高级别的脚本语言完成的,程序员和非程序员都可以访问和编辑。 LuaPython都适用于更高级别的脚本。

答案 8 :(得分:8)

作为3D VR应用程序的开发人员/研究员/教授已有20年了,我建议别无选择(可能除了C)。减少延迟和实现实时交互的唯一方法是优化的编译语言(例如C或C ++),可以访问快速可靠的3D图形库,如OpenGL。虽然我同意必须对所有内容进行编码,但这对于性能和优化也是必不可少的。

答案 9 :(得分:6)

有时,在人迹罕至的地方寻找你可以找到真正的宝石。您可能需要考虑PureBasic(不要让名称误导您)。以下是一些细节:

PureBasic功能

  • 机器代码(程序集)可执行文件(FASM)
    • 内联装配支持
    • 不需要运行时间(不需要DLL等)1个可执行文件
    • 微小的可执行文件(小或小/快于或快于C ++运行时)
    • 您可以编写DLL
    • 多线程支持
    • 完整的OS API支持
  • 多平台支持
    • Windows 95-2003
    • 的Linux
    • Mac-OS X
    • Amiga
  • 2D&amp; 3D游戏开发
    • DirectX
    • OGRE
  • 慷慨的许可
    • 廉价(79欧元或约112美元)
    • 终身许可证(包括所有未来的更新和版本)
    • 所有平台的一个价格
  • 外部图书馆支持
    • 第三方DLL
    • 用户库
  • 在线支持
    • 由其创建者领导的响应式开发团队
    • On-line forum
      • 答案的一个地方(不必全网)
      • 大量的示例代码(在使用IEtool的IE中尝试代码)
      • 快速回答问题
  • 奖金学习(替代学习C ++)
    • API
    • 结构
    • 接口
    • 指针

访问在线论坛,以便更好地了解PureBasic(http://www.purebasic.fr/english/index.php)或主网站:www.purebasic.com

答案 10 :(得分:5)

我完全同意C#的图形编程。它有一个轻微的缺点,即作为一种托管语言,允许垃圾收集器在你的应用程序中自由统治一段时间之后是帧率自杀,但是在程序生命的早期就有一些相对智能的池分配可以避免任何实际问题。

有几个人已经提到了XNA,它非常友好且记录良好,我也想回应这个建议。我个人正在将它用于我的爱好游戏项目,它对我非常好。

不过,XNA不是唯一的选择。 SlimDX也在不断发展,作为以与Managed DirectX类似的方式提供DirectX的精简包装的手段(我相信,微软已经停止使用XNA)。两者都值得研究:http://code.google.com/p/slimdx/

答案 11 :(得分:3)

我想说D编程语言是个不错的选择。您可以通过C库链接到C对象文件和与C ++代码的接口。 D具有垃圾收集,内联汇编,游戏开发人员已经创建了与SDL和OpenGL库的绑定,并且还积极致力于新的游戏开发apis。我喜欢D.太糟糕我的工作不要求它的使用。 :(

答案 12 :(得分:3)

大型AAA游戏没有真正的替代品,特别是在游戏机上。对于较小的标题,C#应该这样做。

答案 13 :(得分:3)

C#在这里是一个很好的答案 - 它有一个公平的垃圾收集(虽然你需要对它进行一些简介 - 改变你处理事情的方式,因为整个内存处理都不在你的手中),它使用简单,有很多例子,并且有很好的文档记录。 在3D部门,它完全支持着色器和效果等等 - 这将是我的选择。

尽管如此,C#并不像C ++那样高效,并且由于开销而变慢,所以如果它是速度和灵活性,可以在你喜欢的书中使用任何技巧(如果你喜欢弄脏你的指针和汇编) - 坚持使用C ++,价格会像你提到的那样编写更多的代码,但是可以完全控制所有内容,包括内存管理。

答案 14 :(得分:2)

如果您的目标是Windows,C ++ / CLI(Microsoft的.NET'托管'C ++方言)是一种有趣的可能性,特别是如果您想利用您的C ++体验。您可以非常无缝地将本机代码(例如,对C样式库的调用)与.NET托管代码混合,并利用.NET GC和库。

关于GC影响“实时”表现的担忧,我认为这些过于夸张。多代.NET GC非常擅长从不花费太多时间来进行收集,除非你处于某种关键的低内存状态。我编写了与电子衍生品交易所交互的.NET代码,其中时间延迟= =很多$$$,我们从未遇到过与GC相关的问题。对于GC而言,几毫秒是很长很长的时间,但对于人类与一个软件进行交互,即使是“实时”游戏也是如此。如果你真的需要真正的“实时”性能(对于医疗设备,过程控制等),那么你无论如何都不能使用Windows - 它不是一个实时操作系统。

答案 15 :(得分:2)

就像詹姆斯(霍普金)一样,对我来说,混合方法是最好的解决方案。 Python和C ++是一个不错的选择,但其他风格如C#/ C ++也适用。全部取决于您的图形上下文。对于游戏,XNA是一个很好的平台(限于win32),在这种情况下,C#/ C ++是最好的解决方案。对于科学可视化,Python / C ++被接受(就像python中的vtk绑定一样)。对于手机游戏,JAVA / C ++可以运行......

答案 16 :(得分:2)

我想,很多游戏引擎都能满足您的需求。例如,如果需要可移植性,则使用SDL或Cairo。许多脚本语言(通常具有简单的语法和垃圾收集)都绑定到这些画布 Flash可能是另一种选择。

我将指出Processing,这是一个开源编程语言和环境,适合想要编程图像,动画和交互的人。

实际上,它是Java的一个薄包装器,使它看起来像一个脚本语言:它有一个(原始)IDE,当你可以输入几行代码并点击Run而不必保存文件。实际上它将代码包装在一个类中并添加一个main()调用,编译它并在窗口中运行它。

很多人用它来进行实时展览(VJ和类似的)。 它具有Java的强大功能和局限性,但是开箱即用了许多不错的包装器(库)来简化对Java2D,OpenGL,SVG等的访问。

不知何故,它已成为简单图形语言的模型:有几个应用程序试图模仿其他语言的处理,如Ruby,Scala或Python。其中最令人印象深刻的是JavaScript实现,使用在Firefox,Safari,Opera等中实现的canvas组件。

答案 17 :(得分:2)

我投票给c ++ 0x。 gcc-4.3 +中已经使用-std = c ++ 0x标志提供了部分支持。

答案 18 :(得分:1)

“C”会不是一个明显的答案?

答案 19 :(得分:1)

Java和LWJGL(OpenGL包装器)对我来说效果很好。如果您正在寻找更多像Orge这样的场景图类型库,请查看我们用于创建Google Earth类型应用程序的jMonkeyEngine(请参阅www.skapeworld.com)。如果您对对象创建很敏感,那么垃圾收集就不是问题了。

答案 20 :(得分:1)

我已经非常成功地将C ++用于引擎,应用程序以Lua编写。 JavaScript也非常实用,现在最新一代基于JIT的JS引擎(tracemonkey,V8等)。

我认为C ++会在一段时间内和我们在一起;甚至Tim Sweeney实际上还没有switched to Haskell(pdf),AFAIK: - )

答案 21 :(得分:0)

不要忽视你的任务中的独立语言。 Ionic Wind Software的Emergence BASIC内置DirectX 9引擎,支持OOP,可以轻松与C库连接。

http://www.ionicwind.com

詹姆斯。

答案 22 :(得分:0)

您可以查看 Ada 。没有垃圾收集器,但这种语言通常用于需要高可靠性的实时系统。这意味着您的3D应用程序的调试时间会减少。

而且,你也可以看看 Haskell ,如果你不知道这种语言看起来很奇怪的功能范例,但它值得花一点时间。 Tim Sweeney(EPIC Inc)正在考虑将这种语言作为C ++的替代品。

答案 23 :(得分:0)

看看Delphi / Pascal对象和一些例子: http://www.delphigamer.comhttp://glscene.cjb.net/

答案 24 :(得分:0)

好问题。 至于'让我输入太多',C ++ 0x似乎解决了大部分问题 如上所述:

auto it = lotsOfThingys.begin())// ...演绎类型,就像* ML一样 VS2010beta已经实现了这一点。

至于内存管理 - 为了提高效率 - 你必须保持良好的内存分配跟踪,有或没有垃圾收集(即,制作内存池,有时重用分配的对象)无论如何,所以最终是否你的环境是垃圾收集与否,更不重要。您还必须显式调用gc(),以防止内存碎片化。 在任何地方都有一致的方法来管理内存。 RAII - 是C ++的杀手级功能 另一件事 - 内存只是一种资源,你仍然需要用GC跟踪其他资源,所以RIAA。

无论如何,C# - 在许多方面都是一个不错的选择,我发现它是一种非常好的语言,尤其是能够在其中编写功能样式代码的能力(可爱的lambda - &gt;语法,map / select'LINQ'语法等),因此编写并行代码的可能性;当你(或你的同事)需要它时,它仍然是一个“标准的花括号”。

答案 25 :(得分:0)

您项目的最佳环境是以最快的方式完成任务的环境。这 - 尤其是3D图形 - 包括库。

根据任务的不同,您可能会遇到一些小的直接黑客入侵。然后你可以使用.NET和slimdx。托管语言编程速度更快,调试更容易。

也许你需要一个非常好的3D引擎?试试Ogre3DIrrlicht。你需要商业级的质量(有人可能认为Ogre3D提供了这个) - 去Cryengine或Unreal。使用Ogre3D和Irrlicht你也可以使用.NET,虽然端口并不总是最新的,并且插件不像C ++版本那样容易包含。对于Cryengine / Unrealengine,我猜你没有真正的选择。

你需要它更便携吗? OpenGL用于救援 - 尽管您可能需要一些包装(例如SDL)。

你还需要一个GUI吗? wxWidgetsQT可能是可能的。

你已经有了工具链吗?您的库需要能够处理文件格式。

你想写一个图书馆吗? C / C ++可能是一个解决方案,因为世界上大多数人都可以使用C / C ++库。也许使用COM?

我还没有提到很多项目/库(XNA,Boost,...),如果你想创建一个不仅显示3D图形的程序,你可能还有其他需求(输入,声音,网络,AI,数据库,GUI,...)

总结一下:编程语言是达到目标的工具。必须在手头的任务背景下看待它。该任务有自己的需求,这些需求可能会为您选择语言(例如,您需要某个库才能获得需要很长时间才能编程的功能,而您只能使用语言X访问该库。)

如果您需要几乎所有:尝试使用C ++ / CLI(可能与C#结合使用,以便更轻松地使用语法)。

答案 26 :(得分:0)

我认为XNA是你最好的选择。在.NET框架的支持下,您只需更改Game Studio中的设置即可为Windows或Xbox 360平台构建。最好的,所有工具都是免费的!

如果您决定使用XNA,您可以轻松开始使用他们的快速入门指南 XNA Quickstart guide

到目前为止,这对我来说是一次有益而有趣的体验,也是对C ++内存管理的一个很好的突破。

答案 27 :(得分:0)

如果您的目标是PC,我认为您可以尝试C#,或在您的C ++应用中嵌入 Lua 并运行“高级”内容的脚本。但是,如果您的目标是控制台,则必须管理您自己的内存!

答案 28 :(得分:0)

  

垃圾收集是必须的(按原样)   能够避免使用它的时候   必要)

您无法暂时禁用垃圾收集器。那么你需要一个确定性的垃圾收集器。但是这样的野兽也会带来性能上的打击。我认为BEA JRockit就是这样的野兽,然后你应该坚持使用Java。

只是评论你的例子; typedef是你的朋友......

typedef std::vector<Thingy> Thingys;
Thingys::const_iterator it = lotsOfThingys.begin()

答案 29 :(得分:0)

Objective-C看起来非常符合您的要求(带有可选GC的最新版本),虽然它太符合我的口味并且类似Smalltalk。