Questions tagged «architecture»

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

2
我应该使用多少个OpenGL程序来渲染多个对象?
我的场景中有多个对象。(假设3个立方体,1个圆柱体,8个球体。)我假设我应该为每个立方体创建一个顶点着色器。我应该有几个程序? 备择方案: 每个对象一个程序 一个程序用于所有立方体,另一个程序用于所有球体(假定它们使用相同的着色器) 一个适用于一切的大型程序 正确的方法是什么?

4
如何制作没有OOP的游戏?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 6年前关闭。 我目前正在研究游戏开发和练习制作游戏。 我在游戏中经常使用OOP。例如,发射的每枚导弹都是一个Missile对象的实例,并添加到Missile对象列表中。游戏中的每个坦克都是一个Tank物体。等等。 该程序的整个设计都基于此。例如,拥有一个Missile物体列表可以使我每一帧移动导弹,牵引导弹等。而Tank每个坦克都有一个对象实例可以让我检查每个坦克是否与某些物体发生碰撞等。 我很难想象如何用非OO语言编写游戏(比《吃豆人》更复杂)。(当然也要尊重非OO程序员)。不仅要花费多长时间,而且主要要以这种方式设计游戏。 我无法想象不使用面向对象的程序设计游戏,因为我对如何设计游戏程序的全部理解是基于OOP的。 我想问一问:今天,有没有像我上面所描述的那样没有使用OOP编程的游戏?是否有没有将OOP用作开发过程中主要因素的“专业”游戏? 如果是这样,您能否给我一个想法,例如,在没有OOP的情况下,如何实现坦克与N枚导弹之间的碰撞检测?

3
我应该如何用代码为经济型游戏建模?
我想创建一个基于古代文明的经济游戏。我不确定如何设计。如果我正在开发一个较小的游戏,例如《太空侵略者》的副本,那么构造这样的游戏就不会有问题: 主控制类 图形类 玩家等级 敌人阶级 我不知道如何为大型项目(例如经济游戏)做到这一点。我是否创建一个包含许多城镇的国家/地区类别?城镇是否包含很多建筑类别,大多数包含人口类别?我是否会开设可供玩家绕行的寻径课程?

3
如何在实体组件系统中避免“斑点系统”?
目前,我面临以下问题: 我正在尝试通过使用实体组件系统(ECS)来编写pong克隆。我自己写了“框架”。因此,有一个类管理具有所有组件的实体。然后是组件类本身。最后是我的系统,它仅获取具有系统所需组件的所有实体。 因此,例如,我的运动系统会查找具有位置分量和运动分量的所有实体。位置分量仅保持位置,而运动分量则保持速度。 但是实际的问题是我的碰撞系统。这个类就像一个逻辑blob。我在这堂课上有很多特殊情况。 例如:我的桨可能会与边框碰撞。如果发生这种情况,其速度将设置为零。我的球也可能与边界碰撞。但是在这种情况下,它的速度仅反映在边界的法线上,因此可以反映出来。为此,我给球添加了一个额外的物理组件,它告诉:“嘿,这件事并没有停止,它反映了这一点。” 因此,实际上,物理组件没有实际数据。它是一个空类,仅用于告诉系统对象是否反射或停止。 然后是这样:当球与球拍或边框碰撞时,我想渲染一些粒子。因此,我认为球必须具有另一个组件,该组件告诉碰撞系统在碰撞时创建粒子。 然后,我想要一个可以与桨碰撞但不能与边界碰撞的力量提升器。如果发生这种情况,通电将消失。因此,我需要更多的情况和组件(以告诉系统某些实体只能与某些其他实体发生碰撞,即使某些其他实体确实可以发生碰撞,机器人也不能与所有实体发生碰撞,此外,碰撞系统还必须对这些实体施加动力桨等,等等。)。 我看到实体组件系统是一件好事,因为它很灵活,并且继承没有问题。但是我现在完全陷入困境。 我觉得太复杂了吗?我该如何应对? 当然,我必须创建实际上负责“碰撞后”的系统,因此碰撞系统只会告诉“是的,我们在最后一帧发生碰撞”,然后有许多“碰撞后”系统所有这些都需要不同的(组合)组件,然后更改组件。例如,将有一个运动后碰撞系统,该系统停止发生碰撞时必须停止的东西。然后是一个反映事物等的物理后碰撞系统。 但这似乎也不适合我,因为例如: 我的运动碰撞后系统将需要具有位置分量,运动分量和碰撞分量的实体。然后,它将实体的速度设置为零。 物理后碰撞系统将需要具有位置成分,运动成分,碰撞成分和物理成分的实体。然后它将反映速度矢量。 问题很明显:运动后碰撞需要实体,这些实体是物理后碰撞系统中实体的子集。因此,两个碰撞后系统将对相同的数据进行操作,其结果是:尽管实体具有物理成分,但碰撞后速度为零。 这些问题一般如何在实体组件系统中解决?这些问题甚至很常见吗?如果是,那么应该怎么做以及如何做呢?

