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