33

C++ 让我对自己的内存进行微观管理,让我输入太多(你好std::vector<Thingy>::const_iterator it = lotsOfThingys.begin()),并让我长时间编译感到厌烦,这让我浪费了太多时间。对于严肃的实时图形编程来说,最好的选择是什么?垃圾收集是必须的(必要时避免使用它的能力也是如此),而且速度必须与 C++ 相媲美。访问 C 库的合理故事也是必须的。

(完全披露:我对此有自己的答案,但我很想看看其他人发现什么可以替代 C++ 用于实时图形工作。)

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

4

30 回答 30

19

D 编程语言呢?

评论中要求的一些链接:

Win32 接口

遗弃(多媒体库)

于 2008-09-16T14:34:27.360 回答
18

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

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

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

于 2008-09-16T19:08:58.497 回答
17

C# 是一种很好的语言,可以满足您的要求,而且它绝对适合图形,这要归功于 Microsoft 为它提供的出色工具和库(如 Visual Studio 和 XNA)的努力。

于 2008-09-16T14:32:42.780 回答
15

Real-time + garbage collection don't match very well I'm afraid.

It's a bit hard to make any real-time response guarantees if a garbage collector can kick in at any time and spend an undefined amount of processing...

于 2008-09-16T14:56:24.140 回答
15

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

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

std::vector::const_iterator it = lotsOfThingys.begin())如果你使用会变得更短

using namespace std;
typedef vector::const_iterator ThingyConstIter;

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

于 2008-09-16T18:38:29.943 回答
13

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

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

于 2008-09-16T17:01:58.253 回答
13

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

于 2008-09-16T15:15:31.350 回答
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.
于 2008-09-17T09:35:58.757 回答
8

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

于 2009-05-13T10:51:51.970 回答
6