3
最佳的点对点游戏架构
考虑一种设置,其中游戏客户端: 拥有非常小的计算资源(移动设备,智能手机) 都连接到通用路由器(LAN,热点等) 用户想在没有外部服务器的情况下玩多人游戏。 一种解决方案是在一台电话上托管一台权威服务器,在这种情况下,它也是一个客户端。考虑到第1点,此解决方案是不可接受的,因为电话的计算资源不足。 因此,我想设计一个点对点架构,该架构将在客户端之间分配游戏的模拟负载。由于第2点,系统的优化不必太复杂;延迟将非常低。每个客户都可以是有关他本人及其周围环境的权威数据来源(例如项目符号)。 设计这种架构的最佳方法是什么?是否存在此类LAN级别对等协议的任何已知示例? 笔记: 这里解决了一些问题,但是那里列出的概念对我来说太笼统了。 安全 我知道没有一台权威服务器是一个安全问题,但是在这种情况下这无关紧要,因为我愿意信任客户端。 编辑: 我忘了提:这将是一个节奏相当快的游戏(射击游戏)。 另外,我已经在Gaffer on Games上阅读了有关网络体系结构的文章。

2
将渲染逻辑移出GameObject类的策略
制作游戏时,您通常会创建以下所有实体继承的游戏对象: public class GameObject{ abstract void Update(...); abstract void Draw(...); } 因此,在更新循环中,您遍历所有游戏对象,并给它们提供更改状态的机会,然后在下一个绘制循环中,您遍历所有游戏对象,并给它们提供绘制自己的机会。 尽管这在带有简单前向渲染器的简单游戏中效果很好,但通常会导致一些巨大的游戏对象需要存储其模型,多种纹理以及最糟糕的胖子绘制方法,从而在游戏对象之间产生紧密的联系,当前的渲染策略以及任何与渲染相关的类。 如果要将渲染策略从向前更改为推迟,则必须更新很多游戏对象。而且,我制作的游戏对象没有尽可能地可重用。当然,继承和/或组合可以帮助我应对代码重复并使更改实现变得容易一些,但仍然感到缺乏。 也许更好的方法是从GameObject类中完全删除Draw方法并创建一个Renderer类。GameObject仍将需要包含一些有关其视觉效果的数据,例如用来表示它的模型以及应该在模型上绘制哪些纹理,但是如何完成将留给渲染器。但是,渲染时通常会遇到很多边界情况,因此尽管这将消除从GameObject到Renderer的紧密耦合,但Renderer仍必须全部了解所有会使它发胖的游戏对象,所有人都知道并紧密耦合。这将违反许多良好做法。也许面向数据的设计可以解决问题。游戏对象肯定是数据,但是渲染器将如何驱动呢?我不确定。 所以我很茫然,无法想到一个好的解决方案。我尝试使用MVC的原理,过去我对如何在游戏中使用它有一些想法,但是最近它似乎并不像我想的那样适用。我很想知道大家如何解决这个问题。 无论如何,让我们回顾一下,我对如何实现以下设计目标很感兴趣。 游戏对象中没有渲染逻辑 游戏对象与渲染引擎之间的松耦合 没有所有知道的渲染器 最好在渲染引擎之间进行运行时切换 理想的项目设置是一个不需要相互引用的单独的“游戏逻辑”和渲染逻辑项目。 当我听到约翰·卡马克在推特上说他的系统如此灵活,他可以在运行时更换渲染引擎,甚至可以告诉他的系统同时使用渲染器(软件渲染器和硬件加速渲染器)时,这种思想训练就开始了。同时他可以检查差异。到目前为止,我编写的系统还没有这么灵活

