【问题标题】:Rendering in a client-server game which uses the same classes在使用相同类的客户端-服务器游戏中渲染
【发布时间】:2013-11-19 19:05:48
【问题描述】:

所以我在构思一款小型在线游戏时遇到了这个小问题。

以下是其工作原理的简单想法: 客户端和服务器将使用相同的“世界”实现——对象、物理模拟。假设我们有 World 类,其中包含 WorldObjects 的向量。 WorldObject 是其他类(如 PlayerObject、BoxObject、MonsterObject)派生的基类。这里的问题是如何有效地为这些对象类声明自定义渲染方法。例如,必须以不同于 BoxObject 的方式呈现 PlayerObject。

要记住的是,我们不能只创建一个虚拟渲染方法,因为这意味着例如。 BoxObject 必须 #include "OpenGL.h" 这不能在服务器端完成(我们希望服务器端清除图形库)。

那么如何做到这一点呢?我想出了这样的想法:创建一个单独的单例(仅客户端),其中包含不同对象类型(例如由枚举标识)的渲染方法的实现,但这是最好的方法吗?你知道有什么更高效灵活的吗?

当然,我们在这里讨论的是 C++,但如果有您知道并在其他语言中使用的规则或实践,请分享(这就是为什么我没有在帖子中真正指定语言的原因)。谢谢。

【问题讨论】:

    标签: c++ networking inheritance client-server


    【解决方案1】:

    您可以引入从支持渲染的 PlayerObject 和 BoxObject 派生的类型,例如 PlayerObjectRenderable 和 BoxObjectRenderable(或者更合理地,您可以引入 Renderable 之类的接口)。然后,当您为客户端创建(或分解)对象时,您创建这些 ObjectRenderable 类的实例,而对于服务器端,您使用更通用的类。当它进入渲染时,您提供对 Renderable 接口的引用或指针。客户端工厂建筑对象也可能派生自广义对象,依此类推...

    【讨论】:

    • 确实,做 PlayerObject:WorldObject,Renderable 是个好主意,但是服务器也必须使用它,但另一方面 PlayerObjectRenderable:PlayerObject,Renderable - 存储呢?我将其存储为 PlayerObject 吗?当我获取指向 PlayerObject 的指针时,我能否将其转换为 Renderable?如果没有某种时髦的 reinterpret_cast 用法,我认为这种方式是不可能的?
    • 是的,如果你有一个可渲染的播放器对象,你应该通过指向播放器对象的指针/引用来“存储”它,并且你可以将它存储为指向 Renderable 的指针/引用您的图形相关代码。另一种方法是使用 dynamic_cast 转换 PlayerObject 指针或对派生类型的引用;然后,如果 cast 成功,您可以将其用作可渲染对象。更多信息在这里:stackoverflow.com/questions/2253168/dynamic-cast-in-c
    • 做了一些测试,确实有效!就这么简单:WorldObject* OBJ = dynamic_cast(RENDERABLE_INSTANCE) 感谢您的回复和链接,了解 dynamic_cast 对于实现这种系统至关重要:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-24
    • 1970-01-01
    • 1970-01-01
    • 2018-01-05
    • 2019-08-07
    • 2023-04-09
    相关资源
    最近更新 更多