实时图形编程的最佳替代品是C ++?

实时图形编程的最佳替代品是C ++?

What's the best alternative to C++ for real-time graphics programming?

C ++通过使我对自己的内存进行微管理,使我输入太多内容(hello std::vector::const_iterator it = lotsOfThingys.begin())以及使我长时间编译感到无聊,从而浪费了我太多的时间。 认真的实时图形编程的最佳选择是什么? 垃圾收集是必须的(必要时还可以避免使用垃圾收集),并且速度必须与C ++竞争。 访问C库的合理故事也是必须的。

(完全公开:我对此有自己的答案,但是我很想看看其他人发现哪些是实时图形工作的C ++的不错替代品。)

编辑:谢谢大家的体贴答复。 鉴于此问题确实没有"正确"的答案,因此我不会选择任何特定的答案。 另外,我只是选择我碰巧喜欢的语言作为C ++替代语言,这并不公平。


我不会抛弃C ++。实际上,我会考虑将Boost添加到您的C ++库中,这使该语言更加实用。您的示例将变为:

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

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


那么D编程语言呢?

评论中要求提供一些链接:

Win32 Api

废弃(多媒体库)


由于Microsoft努力为C#提供出色的工具和库(例如Visual Studio和XNA),因此C#是一种适合您要求的好语言,并且绝对适合于图形。


我不同意你的前提。如果仔细且正确地使用C ++,则它是一种很棒的语言,特别是对于实时性至关重要的领域,例如实时图形。

如果您对系统进行了精心设计,并使用了stl容器和智能指针,则内存管理将变得容易。

如果使用std::vector::const_iterator it = lotsOfThingys.begin()),它将变得更短


using namespace std;
typedef vector::const_iterator ThingyConstIter;

通过使用预编译的头文件或使用PIMPL惯用法将系统分解为合理的独立模块,可以大大缩短编译时间。


恐怕实时+垃圾回收并不十分匹配。

如果垃圾收集器可以随时启动并花费不确定的处理量,则很难做出任何实时响应保证。


也许是一种混合方法。 Python和C ++很好地结合在一起(例如,参见PyGame)。


让我们不要忘记提及新的"自动"用法:

1
2
3
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.

对于这种编程,编译为机器代码的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功能

  • 机器代码(汇编)可执行文件(FASM)

    • 在线装配支持
    • 不需要运行时(不需要DLL等)1个可执行文件
    • 微小的可执行文件(运行时比C ++小或小/快或快)
    • 您可以编写DLL
    • 多线程支持
    • 全面的OS API支持
  • 多平台支持

    • Windows 95-2003
    • 的Linux
    • Mac OS X
    • 阿米加
  • 2D和3D游戏开发

    • DirectX
    • 食人魔
  • 慷慨的许可

    • 便宜(79欧元或约$ 112)
    • 终身许可证(包括所有将来的更新和版本)
    • 所有平台一价
  • 外部图书馆支持

    • 第三方DLL
    • 用户库
  • 在线支持

    • 由创建者领导的响应式开发团队
    • 在线论坛

      • 一个答案的地方(不必遍历网络)
      • 大量示例代码(使用IEtool在IE中尝试代码)
      • 快速回答问题
  • 奖励学习(替代学习C ++)

    • API
    • 结构体
    • 介面
    • 指针

请访问在线论坛以更好地了解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#在这里是一个很好的答案-它有一个公平的垃圾回收器(尽管您必须对其进行相当多的剖析-由于现在整个内存处理已不复存在,因此可以改变处理方式),使用,有很多示例,并且有据可查。
在3D部门中,它为着色器和效果提供全面支持,因此-这是我的选择。

尽管如此,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和类似展览)。
它具有Java的功能和局限性,但是开箱即用地添加了许多不错的包装器(库),以简化对Java2D,OpenGL,SVG等的访问。

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


我投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和一些示例:
http://www.delphigamer.com或http://glscene.cjb.net/


