C或C++用于OpenGL图形学。

13

在使用C++以及面向对象模型(类)来实现OpenGL(或者DirectX)的仿真时,是否存在任何缺点?相比之下,使用C语言以及过程式编程范式更优秀吗?


5
从技术角度来说,选择C++和过程式编程范式也完全是合理的。 - deft_code
6个回答

7

除非你的设计非常愚蠢或者在一个严重受限制的平台上,否则C语言并没有比C++更高的性能优势。


7
在高性能图形(游戏等)的背景下,面向对象编程最常见的缺点是内存瓶颈。OOP通常(但不一定)导致编写操作单个元素的函数,并利用标准库将其推广到数组。最好直接对数组进行操作,例如针对所有六个视锥体平面进行剔除,而不是调用单个平面剔除例程六次。
请查看以下资源以获取更多详细信息: 请注意,使用C++并不意味着严格的面向对象编程,您可以将其用于许多范例。因此,如果您使用C++编写自己的引擎,仍然可以利用所有现有的面向对象编程风格库(例如Qt),同时使用任何您喜欢的范例来完成核心功能。虽然这一切在C语言中也是可能的,但使用C++可能会更加方便。

4
在我看来,“C++编程是一堆废话”这篇文章本身就是“废话”。他所指出的大多数问题可以通过告诉编译器进行积极的内联来避免,其余的错误在几乎任何语言中都可能犯(除了使用“虚拟”的情况外,不过这可能并不是一个很大的问题,这取决于它的使用位置)。这主要取决于你如何思考你的代码,以及是否意识到缓存未命中等问题。 - Grant Peters
@Grant:实际上,至少在这个上下文中,它远不止于此。除了语法上的微小变化(例如传递指针而不是引用),他所讨论的基本上所有内容都同样适用于C和C++。 - Jerry Coffin
@Jerry:这就是我的观点,他说这是由于C++语言的原因,但实际上几乎任何语言都适用(除了像APL这样的语言,该语言专门设计以解决这些问题,尽管我相信如果你愿意,你仍然可以编写一个缓存抖动的程序)。 - Grant Peters
请注意,原帖明确询问“C++和面向对象模型”,而本文是关于后者在前者中不慎实现的内容。我猜标题是有意冒犯的,但在幻灯片中很清楚,它是关于设计而不是语言的。 - Malte Clasen

5

除非你在为内存严重不足的平台开发,否则C++通常是更好的选择(特别是在标准库方面,它确实使用更多的内存,但通常这样做是为了提高速度)。


2
这要看你需要渲染多少对象。是100个?1000个?100万个?使用哪种平台?你需要什么样的性能水平?
假设你需要渲染的对象数量较少,并且你比较熟悉C ++,那么我建议你使用它。保持简单 - 让它工作。如果以后需要优化,则在确定瓶颈位置后再进行。
如果你需要渲染大量对象,则应确保使用连续的、同质的数据数组来最小化高速缓存冲突(Justicle和Malte Clasen都提供了一些很好的链接,你应该阅读其中的前两个:)。如果你喜欢,仍然可以提供OO界面,但请确保引擎通过迭代遍历你的平坦数组来进行渲染。
如果你想要性能,则对于使用幼稚的场景树实现,我会非常谨慎 - 尽管易于理解,但通常很难进行优化,除非完全重写。
所以,回答你的问题,使用C ++而不是C没有任何缺点,但如果使用幼稚的面向对象方法,则存在潜在的性能问题。

0

C++并不意味着你必须使用面向对象编程,而且即使在引擎的更高层次上仍然可以很有用(在那里你将一次操作单个对象)。在低级别上,你应该尝试将事物放入数组中,并使用专为数组设计的函数来高效地迭代它们,但是高级别的游戏逻辑可能会更适合面向对象的设计(也许不是更快,但更容易编码、理解和对新手程序员来说更易于掌握)。 - Grant Peters
同意,虽然有时会出现不必要的面向对象的症状泄漏到代码中。但是像任何事情一样,最重要的是程序员的技能。 - Justicle

0

我不这么认为。你仍然可以轻松地从C++使用(过程式)OpenGL接口。这是我见过的大多数程序所做的。


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