1
多人空间分割的有效解决方案?
这个问题有点棘手,但我会尽力弄清楚。 可以说我正在构建一个在线游戏(不是MMO规模),但是通过权威的服务器方法可以支持尽可能多的玩家。我想真正的大与世界很多 AI模拟敌人。 我知道一些通过细分空间而不处理不需要处理的东西来节省服务器CPU的策略。我已经按地区划分了世界,这需要加载时间和较小的过渡时间,我认为这对于保持本地(单独或什至有几个朋友)玩游戏时的游戏质量至关重要。我不希望球员出现在一个或两个以上的地区。 问题在于,一个区域可能会变得很大,并且一次模拟了很多NPC。在不影响玩家体验的情况下如何处理?表格中没有像每个区域一台服务器之类的方法。 我主要是在寻找能够容纳成群的敌人,甚至是和平的NPC的数据结构。要最终确定问题,请注意,由于存在车辆,因此车辆在某个区域内的行驶速度相当快,会影响“何时”驶向剔除区域。

3
发生某些事情时播放声音的好方法?听起来如何?
因此,我一直在考虑我的课程在很多时候会变得多么单板。例如,在Character类的Jump方法中,可以引用声音效果对象并进行播放。就其本身而言,这很好,但是当考虑到物理,动画,碰撞等因素时,Jump方法将变得非常庞大,并且Character该类对许多不同的事物具有很多依赖性。不过,这可能很好。但是,如果我们不再希望角色跳跃时播放声音该怎么办?现在,我们必须在混乱的代码中找到特定的代码行,Jump并将其注释掉。 所以..我在想.. 相反,如果有某种AudioSystem类,而它所做的只是订阅它对其他类感兴趣的随机事件,那该怎么办?例如,Character类可能有一个Jumped事件(我想也是静态的),该事件Character在方法的类内引发。然后,Character班级对角色跳跃时播放的声音效果一无所知。那AudioSystem将是一个巨大的类,程序员可以撤退以通过使用静态事件将声音效果与游戏中发生的某些事件联系起来。然后,如果它得到太大,它可以在像子分离EffectsAudioSystem,BackgroundAudioSystem,AmbientAudioSystem,等等。 然后,在游戏的选项中,可以有一个复选框来启用或禁用这些声音,而要做的只是用一个简单的单个布尔标志禁用一个系统。系统的概念也可以扩展到物理,动画等方面,以至于玩家行为所导致的大多数游戏响应都通过这些精心设计和分离的系统进行连接。 好的,我的问题可能有点含糊,但是这种声音听起来如何?我真的从未听说过有关这种系统的很多讨论。目前为止,这一切都在我的脑海中进行,到目前为止,尚未进行任何编码,因此,这也许是“理论上不错,但实际上却不好”的交易之一。这种系统是否可以在更大的游戏上使用,还是最终会崩溃,甚至比原始系统更像是意大利面条般的混乱?
10 c#  architecture  sound 

2
XNA游戏服务和荣耀的全局变量之间有什么区别?
该Microsoft.Xna.Framework.Game班有一个服务属性,它允许程序员通过提供一流的类型和类Add方法的一个实例,一个服务添加到他们的游戏。 现在,不必将传递AudioComponent给需要它的所有类和方法,而只需传递Game实例并查找服务即可。(服务定位器) 现在,由于游戏具有许多服务(GraphicsDevice,SceneGraph,AudioComponent,EffectsManager等),因此您现在基本上将Game传递给了一切。 那么,为什么不只将这些实例设置为Singleton呢?好吧,因为单例很糟糕,因为它们具有全局状态,可以防止测试,并使您的设计更加脆弱。同样,服务定位器被视为对许多人的反模式,因为您传递的是服务定位器(游戏),而不是将依赖项传递给对象,该服务定位器将此类与其他服务耦合在一起。 那么,为什么在XNA和游戏开发中推荐“服务”呢?是因为游戏不同于常规程序,并且与它们的组成部分高度交织在一起,并且必须通过类的功能所必需的每个组成部分都非常繁琐吗?游戏服务是游戏设计中必不可少的邪恶吗?是否有其他选择不涉及冗长的参数列表和耦合?
10 xna  c#  architecture 