好问题。
至于"让我打字太多",C ++ 0x似乎可以解决大部分问题
如上所述:

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

至于内存管理(为了提高效率),无论如何无论是否进行垃圾回收(例如,使内存池,有时重新使用分配的对象),您都必须保持良好的内存分配跟踪,以便最终环境是否为垃圾收集与否,事关重大。您还必须显式调用gc(),以防止内存碎片。
在任何地方,采用一致的方法来管理内存都很重要。
RAII-是C ++的杀手级功能
另一件事-内存只是一种资源,您仍然必须使用GC来跟踪其他资源,因此RIAA。

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


Garbage collection is a must (as is
the ability to avoid its use when
necessary)

您不能暂时禁用垃圾收集器。然后,您将需要确定性的垃圾收集器。但是,这样的野兽也确实带来了性能上的损失。我认为BEA JRockit就是这样的野兽,那么您应该坚持使用Java。

仅就您的示例发表评论; typedef是你的朋友...

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

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


尽管Objective-C过于动态且类似于Smalltalk,但我觉得它看起来很符合您的要求(带有可选GC的最新版本)。


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

如果您决定使用XNA,则可以使用其快速入门指南轻松上手。
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#结合使用以简化语法)。


推荐阅读

    linux看剩余内存命令?

    linux看剩余内存命令?,系统,情况,工具,信息,分析,状态,实时,命令,内存,总量,L

    查询linux内存命令?

    查询linux内存命令?,系统,情况,信息,工具,电脑,状态,命令,内存,发行,总量,查

    linux输入命令星号?

    linux输入命令星号?,密码,网络,系统,通讯,概念,情况,数据,术语,网关,表示,如

    linux输入空格的命令?

    linux输入空格的命令?,系统,密码,工作,命令,管理,环境,电脑,终端,空格,指令,l

    linux命令行输入取消?

    linux命令行输入取消?,系统,档案,命令,情况,管理,状态,信息,环境,百度,目录,L

    linux的图形输入命令?

    linux的图形输入命令?,系统,密码,工作,地址,工具,信息,环境,终端,电脑,地方,l

    linux命令行输入汉字?

    linux命令行输入汉字?,系统,软件,发行,管理,终端,命令,模式,编辑,文件,文本,L

    linux终端编译命令?

    linux终端编译命令?,代码,工具,环境,系统,终端,文件,源程序,编译器,语言,指

    linux修改内存命令?

    linux修改内存命令?,系统,信息,标准,工具,数据,在线,内存,命令,分区,大小,Lin

    linux命令输入格式化?

    linux命令输入格式化?,电脑,设备,系统,管理,位置,环境,名称,数据,磁盘,命令,l

    linux历史命令内存?

    linux历史命令内存?,系统,情况,信息,数据,命令,内存,文件,磁盘,历史,内容,Lin

    linux输入上条命令?

    linux输入上条命令?,系统,命令,工作,电脑,数字,时间,管理,工具,第一,网上,lin

    linux输入过的命令?

    linux输入过的命令?,系统,地址,数字,命令,工具,工作,环境,界面,历史,指令,lin

    linux输入命令的地方?

    linux输入命令的地方?,系统,管理,单位,地址,地方,密码,命令,位置,发行,权威,l

    linux实时读日志命令?

    linux实时读日志命令?,系统,信息,实时,工作,对比,管理,时间,命令,日志,平均,L

    linux输入过的命令?

    linux输入过的命令?,系统,地址,数字,命令,工具,工作,环境,界面,历史,指令,lin

    linux怎么看内存命令?

    linux怎么看内存命令?,系统,情况,信息,命令,内存,工具,发行,数据,表示,内容,l

    linux输入上条命令?

    linux输入上条命令?,系统,命令,工作,电脑,数字,时间,管理,工具,第一,网上,lin

    linux输入命令的地方?

    linux输入命令的地方?,系统,管理,单位,地址,地方,密码,命令,位置,发行,权威,l