实时图形编程中最好的C ++替代品是什么?

33

C++让我太过于关注自己的内存管理,让我打字太多(你好,std::vector<Thingy>::const_iterator it = lotsOfThingys.begin()),并且让我感到编译时间太长。在严谨的实时图形编程中,最好的单一替代方案是什么?垃圾回收是必须的(必要时也能避免其使用),速度必须与C ++相媲美。适当地访问C库也是必须的。

(全面披露:我有自己的答案,但我很想看看其他人为实时图形工作找到的好的C++替代方案。)

编辑:感谢大家认真的回复。鉴于这个问题没有“正确”的答案,我不会选择任何特定的答案。另外,我只会选择我喜欢的语言作为C++的替代方案,这并不公平。


2
为什么不发布你的答案,看看人们会如何投票呢? - Carl Seleborg
52
编译时间长意味着有更多时间可以进行办公室里精彩的剑术表演。 - Flame
2
编译时间和编码时间与“运行时”性能无关。好的3D应用程序(实时或非实时)都基于C / C++,具有内部内存管理,自定义优化(针对特定领域),以及良好的算法和图形引擎知识(openGL或DirectX)。 - Max
3
考虑到Baxissimo在D语言上回答了相当数量的问题,我猜测这是他的备选方案。它也相当符合要求(垃圾回收可以在需要时避免,速度与C++相当竞争力,“合理的方法”访问C库)。 - Martin B
7
使用现代的C++编译器可以让你做到以下几点: auto it = lotsOfThingys.begin();(注:该代码片段声明了一个名为it的变量,并将其初始化为lotsOfThingys容器的起始位置迭代器) - Matthieu N.
显示剩余3条评论
30个回答

19

有没有办法通过D现在使用win32 API、OpenGL和D3d?上次我看的时候(一段时间以前),只有部分支持(这就是我的游戏代码库仍然是C++的原因)。 - Fire Lancer

18

我不会放弃使用C++。实际上,我会考虑将Boost添加到你的C++库中,这会使得该语言更加易用。你的示例代码可以变为:

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

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

2
每次我尝试使用一个非常规的Boost库时,我总是感到失望。 Boost shared_ptr是我从Boost中尝试过的唯一一件真正做到我想要的事情,并且做得很好,而且没有令人困惑或限制的方式。 个人经验可能有所不同。 - Baxissimo
2
噢唷...真讨厌 Boost,编译时间长,也很容易混淆,实际上当我需要它时,通常可以很快地编写出更有用的东西(并通过测试用例确保我排除了漏洞)。作为一名专业游戏开发人员,我喜欢使用 C++ 来编写游戏(所有那些原始、低级别的能量!),但如果不是专业游戏,我通常会选择 C# 和 XNA。 - Grant Peters
2
我必须支持Grant的观点。Boost过于臃肿,通常来说并不实用。我最终采用了一个精简而健全的 Boost 和 STL 子集,并将其用作我们团队开发的基础库。 - Tarydon
1
不确定FOREACH是否是Boost的最佳卖点,例如,参见BOOST_FOREACH&templates without typedef,了解它在嵌套数据结构中失败的情况。 - js.

17

C#是一种很好的语言,符合您的要求,并且由于Microsoft提供了诸如Visual Studio和XNA等出色的工具和库,因此它绝对适用于图形。


1
+1 这是一个非常出色的平台,可以免费开发(使用VS的Express版本),而且C#非常适合快速启动项目。不幸的是,它缺乏我编写专业游戏所需的很多功能(系统中有相当多的开销,而在C++中你可以绕过这些问题,此外你还可以访问像SIMD命令这样的东西)。 - Grant Peters
1
然而,C# 可能不是最适合“访问 C 库的一个合理方法”的语言。您可能还会遇到 Windows 以外的问题。 - Jem
5
由于 Mono 的存在,C# 变得相当易于移植。而使用 P/Invoke 能够轻松地访问 C 库。 - el.pescado - нет войне
非常感谢,您可以免费在其上开发,无需任何版本的VS。 - harpo

15

实时 + 垃圾回收不太匹配,恐怕无法很好地兼容。

如果垃圾回收器随时可以介入并花费未定义的处理时间,那么很难做出任何实时响应保证...


1
这就是为什么我说“能够在必要时避免使用”的能力非常重要。只要你可以在必要时关闭收集,那么它就可以正常工作。 同时请注意,图形软实时和“实时系统”的硬实时之间存在差异。 - Baxissimo
3
现代垃圾回收机制的实现方式已经不再支持这种说法。虽然仍然很少,但商业游戏确实正在使用C#编写。 - NM.
2
使用C#编写商业游戏是可行的,但可能不适用于实时关键性的游戏。 - Jem
这取决于实时的定义。但垃圾回收并不需要长时间的暂停;那只是一个实现细节。更好的实现也可以避免在标记阶段将所有内容读入内存(将所有内容读入内存会破坏您希望从缓存中获得的任何性能提升)。 - Max Lybbert
Minecraft是用Java编写的(使用垃圾回收),虽然偶尔会有一些轻微的卡顿,可能归因于垃圾回收,但这不会影响游戏玩法。但对于真正快速和外观出色的FPS来说,它可能还不够好。 - KarlP
1
硬实时也可以使用GC来完成。http://www.youtube.com/watch?v=xH1yUXd9krU 这个机器人正在实时运行Java,并与我大学的人一起开发了GC。 - evading

