Questions tagged «architecture»

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

4
动态内存分配和内存管理
在普通游戏中,场景中有成百上千个对象。通过默认的new()动态地为所有对象(包括枪击(子弹))分配内存是否完全正确? 我应该为动态分配创建任何内存池,还是不必为此烦恼?如果目标平台是移动设备怎么办? 请在手机游戏中需要一个内存管理器吗?谢谢。 使用的语言:C ++;当前在Windows下开发,但计划在以后移植。

5
完成与稳定的软件设计?
几乎没有足够的时间来完成我们制作的游戏,那么如何在坚实的软件体系结构和取得良好进展的所有过程之间取得平衡? 我的个人挑战:如何在今天有效并同时进行长期思考?另外,在执行此操作时,您可能还想在此途中学习新事物,而不是诉诸过去五年来一直使用的相同重复模式?

4
一个简单的UDP游戏涉及什么?
我曾经尝试在一周内用UDP编写一个简单的游戏作为一次性测试。太可怕了。 我很早就把它扔了。我遇到的主要问题是将所有玩家/敌人/物体的游戏状态恢复为旧状态,并将游戏快速移至玩家正在玩的时间点(即,跳前半秒)。让玩家错过跳跃) 也许这种方法不是最简单的方法?我怀疑是这样,但我从一开始就设计错误,并在第二天结束时意识到。(所以我没有学太多或浪费了很多时间) 对于我自己和其他人,一个简单的UDP游戏涉及什么,我该怎么写?或如何解决恢复正确状态的预测问题。 我将其标记为CW bc,我知道会有很多有用的答案。

2
继承与组成
我用C#赚钱。通常,我会使用这种语言使用界面将所有事物解耦到高处。这在企业代码中为我提供了很好的服务,但是在C#中编写游戏时,由于能够为基类定义一些默认行为,因此我倾向于继承。但是我这样做很肮脏,就像我不服从曾经说过“赞成继承而不是继承”的建筑神一样。我知道它不是黑白的,但我也觉得我可以使用界面进行更多的工作,并大致实现相同的目的。 别人在做什么?是继承是游戏的正确方法,还是应该在某些接口中重构?
16 c#  architecture 

4
我可以利用特征蠕变来发挥自己的优势吗?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引文回答。 2年前关闭。 我可以利用特征蠕变来发挥自己的优势吗? 每次我制作游戏原型时,都会无意中添加功能。这是通过巧合发生的,或者是根据现有内容添加起来很容易的。 如果我知道游戏的类型,我是否可以开始制作基本机制并添加功能,使其变得明显? 例如,如果我想在6个月的时间内制作2D平台游戏,我是否可以开始进行跑步,跳跃,射击等工作,并在无意中找到它们时添加核心机制?或者,如果没有预先确定的计划,这是否会浪费时间进行投资? 我这样做的逻辑是,设计将物有所值。设计选择将更容易围绕易于制作的内容(按时间)构建。 总而言之,在设计游戏之前,构建游戏有什么问题吗?

5
代码对象通用名字典
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 6年前关闭。 我正在寻找专用于游戏的通用术语词典(就像设计模式具有事物交互的通用语言一样)。 例如,如果我正在制作具有高度复杂性的乒乓游戏,我想相应地命名。 我见过一些用户可以与之交互的视觉对象,称为小部件,一些非交互的对象,称为doodad(无论如何,我还是在与星际争霸的地图编辑器一起玩的时候回来的)。帧频时钟有合适的名称吗?游戏时钟是否有适当的名称(该时钟与世界上物体的运动有关,而与视觉图形无关)? 我只想要一本字典,这样我就能说相同的语言,而不用随便写东西。我担心我要创建名为doodads,whosits,whatsists和flim-flams的东西,而我不想这样做。

