
What's the best alternative to C++ for real-time graphics programming?
C ++通过使我对自己的内存进行微管理,使我输入太多内容(hello (完全公开:我对此有自己的答案,但是我很想看看其他人发现哪些是实时图形工作的C ++的不错替代品。) 编辑:谢谢大家的体贴答复。 鉴于此问题确实没有"正确"的答案,因此我不会选择任何特定的答案。 另外,我只是选择我碰巧喜欢的语言作为C ++替代语言,这并不公平。 我不会抛弃C ++。实际上,我会考虑将Boost添加到您的C ++库中,这使该语言更加实用。您的示例将变为:
Boost有大量工具可帮助使C ++成为更好的语言。 那么D编程语言呢? 评论中要求提供一些链接: Win32 Api 废弃(多媒体库) 由于Microsoft努力为C#提供出色的工具和库(例如Visual Studio和XNA),因此C#是一种适合您要求的好语言,并且绝对适合于图形。 我不同意你的前提。如果仔细且正确地使用C ++,则它是一种很棒的语言,特别是对于实时性至关重要的领域,例如实时图形。 如果您对系统进行了精心设计,并使用了stl容器和智能指针,则内存管理将变得容易。
如果使用
通过使用预编译的头文件或使用PIMPL惯用法将系统分解为合理的独立模块,可以大大缩短编译时间。 恐怕实时+垃圾回收并不十分匹配。 如果垃圾收集器可以随时启动并花费不确定的处理量,则很难做出任何实时响应保证。 也许是一种混合方法。 Python和C ++很好地结合在一起(例如,参见PyGame)。 让我们不要忘记提及新的"自动"用法:
对于这种编程,编译为机器代码的Lisp的某些变体可能几乎与C ++一样快。顽皮狗团队创建了Lisp版本,称为Game Oriented Assembly Lisp,他们用来创建多个AAA称号,包括Jak和Daxter系列。在游戏行业中,Lisp方法的两个主要障碍将是C / C ++开发的根深蒂固的性质(工具和人力资产都大量投资于C / C ++),以及难以找到优秀的工程师成为C / C ++的明星游戏编程领域和Lisp语言。 行业中的许多编程团队正在转向一种混合方法,其中实时代码(尤其是图形和物理代码)是用C或C ++编写的,但是游戏逻辑是通过高级脚本语言完成的,该语言可通过以下方式访问:可由程序员和非程序员编辑。 Lua和Python都流行于高级脚本。 作为20世纪3D VR应用程序的开发人员/研究人员/教授,我建议别无选择(可能是C)。减少延迟并实现实时交互的唯一方法是使用可访问快速可靠的3D图形库(例如OpenGL)的优化的编译语言(例如C或C ++)。虽然我同意必须对所有代码进行编码很麻烦,但这对于性能和优化也是必不可少的。 有时,在人迹罕至的地方外寻找真正的宝石。您可能要考虑使用PureBasic(不要让名称误导您)。以下是一些详细信息: PureBasic功能
请访问在线论坛以更好地了解PureBasic(http://www.purebasic.fr/english/index.php)或访问主要站点:www.purebasic.com 我完全同意为图形编程使用C#的说法。它有一个缺点,那就是它是一种托管语言,并且允许垃圾收集器在您的应用程序上自由支配,过了一会儿就会自杀,但是在程序生命周期的早期就进行了一些相对智能的池分配,可以避免任何实际的问题。 好几个人已经提到过XNA,它非常友好且文档齐全,我也想回应该建议。我个人在业余爱好游戏项目中使用了它,它对我很好。 XNA不是唯一的选择。还有SlimDX正在不断开发中,它以类似于Managed DirectX的方式提供DirectX的精简包装的一种方法(我相信Microsoft已停止使用它而支持XNA)。两者都值得研究:http://code.google.com/p/slimdx/ 大型AAA游戏没有真正的替代品,尤其是在主机上。对于较小的标题,C#应该这样做。
C#在这里是一个很好的答案-它有一个公平的垃圾回收器(尽管您必须对其进行相当多的剖析-由于现在整个内存处理已不复存在,因此可以改变处理方式),使用,有很多示例,并且有据可查。 尽管如此,C#的效率却不如C ++,并且由于开销而变慢,因此,如果速度和灵活性可以使用您喜欢的书中的任何技巧(如果您想弄脏手,可以使用指针和汇编)-坚持正如您所提到的,C ++和价格将以更多的方式编写代码,但对包括内存管理在内的所有内容都具有完全控制权。 我会说D编程语言是一个不错的选择。您可以链接到C对象文件,并通过C库与C ++代码进行接口。 D具有垃圾回收,内联汇编功能,并且游戏开发人员已创建了与SDL和OpenGL库的绑定,并且还积极开发新的游戏开发api。我爱D。很糟糕,我的工作不要求使用它。 :( 像James(霍普金)一样,对我来说,混合方法是最好的解决方案。 Python和C ++是一个不错的选择,但其他样式(如C#/ C ++)也可以使用。一切都取决于您的图形上下文。对于游戏而言,XNA是一个很好的平台(仅限于win32),在这种情况下,C#/ C ++是最佳解决方案。为了科学地可视化,可以接受Python / C ++(例如python中的vtk绑定)。对于手机游戏,JAVA / C ++可以运行... 如果您的目标是Windows,则C ++ / CLI(Microsoft的.NET"托管"的C ++方言)是一种有趣的选择,特别是如果您想利用自己的C ++经验。您可以将本机代码(例如,对C样式库的调用)与.NET托管代码无缝地混合在一起,并利用.NET GC和库。 至于对GC影响"实时"性能的担忧,我认为这些倾向过分夸大了。多代.NET GC非常擅长于不花费大量时间进行收集,除非您处于某种关键的低内存情况下。我编写了与电子衍生产品交易所进行交互的.NET代码,其中时间延迟==很多,而且我们从未遇到过与GC有关的问题。对于GC来说,几毫秒是很长很长的时间,但是对于与某软件(甚至是"实时"游戏)进行交互的人来说,并不是很长时间。如果您确实需要真正的"实时"性能(用于医疗设备,过程控制等),则无论如何都不能使用Windows,它不是实时操作系统。
我想很多游戏引擎都可以满足您的需求。例如,如果需要可移植性,则使用SDL或Cairo。许多脚本语言(通常带有简单的语法和垃圾回收功能)都已绑定到这些画布。 我只是指出处理,这是一种开放源代码编程语言和环境,适用于希望对图像,动画和交互进行编程的人员。 实际上,它是Java的精简包装,使其看起来像脚本语言:当您可以键入几行代码并单击Run(甚至无需保存文件)时,它就有一个(原始)IDE。实际上,它将代码包装在一个类周围,并添加了main()调用,将其编译并在窗口中运行。
很多人将其用于实时展览(VJ和类似展览)。
不知何故,它已成为简单图形语言的模型:有多个应用程序试图模仿其他语言(例如Ruby,Scala或Python)的处理。最令人印象深刻的是JavaScript实现,它使用在Firefox,Safari,Opera等中实现的 我投c ++ 0x。使用-std = c ++ 0x标志在gcc-4.3 +中已经提供了部分支持。 Java和LWJGL(OpenGL包装器)对我来说效果很好。如果您正在寻找更多类似Orge的场景图形类型库,请查看我们用来创建Google Earth类型应用程序的jMonkeyEngine(请参见www.skapeworld.com)。如果您对对象创建很敏感,那么垃圾回收就不是问题。 我已经非常成功地将C ++用于引擎,其应用程序以Lua编写为首。 JavaScript也非常实用,现在出现了最新一代的基于JIT的JS引擎(tracemonkey,V8等)。 我认为C ++将会在我们这里待一段时间。甚至Tim Sweeney尚未真正转换到Haskell(pdf),AFAIK :-) " C"答案是否太明显? 您可以看一下Ada。没有垃圾收集器,但是这种语言通常用于需要高可靠性的实时系统。这意味着更少的3D应用调试时间。 而且,您也可以看一下Haskell,如果您不知道该功能的范式,这门语言对您来说很奇怪,但这值得您花点时间。 Tim Sweeney(EPIC Inc)正在考虑将该语言作为C ++的替代方案。
看看Delphi / Pascal Object和一些示例:
好问题。
auto it = lotsOfThingys.begin())// ...推导类型,就像在* ML中一样
至于内存管理(为了提高效率),无论如何无论是否进行垃圾回收(例如,使内存池,有时重新使用分配的对象),您都必须保持良好的内存分配跟踪,以便最终环境是否为垃圾收集与否,事关重大。您还必须显式调用gc(),以防止内存碎片。 无论如何,C#-在很多方面都是不错的选择,我发现它是一种非常不错的语言,尤其是能够在其中编写功能样式的代码(可爱的lambda->语法,map / select'LINQ'语法等),因此编写并行代码的可能性;当您(或您的同事)需要它时,它仍然是"标准花括号"。
您不能暂时禁用垃圾收集器。然后,您将需要确定性的垃圾收集器。但是,这样的野兽也确实带来了性能上的损失。我认为BEA JRockit就是这样的野兽,那么您应该坚持使用Java。 仅就您的示例发表评论; typedef是你的朋友...
如果您的目标是一台PC,我想您可以尝试C#,或将Lua嵌入C ++应用程序中并为"高级"内容运行脚本。但是,如果目标是控制台,则必须管理自己的内存! 尽管Objective-C过于动态且类似于Smalltalk,但我觉得它看起来很符合您的要求(带有可选GC的最新版本)。 我认为XNA是您最好的选择。在.NET框架的支持下,您只需更改Game Studio中的设置即可为Windows或Xbox 360平台构建。最好的是,所有工具都是免费的!
如果您决定使用XNA,则可以使用其快速入门指南轻松上手。 到目前为止,对我来说,这是一个令人愉快的经历,并且与C ++的内存管理有了很大的突破。 在您的任务中不要忽视独立的语言。 Ionic Wind Software的Emergence BASIC具有内置的DirectX 9引擎,支持OOP,并且可以轻松地与C库接口。 http://www.ionicwind.com 詹姆士。 对于您的项目而言,最好的环境是您以最快的方式完成任务的环境。这-尤其是对于3D图形-包括库。 根据任务的不同,您可能会遇到一些小的DirectX黑客攻击。然后,您可以使用.NET和slimdx。托管语言倾向于更快地编程,更容易调试。 也许您需要一个真正好的3D引擎?尝试使用Ogre3D或Irrlicht。您需要商业级的质量(有人可能会说Ogre3D提供了这种质量)-选择Cryengine或Unreal。使用Ogre3D和Irrlicht,您也可以使用.NET,尽管端口并不总是最新的,并且插件不像C ++版本那样容易包含。我猜对于Cryengine / Unrealengine,您将没有真正的选择。 您需要更便携吗?使用OpenGL进行救援-尽管您可能需要一些包装器(例如SDL)。 您还需要GUI吗? wxWidgets,QT可能是一种可能性。 您已经有一个工具链?您的库需要能够处理文件格式。 您要编写一个库吗? C / C ++可能是一种解决方案,因为世界上大多数地区都可以使用C / C ++库。也许配合使用COM? 还有很多我没有提到的项目/库(XNA,Boost等),如果您想创建一个不仅显示3D图形的程序,还可能有其他需求(输入,声音) ,网络,AI,数据库,GUI等) 概括起来:编程语言是达到目标的工具。必须在手头的任务中看到它。任务有其自身的需求,这些需求可能会为您选择语言(例如,您需要某个库才能获得需要花费很长时间进行编程的功能,并且只能使用语言X来访问该库)。 如果您需要一劳永逸:请尝试C ++ / CLI(可能与C#结合使用以简化语法)。 |