Questions tagged «architecture»

代码的结构。有关游戏引擎内部设计的问题。

3
如何用C ++组织游戏引擎?我使用继承是个好主意吗?
我是游戏开发和编程的初学者。 我正在尝试学习构建游戏引擎的一些原理。 我想创建一个简单的游戏,正要尝试实现游戏引擎。 所以我认为我的游戏引擎应该控制这些事情: - Moving the objects in the scene - Checking the collisions - Adjusting movements based on collisions - Passing the polygons to the rendering engine 我设计了这样的对象: class GlObject{ private: idEnum ObjId; //other identifiers public: void move_obj(); //the movements are the same for all the objects (nextpos …
11 c++  architecture  oop 

2
如何有效开发Android游戏?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 2年前关闭。 我已经附上了我用油漆制作的流程图的图像。 该图显示了我想如何开发自己的游戏。我想要一款运行良好的游戏,它具有易于更新的智能编码,并且随着时间的推移具有广告功能。我的目标平台是Android智能手机,所有代码将使用具有XML扩展资源的Java编写,如果那很重要的话。我不是在寻找硬代码,尽管伪代码会有所帮助,但我还是更喜欢建议和专业意见。 我的问题是: 这是编写游戏程序的好方法还是有更好的方法来进行游戏?是否需要进行任何修改?任何建议都是有用的,因为我没有游戏编程方面的经验,所以我更喜欢那些写过几款游戏并且从经验中知道应该如何设置其代码才能有效运行的人的建议。

3
多人实时安卓游戏的最佳解决方案
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为Game Development Stack Exchange 的主题。 5年前关闭。 我打算为Android(2-8个玩家)制作多人实时游戏,并且我认为哪种组织最佳的解决方案是最好的: 使服务器在PC上,客户端在移动设备上,所有通讯都通过服务器(ClientA-> PC SERVER->所有客户端) 使用蓝牙,我还没用过,我也不知道在蓝牙上制作多人游戏很难 使服务器位于其中一台设备上,并与其他设备连接(通过网络,但是我不知道通过NAT解决设备的问题是否很困难?) 其他解决方案?

5
事件驱动系统中的嵌套输入
我正在使用具有事件和委托的基于事件的输入处理系统。一个例子: InputHander.AddEvent(Keys.LeftArrow, player.MoveLeft); //Very simplified code 但是,我开始怀疑如何处理“嵌套”输入。例如,在《半条命2》(或其他任何真正的Source游戏)中,您可以使用拾取物品E。拾取物品后,您不能使用射击Left Mouse,而是扔掉物体。您仍然可以跳下去Space。 (我是说嵌套输入是您按某个键的地方,可以更改的操作。不是菜单。) 这三种情况是: 能够像以前一样做同样的动作(例如跳跃) 无法执行相同的操作(例如射击) 完全执行其他操作(例如在NetHack中,按开门键表示您不移动,但选择打开门的方向) 我最初的想法是在收到输入后才进行更改: Register input 'A' to function 'Activate Secret Cloak Mode' In 'Secret Cloak Mode' function: Unregister input 'Fire' Unregister input 'Sprint' ... Register input 'Uncloak' ... 这会遭受大量的耦合,重复的代码和其他不良的设计标志。 我猜另一个选择是维护某种输入状态系统-也许是寄存器函数的另一个委托将大量的寄存器/注销重构到更干净的位置(在输入系统上具有某种堆栈)或可能是什么数组保留,不保留。 我确定这里有人一定遇到了这个问题。您如何解决的? tl; dr如何处理事件系统中另一个特定输入之后收到的特定输入?

7
低耦合和紧密内聚
当然这要视情况而定。但是,当较低级别的对象或系统与较高级别的系统通信时,是否应首选回调或事件而不是将指针指向较高级别的对象? 例如,我们有一个world具有成员变量的类vector<monster> monsters。当monster类与进行通信时world,我应该更喜欢使用回调函数,还是应该在world类内部具有指向该类的指针monster?

1
在游戏子系统中注册游戏对象组件?(基于组件的游戏对象设计)
我正在创建一个基于组件的游戏对象系统。一些技巧: GameObject只是的清单Components。 有GameSubsystems。例如,渲染,物理等。每个都GameSubsystem包含一些指向的指针Components。GameSubsystem是一个非常强大且灵活的抽象:它代表游戏世界的任何部分(或方面)。 有在登记的机构的需要Components在GameSubsystems(当GameObject被创建和组成)。有4种方法: 1:责任链模式。每个人都Component被提供给每个人GameSubsystem。GameSubsystem决定Components要注册的内容(以及如何组织)。例如,GameSubsystemRender可以注册可渲染组件。 亲 Components对如何使用它们一无所知。低耦合。答:我们可以添加新的GameSubsystem。例如,让我们添加GameSubsystemTitles来注册所有ComponentTitle,并确保每个标题都是唯一的,并提供按标题查询对象的接口。当然,在这种情况下,ComponentTitle不应该被重写或继承。B.我们可以重组现有的GameSubsystems。例如,可以将GameSubsystemAudio,GameSubsystemRender,GameSubsystemParticleEmmiter合并到GameSubsystemSpatial中(以将所有音频,发射器,渲染Components置于相同的层次结构中并使用父相对转换)。 骗子 每次检查。效率很低。 骗子 Subsystems知道Components。 2:每个Subsystem搜索Components特定类型。 亲 性能比更好Approach 1。 骗子 Subsystems仍然知道Components。 3:在中Component注册自己GameSubsystem(s)。我们在编译时知道有一个GameSubsystemRenderer,所以让ComponentImageRender调用类似GameSubsystemRenderer :: register(ComponentRenderBase *)之类的东西。 亲 性能。没有像中那样不必要的检查Approach 1。 骗子 Components与...严重耦合GameSubsystems。 4:调解员模式。GameState(包含GameSubsystems)可以实现registerComponent(Component *)。 亲 Components和GameSubystems什么都不知道对方。 骗子 在C ++中,它看起来像丑陋且缓慢的typeid开关。 问题: 哪种方法更好,并且主要用于基于组件的设计?什么做法说?关于实施的任何建议Approach 4? 谢谢。

5
初学者/独立游戏开发商是否应该最初针对多个平台?
部分响应于游戏开发人员如何针对多个平台(Xbox 360,PS3,PC和Linux)?但主要是因为有人在这里发布游戏,因此跨平台是否应该成为尝试进入业务领域的开发人员的首要要求/功能?我一直是一个信徒(以完全拖延的方式)选择“利基”或“大众市场”平台,并在需要时再移植。跨平台始终感觉像是进入的人为障碍。为什么我们都不应该编写iPhone,Windows或浏览器游戏?

3
如何使复杂的AI易于管理?[关闭]
很难说出这里的要求。这个问题是模棱两可,含糊,不完整,过于宽泛或夸张的,不能以目前的形式合理地回答。如需帮助澄清此问题以便可以重新打开, 请访问帮助中心。 7年前关闭。 过去,我使用有限状态机(FSM)和分层FSM等简单系统来控制AI行为。这种模式很快就会崩溃,也不会导致任何复杂的系统崩溃。 我听说过行为树。它们似乎是下一个显而易见的步骤,但是我还没有看到可行的实现或尚未尝试过。 还有哪些其他模式可以使复杂的AI行为易于管理?

4
在两个单独的图形库上具有相同的游戏逻辑
什么样的编码理念/抽象/程序设计结构可以使游戏同时(单独)与2D和3D图形一起使用,而无需重新编码游戏逻辑? 我们正在讨论采用相同的代码,更改最少的内容(例如,将2D资产的文件名与3D资产的文件名交换),并可能为每个泛型/模板插入一些基类的专业化知识。 将其置于有意义的真实环境中:想象一个局域网多人游戏,其中有一个一流的,渴望性能的3D客户端,为玩家提供了一些非常好的游戏装备,而一个较不起眼的2D客户端有人在阁楼上发现的满是灰尘的盒子。但这仍然是同一游戏-记录了相同的事件(有人捡了一个硬币),使用了相同的网络协议,世界成比例,等等。 将其置于MVC上下文中:控制器完全相同(按“向上”键会将玩家加速设置为3.5单位/秒),视图完全不同(2D与3D),并且模型相同除了与图形直接相关的所有内容外(每5秒钟对环境进行一次碰撞检查,并且使用相同的算法。请注意,这意味着2D版本中的所有游戏对象都有一个Z坐标,但是只是被忽略或以其他方式显示给用户,例如,当播放器处于空中时,阴影会显示在最左端)。 之所以使这个主题如此吸引人,是因为它将迫使开发人员对他的数据的结构以及控件的流动方式有一个非常清晰的认识。请注意,这并不意味着使用诸如SDL,D3DX或OpenGL之类的图形库以外的任何东西。没有游戏引擎! 由于这是一个主要的理论问题,因此我将省略编程语言,但是如果您要举一个例子,则可以使用任何喜欢的语言,如果想全力以赴,则可以使用C ++;如果您愿意,可以使用Brainfuck。应对挑战(任何具体的答案以及任何抽象的答案都将受到赞赏!)。

4
实体系统和渲染
Okey,到目前为止我所知道的;该实体包含一个组件(数据存储),其中包含类似信息;-纹理/精灵-着色器-等等 然后我有一个渲染器系统,可以绘制所有这些图像。但是我不明白渲染器应该如何设计。每个“视觉类型”都应有一个组件吗?一个组件没有着色器,一个组件具有着色器,等等? 只需输入一些“正确方法”即可完成此操作。要提防的提示和陷阱。

2
如何在基于实体/组件的系统中构造游戏状态
我在做设计与实体分量范例,使用系统组件之间的通信,说明游戏在这里。在开发过程中,我已经达到需要添加游戏状态(例如暂停,播放,关卡开始,回合开始,游戏结束等)的地步,但是我不确定如何在我的框架中进行操作。我看这对游戏状态的代码示例,每个人都似乎是参考,但我不认为它与我的框架适合。似乎每个状态都处理自己的绘图和更新。我的框架有一个SystemManager,可以处理使用系统进行的所有更新。例如,这是我的RenderingSystem类: public class RenderingSystem extends GameSystem { private GameView gameView_; /** * Constructor * Creates a new RenderingSystem. * @param gameManager The game manager. Used to get the game components. */ public RenderingSystem(GameManager gameManager) { super(gameManager); } /** * Method: registerGameView * Registers gameView into the RenderingSystem. * @param gameView …

4
游戏设计中的每帧函数调用与事件驱动消息传递
据我所知,传统的游戏设计使用多态和虚拟功能来更新游戏对象的状态。换句话说,在游戏中的每个对象上以规则的间隔(例如,每帧)调用同一组虚拟函数。 最近,我发现,还有另一个- 事件驱动的消息传递系统可用于更新游戏对象的状态。在这里,对象通常不会按帧进行更新。取而代之的是,构建了高效的事件消息传递系统,并且仅在收到有效事件消息之后才更新游戏对象。 事件驱动的游戏体系结构在Mike McShaffry编写的《Game Coding Complete》中有很好的描述。 我可以在以下问题上寻求帮助: 两种方法的优缺点是什么? 哪里比另一个更好? 事件驱动游戏设计在所有领域都通用且更好吗?因此,即使在可移植的平台中,也建议使用它吗? 哪一个更有效,哪个更难开发? 要澄清的是,我的问题不是要从游戏设计中完全消除多态性。我只是希望了解使用事件驱动消息传递与常规(每帧)调用虚拟函数以更新游戏状态的区别和好处。 示例: 这个问题在这里引起了一些争议,因此让我为您提供示例:根据MVC,游戏引擎分为三个主要部分: 应用层(硬件和操作系统通信) 游戏逻辑 游戏画面 在赛车游戏中,“游戏视图”负责以最快的速度(至少30fps)渲染屏幕。Game View也会侦听玩家的输入。现在发生这种情况: 玩家将燃油踏板踩到80% GameView构造一条消息“将Car 2油门踏板压到80%”,并将其发送给Game Logic。 Game Logic会获取消息,评估,计算新车的位置和行为,并为GameView创建以下消息:“绘制2踩下燃油2的燃油踏板”,“ 2声音加速”,“ 2坐标X,Y” .. 。 GameView接收消息并进行相应处理

5
跨平台底层图形API
创建系统抽象时,最好在有意义的最低级别上用通用接口隐藏平台不同的API。 考虑到不同的现代(无固定功能管道)本地图形API:OpenGLES 2.0 +,OpengGL 3.0 +,DirectX 10.0 +,Xbox DirectX 9,LibGCM 如果要创建一个无状态的低级图形API放在所有这些之上,那么使它尽可能薄且尽可能快的最佳方法是什么?

1
如何在自制渲染系统中缓存资源
背景: 我正在为使用C ++和OpenGL的实体组件系统类型体系结构设计一个简单的3D渲染系统。该系统由一个渲染器和一个场景图组成。完成渲染器的第一次迭代后,我可能会将场景图分发到ECS架构中。目前,它是一种占位符。如果可能,以下是我对渲染器的目标: 简单性。这是一个研究项目,我希望能够轻松更改和扩展我的系统(因此采用ECS方法)。 表现。我的场景可能有很多小型模型,也有很多具有很多几何图形的体积。从OGL上下文中获取对象并在每个渲染帧中缓冲几何体是不可接受的。我的目标是数据本地化,以避免缓存未命中。 灵活性强。它必须能够渲染精灵,模型和体积(体素)。 解耦。编写渲染器后,场景图可以重构为核心ECS体系结构。 模块化。能够在不更改场景图的情况下交换不同的渲染器将是很好的。 参照透明性,表示在任何时间点我都可以给它任何有效的场景,并且它将始终为该场景渲染相同的图像。特别地,该目标不是必需的。我认为这将有助于简化场景序列化(我将需要能够保存和加载场景),并为我提供了在运行时出于测试/实验目的而在不同场景中交换的灵活性。 问题与思路: 我想出了一些不同的方法来尝试,但是我正在努力为每个渲染节点缓存OGL资源(VAO,VBO,着色器等)。以下是到目前为止我已经想到的不同的缓存概念: 集中式缓存。每个场景节点都有一个ID,渲染器具有将ID映射到渲染节点的缓存。每个渲染节点包含与几何图形关联的VAO和VBO。高速缓存未命中获取资源并将几何图形映射到高速缓存中的渲染节点。更改几何形状后,将设置脏标志。如果渲染器在遍历场景节点时看到肮脏的几何标志,则它将使用渲染节点重新缓冲数据。移除场景节点后,会广播事件,并且渲染器会在释放资源的同时从缓存中删除关联的渲染节点。或者,将节点标记为要删除,而渲染器负责将其删除。我认为这种方法最接近目标6,同时也考虑了4和5。2遭受了额外的复杂性和丢失了使用地图查找而不是数组访问的数据局部性的麻烦。 分布式缓存。除了每个场景节点都有一个渲染节点外,其他与上面类似。这会绕过地图查找。为了解决数据局部性,可以将渲染节点存储在渲染器中。然后场景节点可以改为具有指向渲染节点的指针,并且渲染器将指针设置在高速缓存未命中。我认为这种模仿实体组件方法,因此与架构的其余部分保持一致。这里的问题是,现在场景节点保存渲染器实现特定的数据。如果更改了事物在渲染器中的渲染方式(如渲染精灵与体积),则现在需要更改渲染节点或向场景节点添加更多“组件”(这也意味着更改场景图)。从好的方面来说,这似乎是启动并运行我的第一迭代渲染器的最简单方法。 分布式元数据。渲染器缓存元数据组件存储在每个场景节点中。此数据不是特定于实现的,而是包含ID,类型以及缓存所需的任何其他相关数据。然后,可以使用ID直接在数组中完成缓存查找,并且该类型可以指示要使用的呈现方法的类型(如精灵与体积)。 访客+分布式映射。渲染器是一个访客,场景节点是访客模式中的元素。每个场景节点都拥有一个只有渲染器才能操作的缓存键(就像元数据一样,只是一个ID)。该ID可以用于数组,而不是广义的地图查找。渲染器可以允许场景节点根据场景节点的类型调度不同的渲染功能,并且ID可以由任何缓存使用。默认或超出范围的ID将指示高速缓存未命中。 您将如何解决这个问题?或您有什么建议吗?感谢您阅读我的文字墙!

2
将游戏动作同步到特定动画时间的好的技术?
因此,我在开发的游戏中遇到了一个问题,但这似乎是很多游戏中都涉及的非常基本的问题。 我的游戏要求在角色动画期间的某个特定时间点发生某些游戏功能。因此,正如标题所说,我想知道有什么好的技术和基本策略可以将与游戏相关的事件/功能/动作同步到角色动画中的特定点。 以下是我在各种类型的游戏中谈论的一些简单示例: 您的角色将他们的枪重新装在射手中。您的角色将播放他/她的“重新加载”动画,但重要的是,仅在更换弹匣并握住枪支后的确切时刻调用设置currentAmmo变量的函数。这可能是重新加载动画中间的某个时刻。 在基于回合的RPG中,您的角色站在面对一排敌人的队伍中。当被命令进攻时,您的角色之一会奔跑/跳跃到敌人中的一个,并挥舞其巨剑,然后再奔跑/跳跃回到其站立位置。您想确保在播放大幅削减动画的确切时刻损坏敌人 -在向上跑和向后跑之间的某个时间点。 在隐形游戏中,您的角色可以潜行并与世界上的计算机和按钮互动。也许有一个按钮可以关闭您正在渗透的哨所的电源。当按下动作按钮时,您的角色伸出手并按下按钮,然后返回其闲置状态。您希望在按下按钮时在“ push_button”动画中的确切位置关闭灯。 诚然,我的情况最类似于第二个示例,在该示例中,我创建了一个动画,其中基于回合的角色在攻击过程中前冲,并且我希望在动画似乎与之接触的那一刻施加损害。因为我的游戏使用回合制(想像“最终幻想”或“火焰纹章”之类的东西),所以我需要伤害/治疗/魔法/等。即使我实际上没有使用碰撞/命中框,也可以在每个角色动画的正确时间应用它。 我应该提到的是,我正在使用流行的游戏引擎来制作游戏,而现在我正在通过使用他们的动画事件来处理该事件,或者通过通知来实现接近预期结果的效果-我的角色执行了某个命令并触发了特定于命令的动画(即:“ attack_command”)和我的每个命令的动画资产必须在我的角色ExecuteCommand函数中包括一个动画事件/通知“回调”。换句话说,角色告诉攻击动画播放,然后攻击动画会在动画发生的确切时间向角色发出事件/通知回调,该事件应在造成伤害时进行。 坦白地说,这暂时有效,但是感觉有点不对劲 -就像我在这里遗漏了一部分大图!这种方法感到不对的部分原因是,它将游戏逻辑与动画资产结合在一起。如果我的动画素材资源忘记包括ExecuteCommand()事件/回调,则该命令将无法正确执行,并且需要额外的代码来检查命令动画是否在不执行命令的情况下完成。这太乱了,这意味着我的游戏对其资产有奇怪的依赖性。当然,我希望在攻击动画期间的特定时间点造成损害,但是我对在动画资源中调用游戏代码感到很奇怪。 那我在这里俯瞰什么?有什么好的通用技术可以处理这些类型的情况,您希望在动画中的特定时间发生某些重要的游戏操作? 编辑:澄清一下,这不是引擎特定的问题,我也不是在寻找引擎特定的设计/技术。我对一种通用的动画/游戏同步技术很感兴趣,而无论使用哪种技术,这些技术都可能会在您的游戏项目中使用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.