Sometimes, looking outside the beaten path you can find a real gem. You might want to consider PureBasic (Don't let the name mislead you). Here's some details:

PureBasic Features

  • Machine Code (Assembly) executables (FASM)
    • In-line Assembly support
    • No run-times needed (no DLLs needed,etc.) 1 executable file
    • Tiny executables (as small or smaller/as fast or faster than C++ w/out the runtime)
    • You can write DLLs
    • Multi-thread support
    • Full OS API support
  • Multi-platform support
    • Windows 95-2003
    • Linux
    • Mac-OS X
    • Amiga
  • 2D & 3D game development
    • DirectX
    • OGRE
  • Generous Licensing
    • Inexpensive (79 Euros or about $112)
    • Life-time license (all future updates & versions included)
    • One price for all platforms
  • External Library support
    • 3rd party DLLs
    • User Libraries
  • On-line Support
    • Responsive development team led by it's creator
    • On-line forum
      • One place for answers (don’t have to go all over the net)
      • Huge amount of sample code (try code out while in IE with IEtool)
      • Fast replies to questions
  • Bonus learning (alternative to learning C++)
    • API
    • Structures
    • Interfaces
    • Pointers

Visit the online forum to get a better idea of PureBasic (http://www.purebasic.fr/english/index.php) or the main site: www.purebasic.com

于 2008-09-16T16:00:23.690 回答
5

我完全同意 C# 用于图形编程的说法。它具有作为托管语言的轻微缺点,并且允许垃圾收集器自由支配您的应用程序是一段时间后的帧率自杀,但是在程序生命的早期进行一些相对智能的池分配,可以避免任何实际问题。

有几个人已经提到了 XNA,它非常友好且有据可查,我也想附和这个建议。我个人将它用于我的爱好游戏项目,它对我很好。

不过,XNA 并不是唯一的选择。还有 SlimDX,它正在不断开发中,作为一种提供 DirectX 精简包装的方法,其方式与 Managed DirectX 类似(我相信,微软为了支持 XNA 而停止了它)。两者都值得研究:http ://code.google.com/p/slimdx/

于 2008-09-16T19:31:24.060 回答
3

There are no true alternatives for big AAA titles, especially on the consoles. For smaller titles C# should do.

于 2008-09-16T14:56:14.627 回答
3

我会说 D 编程语言是一个不错的选择。您可以链接到 C 目标文件并通过 C 库与 C++ 代码交互。D 有垃圾收集、内联汇编,游戏开发者已经创建了与 SDL 和 OpenGL 库的绑定,并且还在积极开发新的游戏开发 API。我爱 D。太糟糕了,我的工作不需要它的使用。:(

于 2008-09-16T19:06:19.267 回答
3

C# 在这里是一个很好的答案——它有一个公平的垃圾收集(虽然你必须对它进行相当多的分析——因为现在整个内存处理已经不在你的掌控之中了,所以改变你处理事情的方式),它很简单使用,有很多例子并且有据可查。在 3D 部门,它为着色器和效果等提供全面支持——这将是我的选择。

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

于 2008-09-16T15:33:48.340 回答
2

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

至于对 GC 影响“实时”性能的担忧,我认为这些往往被夸大了。多代 .NET GC 非常擅长从不花太多时间进行收集,除非您处于某种严重的低内存情况。我编写与电子衍生品交易所交互的 .NET 代码,其中时间延迟 == 很多 $$$,而且我们从未遇到过与 GC 相关的问题。几毫秒对于 GC 来说是很长很长的时间,但对于人类与软件交互,甚至是“实时”游戏来说,这不是。如果您真的需要真正的“实时”性能(用于医疗设备、过程控制等),那么无论如何您都不能使用 Windows——它只是不是实时操作系统。

于 2008-09-16T19:44:51.920 回答
2

像 James (hopkin) 一样,对我来说,混合方法是最好的解决方案。Python 和 C++ 是一个不错的选择,但 C#/C++ 等其他风格也可以。一切都取决于您的图形上下文。对于游戏来说,XNA 是一个很好的平台(仅限 win32),在这种情况下 C#/C++ 是最好的解决方案。对于科学可视化,接受 Python/C++(如 vtk 在 python 中的绑定)。对于手机游戏 JAVA/C++ 可以工作...

于 2008-09-16T15:38:53.883 回答
2

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

我只想指出Processing,它是一种开源编程语言和环境,适用于想要对图像、动画和交互进行编程的人们。

实际上,它是对 Java 的薄包装,使它看起来像一种脚本语言:它有一个(原始的)IDE,您可以键入几行代码并点击运行,甚至无需保存文件。实际上它将代码包装在一个类周围并添加一个 main() 调用,编译它并在窗口中运行它。

很多人将它用于实时展览(VJ 等)。它具有 Java 的强大功能和局限性,但添加了许多开箱即用的漂亮包装器(库)来简化对 Java2D、OpenGL、SVG 等的访问。

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

于 2008-09-24T05:37:53.750 回答
2

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

于 2010-01-03T02:33:31.673 回答
1

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

于 2010-11-24T10:46:42.397 回答
1

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

我认为 C++ 还会伴随我们一段时间。甚至 Tim Sweeney 还没有真正切换到 Haskell (pdf),AFAIK :-)

于 2009-10-05T11:03:16.867 回答
1

“C”是不是太明显的答案?

于 2011-03-17T18:03:04.017 回答
0

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

于 2008-09-16T16:46:12.457 回答
0

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

于 2008-09-16T17:20:38.960 回答
0

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

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

到目前为止,这对我来说是一次有益而有趣的经历,也是从 C++ 的内存管理中解脱出来的一个很好的突破。

于 2008-09-16T17:21:11.827 回答
0

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

而且,您还可以查看Haskell,如果您不了解该语言的功能范式,您会觉得这种语言很奇怪,但值得您花点时间。Tim Sweeney (EPIC Inc) 正在考虑将此语言作为 C++ 的替代方案。

于 2011-03-17T13:31:00.470 回答
0

垃圾收集是必须的(必要时避免使用它的能力也是如此)

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

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

typedef std::vector<Thingy> Thingys;
Thingys::const_iterator it = lotsOfThingys.begin()
于 2008-09-16T19:01:52.133 回答
0

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

于 2010-06-18T16:59:42.787 回答
0

不要在你的追求中忽视独立的语言。Ionic Wind Software 的 Emergence BASIC 具有内置的 DirectX 9 引擎,支持 OOP 并且可以轻松地与 C 库交互。

http://www.ionicwind.com

詹姆士。

于 2009-04-22T07:59:19.580 回答
0

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

auto it = lotOfThingys.begin()) // ... 推断类型,就像在 *ML VS2010beta 中已经实现了这个。

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

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

于 2009-12-23T10:14:34.590 回答
0

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

根据任务的不同,您可能会逃脱一些次要的 directx 黑客攻击。然后你可以使用 .NET 和slimdx。托管语言倾向于更快地编程并且更容易调试。

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

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

你也需要一个图形用户界面吗?wxWidgetsQT可能是一种可能性。

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

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

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

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

如果您需要一个几乎所有的方法:尝试 C++/CLI(可能与 C# 结合使用,以获得更简单的语法)。

于 2009-10-05T11:23:35.860 回答