3
音效系统设计
我正在Unity中创建一个RPG / RTS游戏。有很多字符,可能还有很多不同的环境。我对编码部分非常有信心(因此,这个问题与游戏引擎并没有真正的联系)。我也自己创作音乐(独奏,乐队中基于打击垫的现场鼓,为朋友混音等),所以我认为我对所有必要工具都有很好的掌握。但是,我从未为游戏创建声音设计,而且我不太了解如何做到这一点。 您将如何组织和使用声音效果?例如,您有5种不同的角色类型和3种不同的背景(例如草,泥和木),您会创建5 * 3的脚步声吗?将随机变数添加到样本中是个好主意吗?关于环境声音呢?您是创建一个仅在背景上启动的主循环,还是在整个游戏级别放置真实声音(水,风,树皮移动,鸟类)? 总体而言,我对此类愚蠢的随机问题的回答太多了,因为我不太了解该系统的设计方式。如果有人给我链接到有关此事的某种指南或文章,我将非常感谢。

3
如何实现交易卡游戏的“特殊效果卡”?
我正在尝试在这里编写一种交易卡游戏,以某种方式类似于Magic The Gathering或Yu-Gi-Oh!纸牌游戏。 对于那些不熟悉它的人,基本上,在游戏中,有一种特殊的卡(咒语卡/陷阱卡/等),它们具有可以改变游戏规则的特殊效果。我完全不知道的是,如何实现这些卡的逻辑。我有一些想法,用一些标志来存储卡的数据,这些标志可以发出信号来表明它具有什么样的能力,但是这样做的能力是非常有限的(也许只是一些简单的统计数据修改)。 为了让您大致了解这些牌的效果,以下是Yu-Gi-Oh中存在的咒语牌效果的一些示例!纸牌游戏: 恢复被摧毁的生物 控制对手的生物 根据某些条件(例如具有被破坏的某些名称的生物数量)修改生物的统计信息 如果满足某些条件,则特殊召唤某些生物。 将两个或多个生物融合成一个更强大的生物。 不受某些特殊卡的影响。 Konami已经制作了数款游戏电子游戏,其中包括AI和数千种卡片。我认为实际上不可能对整个数据库进行硬编码,对吗? 现在,我当然想做的事没有这些游戏那么复杂,但是我很好奇,他们如何实现这些?