15

我不同意你的前提。当小心谨慎地使用和正确使用时,C++是一种非常出色的语言,尤其适用于实时图形等需要追求速度的领域。

如果您设计系统得当并使用STL容器和智能指针,则内存管理变得轻松。

std::vector::const_iterator it = lotsOfThingys.begin()如果使用

using namespace std;
typedef vector::const_iterator ThingyConstIter;

那么代码会变得更简短。

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


3
预编译头文件对于gcc也适用。 - Tom

13

别忘了提到新的 'auto' 用法:

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.

这怎么回答楼主的问题了? - Pavel Matuska
1
@pavel:直接解决“太多打字”的问题,间接解决内存管理的问题。 - MSalters

13

也许可以采用一种混合方法。Python 和 C++相结合很不错(例如,参考PyGame)。


2
有一个众所周知的 MMORPG 走了这条路线——Eve Online?那甚至是 Stackless Python。不是主流。我已经忘记了,我认为它几乎是 AAA 级别的游戏。也许不符合 yrp 对 AAA 游戏的定义。 - Baxissimo
1
我相信Eve Online使用Stackless Python作为他们的服务器代码。我怀疑实时3D代码不是用Python编写的。 - Nathan

13
一些变体的Lisp编译成机器代码后,对于这种类型的编程来说几乎可以和C++一样快。顽皮狗团队创建了一个名为游戏导向汇编Lisp的Lisp版本,他们用它来创建了多个AAA游戏,包括《杰克与达克斯特》系列。在游戏行业中采用Lisp方法的两个主要障碍是C/C++开发的根深蒂固(无论是工具还是人力资源都大量投资于C/C++),以及难以找到既精通游戏编程领域又精通Lisp语言的优秀工程师。
许多行业内的编程团队正在转向混合方法,其中实时代码,特别是图形和物理代码,使用C或C++编写,但游戏逻辑则由更高级别的脚本语言完成,这些语言可供程序员和非程序员使用和编辑。LuaPython都很流行用于高级脚本编写。

这是我再次推荐lispbuilder-sdl的时机...http://code.google.com/p/lispbuilder/wiki/LispbuilderSDL - justinhj
1
我应该指出,GOAL并不是标准的Lisp语言; Naughty Dog从头开始内部编写了它的编译器,并且它有许多特性对于典型的Common Lisp程序员来说可能会感到非常陌生。例如,它非常重视命令式编程,广泛依赖副作用,并且提供透明的内联汇编集成,以便看起来像Lisp形式的东西实际上经常是操作码。 - Crashworks
我希望能够很快用Lisp制作一些游戏,但不幸的是,关于Lisp游戏开发的信息相当有限。 - Isaiah

8

作为一位从事3D VR应用开发/研究/教授已达20年的人,我建议除了C语言(也许还可以用C语言),没有其他选择。减少延迟并实现实时交互的唯一途径是使用一个经过优化编译的语言(例如C或C++)和能够访问快速可靠的3D图形库(如OpenGL)。虽然我同意编写所有代码可能会令人沮丧,但这对于性能和优化非常重要。


4
但是还有其他编译成本地代码的语言。D编程语言正在发展得非常好。有些人说OCaml也很不错。此外,无论你用什么语言开发应用程序,你总是需要调用低级别的本地库(如OpenGL、BLAS等)来完成真正繁重的工作。因此,我不同意认为必须使用C/C++才能获得所需的性能。但根据项目的需要,它们可能出于其他原因而被要求使用。 - Baxissimo

6
有时候,走出传统的编程之路,你会发现一些真正的宝藏。你可能想考虑一下PureBasic(不要被名字所迷惑)。以下是一些细节:

PureBasic 特点

  • 机器码 (汇编) 可执行文件 (FASM)
    • 内联汇编支持
    • 无需运行时 (不需要 DLL 等) 1 个可执行文件
    • 微小的可执行文件 (与 C++ 相当或更小/更快,没有运行时)
    • 可以编写 DLL
    • 多线程支持
    • 完整的操作系统 API 支持
  • 多平台支持
    • Windows 95-2003
    • Linux
    • Mac-OS X
    • Amiga
  • 2D 和 3D 游戏开发
    • DirectX
    • OGRE
  • 慷慨的许可证
    • 价格便宜 (79 欧元或约 112 美元)
    • 终身许可证 (包括所有未来更新和版本)
    • 所有平台的统一价格
  • 外部库支持
    • 第三方 DLL
    • 用户库
  • 在线支持
    • 由其创建者领导的反应迅速的开发团队
    • 在线论坛
      • 一个地方获取答案 (不必在网上到处找)
      • 大量的示例代码 (可以在 IE 中使用 IEtool 尝试代码)
      • 快速回复问题
  • 额外的学习 (学习 C++ 的替代方法)
    • API
    • 结构体
    • 接口
    • 指针

访问在线论坛以更好地了解PureBasic(http://www.purebasic.fr/english/index.php),或访问主站点:www.purebasic.com


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接