3
多久更新一次有关世界的游戏客户端?
使用socket.io,我的通讯与其他MMORPG相似,与消息保持稳定连接。 到目前为止,在我的设计中,客户端随每个更新帧发送播放器的位置和动画帧。服务器收到该消息后,会将其广播给所有客户端,然后客户端将相应地移动图形。 例如,每1/10秒一次“收集”并广播它们是一个更好的主意吗? 另外,客户是否应该在出现后立即发送许多不同的消息(获得的经验值,单击的项目),或者仅收集一条消息?第一个将更容易实现。

1
要场景图还是不场景图?
我一直在努力决定是否在游戏中实现场景图。我有一些使用这种工具的用例,但我无法获得一些实现细节。 背景知识:我正在写针对移动平台(主要是Android)的太空射击游戏,我的代码几乎完全是C ++。我没有使用任何中间件;渲染引擎和物理引擎特别是我自己的作品。我的物理引擎会根据力和脉冲来更新对象的位置。到目前为止,我还没有动画系统,但是可能会在某些时候访问它(可能与本次讨论无关)。 首先,我将描述一个很好的用例。我想拥有一个由几个独立的零件组成的老板,每个零件都可以独立损坏/破坏。例如,我可能有一个老板的胳膊可以独立于其他老板实体而受到伤害。当手臂被销毁时,位于凸台肩部的火焰微粒效应可能表明手臂已被销毁。 实际上,我决定尝试在物理引擎中解决具有约束的此类问题,以将此类复合对象保持在一起。一个这样的约束条件提供了0个自由度,并且本质上是一个变换矩阵。这实际上是在试图解决一个最终使我脱离场景图的问题的尝试,如下所述。 我不使用场景图的主要原因是因为我找不到在物理世界和渲染场景中都保留嵌套对象(从其父级继承了转换的对象)的有效方法。物理世界需要对象位于世界空间(或至少相同的空间)中,而渲染场景需要对象位于父空间中。跟踪两个空间中的位置可能会有所帮助(并且是不可避免的),但会引起自身的担忧,其中至少与性能有关。 但是,考虑到上述用例,我认为能够在父空间中“工作”将变得非常重要,而试图通过约束来迫使我的物理引擎保持这些关系将变得成问题。 给定上述用例和困境,我是否应该使用图结构将转换从一个对象传递到另一个对象?如果是这样,我的物理引擎应该如何计算新位置并针对不同空间中的对象执行相交测试?

2
最终基于网络的游戏引擎应该作为网络服务启动吗?
我最近决定开始为纸牌游戏编写引擎。我不是“纸牌”游戏玩家,但有一位朋友向我介绍了这款游戏(这是丹麦游戏的一个转折),我坠入了爱河。 我想在3个方面开发游戏: 基本引擎,处理卡/牌组/游戏状态等 用户界面(以移动/桌面Web应用程序的形式。) 具有各种策略/困难等的人工智能 在我看来,这些都是截然不同的项目……从长远来看,我很努力地看到它们如何融合在一起。一开始,我什至不希望能够使用引擎“玩”游戏。发动机将主要通过单元测试进行测试。在客户端存在之前,不会开始播放测试。因此,这里存在一种客户-服务器关系。 发动机是很大的难题。我想知道的是:您将如何为该引擎开发“公共API”? 我当时以为引擎可能是一个非常基本的Web服务,可以通过向RESTful API的查询返回其状态,但是我担心将引擎本身开发为Web应用程序可能会导致糟糕的编程决策。(例如,如果我选择了MVC微框架,那么该API并不会真正拥有视图...它只是通过JSON返回序列化的对象,或者类似的东西。将MVC用于类似这样的服务是否不好?这个? ) 我的另一个想法是,该引擎将只是一个控制台应用程序,稍后我将编写某种形式的桥梁,以在其与Web应用程序之间传递数据。(桥接实际上可以是任何东西。我的意思是,Web服务器和游戏引擎都可以在IRC服务器中闲置并在通道中共享其状态。) 您将采用哪种方法(作为Web服务开发,或者作为独立应用程序开发并在以后进行桥接),为什么? 谢谢,罗比。 编辑:所以我想这属于游戏开发。为了澄清,我将编写一个纸牌游戏引擎。我正在尝试找出公开引擎API的最佳方法,以便将来可以与Web客户端和AI客户端集成。 我什至在这里都没有帐号,所以您好:)

