首页 / 知识

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

2023-04-15 23:15:00

实时图形编程的最佳替代品是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#结合使用以简化语法)。


图形编程实时内存输入

最新内容

相关内容

猜你喜欢