gpt4 book ai didi

c++ - 用于包装 SDL 和 OpenGL 绘图方法的虚拟函数的替代方法

转载 作者:太空狗 更新时间:2023-10-29 21:07:23 26 4
gpt4 key购买 nike

我正在尝试用 C++ 为游戏编写一些样板代码。我想同时使用 SDL 和 OpenGL 进行绘图。例如,我想用 OpenGL 和 SDL 编写两个版本的函数“DrawPixel”。我不能同时使用 SDL 和 OpenGL 进行渲染,但我想要一个通用的绘图接口(interface),这样我在实现游戏时就不必编写两倍的代码。

我可以在虚拟中编写一个包含我想要的所有绘图函数的基类,然后为 SDL 和 OpenGL 重载它的 2 个版本。问题在于性能,因为我最终可能每秒调用 DrawPixel 数百万次,解决虚拟调用的成本很高。

除了这种 OO 方法,我还有哪些其他选择? (或者你可以告诉我虚拟并不慢)

最佳答案

在我开始回答您的问题之前,您是否考虑过将其设为编译时标志,例如#define——这将使您决定使用 GL 还是 SDL,而不会浪费空间或需要虚拟调用。如果可以,一定要采用此解决方案。

虚函数只是一个额外的指针查找,调用一个指针引用的函数而不是一个常量值。 -- 它们有一个很大的缺点,就是它们不能被内联,因为编译器不知道函数在哪里。这将成为任何在运行时决定功能的程序的问题。

我将从一个警告开始:这些可能是微优化,不值得担心。我可能会考虑进行性能基准测试以了解这有多重要。例如,GL 和 SDL 调用已经在一个单独的库中,因此它们中的每一个可能都已经需要指针查找等。额外的指针可能是您最不关心的问题。

如果您真的无法在编译时做出决定,恕我直言,避免虚拟调用的唯一简单方法是使用 C++ 模板来完成这项工作。在你的情况下,我会为你需要的每个 GL 或 SDL 函数创建两个单独的类,命名相同,但不要使它们成为虚拟的。然后,整个程序中使用这些函数的每个函数/类都需要使用 SDL 或 GL 声明为模板。最后,在您的顶级 main() 函数中,有一个 if 语句,它根据您想要的版本运行您的程序的一个或另一个版本。

这将导致一个完美高效的解决方案,甚至内联所有可以内联的函数;但是,以拥有两个程序拷贝和占用更多空间为代价。另外——因为它会导致程序更大,这实际上可能会降低性能。

如果您不需要模板,一种可能也有效的奇怪方法是让加载程序使用两个不同的动态链接库之一。两个库都将导出相同的函数,然后您可以选择加载其中一个(例如,通过将 LD_LIBRARY_PATH 设置为一个目录)

关于c++ - 用于包装 SDL 和 OpenGL 绘图方法的虚拟函数的替代方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5228070/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com