6
在XNA中将Game1静态化是一个坏主意吗?
将我的Game1课程设为静态真的不是一个好主意吗?就像目前在我的Game1课堂上一样,我有一个名为的类TileHandler,负责处理与我当前的那组瓷砖有关的AnimalHandler所有事情,并且处理所有我的动物(令人惊讶地)。 现在,如果我AnimalHandler要检查瓷砖是否TileHandler从那时起便是可步行的,这会引起问题,或者我必须将可步行瓷砖的列表传递到中AnimalHandler,而不希望这样做。 更简单的方法是将其设置为Game1静态,然后AnimalHandler直接运行Game1._tileHandler.WalkableTile(position)。 现在,我看不到有任何立即出错的问题或会导致任何问题的任何事情,但是我只是刚刚开始使用静态类,所以,有什么知识渊博的人是否会看到任何大的原因来说明这是一个坏主意?
10 xna  c#  architecture 

5
如何处理网码?
我对评估网络代码可以“融入”游戏引擎的不同方式感兴趣。我现在正在设计一个多人游戏,到目前为止,我已经确定(至少)需要一个单独的线程来处理网络套接字,这不同于处理图形循环和脚本的引擎其余部分。 我确实有一种使网络游戏完全为单线程的潜在方法,那就是在使用非阻塞套接字渲染每一帧后让它检查网络。但是,这显然不是最佳方法,因为渲染帧所花费的时间增加了网络延迟:通过网络到达的消息必须等待,直到当前帧渲染(和游戏逻辑)完成为止。但是,至少以这种方式,游戏玩法仍将或多或少保持平稳。 拥有独立的网络线程可以使游戏完全响应网络,例如,它可以在收到来自服务器的状态更新后立即发送回ACK数据包。但是我对在游戏代码和网络代码之间进行通信的最佳方式有些困惑。网络线程会将接收到的数据包推送到队列中,并且游戏线程将在其循环期间的适当时间从队列中读取数据,因此我们没有摆脱这种长达一帧的延迟。 另外,似乎我希望处理数据包发送的线程与检查管道中的数据包的线程是分开的,因为它不能在发送过程中将其发送出去。检查是否有传入消息。我在考虑select或类似功能。 我想我的问题是,设计具有最佳网络响应能力的最佳方法是什么?显然,客户端应该将用户输入尽快发送到服务器,这样我就可以在事件处理循环之后立即在游戏循环内部发送净发送代码。这有意义吗?

3
为多人游戏实施配对和社区系统[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使其成为Game Development Stack Exchange 的主题。 2年前关闭。 如今,游戏通常具有带有聊天频道的多人门户和针对游戏多人方面的匹配系统。 例如:battle.net,魔术聚会在线聊天室,光环等。 现在,对于我们其余的独立游戏玩家来说,他们可能无法花费大量的开发精力从头开始创建这些后端,那么我们有哪些选择呢? 我在考虑使用IRC作为系统主干的思路。从那里开始,实现“社区”方面,玩家跟踪,游戏跟踪以及配对。这似乎是旧的Battle.net(育成战争时代)过去的样子。 问题是,这容易做到吗?运行irc服务器需要些什么,我想这还需要编写IRC客户端(这几天似乎做得很多?)? 如果还有其他方法(例如,针对此类内容的开放框架),也让我们听听他们的看法。

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.