2
有关游戏架构/设计模式的建议
我一直在研究2D RPG,有一段时间了,我发现自己做出了一些糟糕的设计决定。特别是有些事情引起了我的问题,所以我想知道其他人过去曾使用或将采用哪种设计。 作为一点背景,我从去年夏天的业余时间开始研究它。我最初使用C#进行游戏,但是大约3个月前,我决定切换到C ++。自从我大量使用C ++以来,我一直想对C ++有所了解,并且认为像这样的有趣项目将是一个很好的动力。我一直在广泛使用boost库,并且一直在将SFML用于图形,将FMOD用于音频。 我写了很多代码,但是我正在考虑废弃它并重新开始。 这是我关注的主要领域,并希望就其他人已解决或将要解决的正确方法获得一些意见。 1.周期性依赖 当我做在C#中的比赛中,我并没有真的要这个担心,因为它不是一个问题存在。转向C ++,这已经成为一个相当大的问题,让我觉得我可能设计不正确。我真的无法想象如何解耦我的班级,仍然让他们做我想要的事情。以下是依赖链的一些示例: 我有一个状态效果课。该类有许多方法(应用/取消应用,刻度线等)将其效果应用于角色。例如, virtual void TickCharacter(Character::BaseCharacter* character, Battles::BattleField *field, int ticks = 1); 每当角色受到状态影响时,都会调用此函数。它可用于实现诸如Regen,Poison等的效果。但是,它也引入了对BaseCharacter类和BattleField类的依赖。自然,BaseCharacter类需要跟踪当前对它们起作用的状态影响,因此这是周期性的。《战地风云》需要跟踪战斗方,并且该方类别有一个引入了另一个周期性依赖关系的BaseCharacters列表。 2-活动 在C#中,我大量使用了委托来勾勒角色,战场等事件(例如,当角色的健康状况发生变化,状态更改,状态效果被添加/删除时,都有一个委托。 )和战场/图形组成部分将与这些代表挂钩,以增强其效果。在C ++中,我做了类似的事情。显然,没有直接等效于C#委托的东西,所以我创建了如下代码: typedef boost::function<void(BaseCharacter*, int oldvalue, int newvalue)> StatChangeFunction; 在我的角色课上 std::map<std::string, StatChangeFunction> StatChangeEventHandlers; 每当角色的状态更改时,我都会迭代并调用地图上的每个StatChangeFunction。虽然有效,但我担心这是做事的不好方法。 3-图形 这是大事。它与我正在使用的图形库无关,但更多是概念上的。在C#中,我将图形与很多类结合在一起,我知道这是一个糟糕的主意。这次我想做到这一点,所以尝试了另一种方法。 为了实现我的图形,我将游戏中与图形相关的所有图形想象为一系列屏幕。即有一个标题屏幕,一个角色状态屏幕,一个地图屏幕,一个清单屏幕,一个战斗屏幕,一个战斗GUI屏幕,基本上,我可以根据需要将这些屏幕彼此叠加以创建游戏图形。无论活动屏幕是什么,都拥有游戏输入。 我设计了一个屏幕管理器,可以根据用户输入推送和弹出屏幕。 例如,如果您在地图屏幕上(平铺地图的输入处理程序/可视化器)并按下了“开始”按钮,则会向屏幕管理器发出呼叫,将主菜单屏幕推到地图屏幕上并标记地图屏幕无法绘制/更新。播放器将在菜单中导航,这将酌情向屏幕管理器发出更多命令,以将新屏幕推送到屏幕堆栈上,然后在用户更改屏幕/取消按钮时弹出它们。最后,当播放器退出主菜单时,我将其弹出并返回到地图屏幕,将其标记为要绘制/更新并从那里去。 战斗画面会更加复杂。我将有一个屏幕作为背景,一个屏幕使战斗中的每个参加者形象化,以及一个屏幕来使战斗的UI形象化。UI将挂接到角色事件中,并使用这些事件来确定何时更新/重绘UI组件。最后,每一次具有可用动画脚本的攻击都将在弹出屏幕堆栈之前调用一个附加层来对其自身进行动画处理。在这种情况下,每一层都始终标记为可绘制和可更新,并且我得到了一堆处理我的战斗图形的屏幕。 尽管我还无法使屏幕管理器正常工作,但我认为可以花一些时间。我的问题是,这是否完全值得?如果这是一个糟糕的设计,我想在投入太多时间制作我需要的所有屏幕之前先了解一下。您如何为游戏建立图形?
16 c++  architecture  rpg 

3
C ++中的有限状态机
因此,我已经阅读了很多有关使用FSM进行游戏状态管理的知识,例如FSM是什么,以及使用堆栈或状态集构建状态。我经历了所有这些。但是,我一直坚持为此目的编写一个经过精心设计的FSM 实际实现。具体而言,一个人如何干净地解决状态之间的转换问题(一个状态应该如何使用其他状态的数据),等等。有没有人有使用C ++设计或编写实现的技巧,或者还有更好的代码示例?

4
Singletons / Globals的替代品
我已经听过无数次有关Singletons /全局变量的陷阱的信息,而且我理解为什么它们如此频繁地皱眉。 我不明白什么是优雅的,非混乱的选择。似乎使用Singletons / globals的替代方法总是涉及通过引擎对象向下传递一百万个级别的对象,直到它们到达需要它们的对象为止。 例如,在我的游戏中,我会在游戏启动时预加载一些资产。直到玩家在主菜单中导航并进入游戏时,这些资产才被使用。我是否应该将这些数据从Game对象传递到ScreenManager对象(尽管实际上只有一个Screen关心该数据),然后再传递给适当的Screen对象以及其他任何地方? 似乎我正在交换全局状态数据以进行混乱的依赖注入,将数据传递给什至不关心数据的对象,除非是将其传递给子对象。 这是Singleton会是一件好事的情况,还是我缺少一些优雅的解决方案?

6
电子游戏如何在屏幕外存储信息?
我正在尝试从零开始制作视频游戏,但是我对此确实很陌生,并且一直遇到基本问题。最重要的是,视频游戏如何存储屏幕外信息?我的意思是,程序如何知道接下来要在屏幕上显示什么?甚至,如果播放器更改了环境,下次将其加载到屏幕上时,该更改如何保留? 例如,在“新超级马里奥兄弟”中,如果您打了?阻止,然后离开屏幕,然后返回,它仍然保持点击状态。如何保存此信息,然后在玩家下次加载该块时执行该信息?为什么不重置呢?

3
通过版本控制,将游戏引擎与类似游戏中的游戏代码分开
我有一个完成的游戏,想要在其他版本中拒绝。这些游戏将是类似的游戏,或多或少具有相同的设计,但并非总是如此,基本上情况可能会发生变化,有时会有所变化,有时会有所变化。 我希望将核心代码与游戏分开进行版本控制,以便如果说我修复了游戏A中发现的错误,则该修复将出现在游戏B中。 我正在尝试找到最好的方法来管理它。我最初的想法是这样的: 创建一个engine模块/文件夹/所有内容,其中包含可以概括的所有内容,并且与游戏的其余部分100%独立。这将包括一些代码,但也包括游戏之间共享的通用资产。 将此引擎放在自己的git存储库中,该存储库将作为一个git submodule 我苦苦挣扎的部分是如何管理其余代码。假设您有自己的菜单场景,此代码是特定于游戏的,但大多数代码也往往是通用的,可以在其他游戏中重用。我不能将其放在中engine,但是为每个游戏重新编码都效率很低。 也许使用某种git分支变量可以有效地解决这一问题,但我不认为这是最好的方法。 任何人都有一些想法,经验要分享或与此有关的任何事情?

1
如何从实体组件系统游戏引擎中的cpu缓存中受益?
我经常阅读ECS游戏引擎文档,这是明智使用cpu缓存的良好架构。 但是我不知道如何从cpu缓存中受益。 如果将组件保存在连续内存中的数组(或池)中,则只有在顺序读取组件的情况下,才是使用cpu缓存BUT的好方法。 当我们使用系统时,它们需要实体列表,这些列表是具有特定类型组件的实体列表。 但是这些列表以随机的方式而不是顺序地提供了组件。 那么如何设计ECS以最大化缓存命中率呢? 编辑: 例如,物理系统需要具有RigidBody和Transform组件的实体的实体列表(有一个RigidBody池和一个Transform组件池)。 因此,其更新实体的循环将如下所示: for (Entity eid in entitiesList) { // Get rigid body component RigidBody *rigidBody = entityManager.getComponentFromEntity<RigidBody>(eid); // Get transform component Transform *transform = entityManager.getComponentFromEntity<Transform>(eid); // Do something with rigid body and transform component } 问题在于,entity1的RigidBody组件可以在其池的索引2处,而entity1的Tranform组件在其池的索引0处(因为某些实体可以具有某些组件,而其他组件不能具有其他组件,并且是因为添加/删除了实体/组件)。 因此,即使组件在内存中是连续的,也会随机读取它们,因此它将有更多的缓存未命中,不是吗? 除非有一种方法可以预取循环中的下一个组件?

6
游戏组件,游戏管理器和对象属性
我正在努力使基于组件的实体设计成为现实。 我的第一步是创建可以添加到对象中的各种组件。对于每种组件类型,我都有一个管理器,该管理器将调用每个组件的更新功能,并根据需要传入诸如键盘状态之类的信息。 我要做的下一件事是删除对象,并让每个组件都带有一个ID。因此,对象是由具有相同ID的组件定义的。 现在,我在想我不需要所有组件的管理器,例如,我有一个SizeComponent,它只是一个Size属性)。结果,SizeComponent它没有更新方法,并且管理器的更新方法不执行任何操作。 我的第一个想法是要有一个ObjectProperty组件可以查询的类,而不是将它们作为组件的属性。因此,一个对象有许多ObjectProperty和ObjectComponent。组件将具有查询对象属性的更新逻辑。管理者将管理调用组件的更新方法。 在我看来,这似乎是工程过度,但我认为我无法摆脱这些组件,因为我需要让管理人员知道哪些对象需要哪种组件逻辑才能运行(否则,我只会删除该组件)并将其更新逻辑推入管理器)。 难道这(有ObjectProperty,ObjectComponent和ComponentManager班)在工程? 有什么好的选择?

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.