Questions tagged «multithreading»

多线程允许在共享相同资源但可以独立执行的单个进程的上下文中存在多个线程。

8
我应该有多少个线程,目的是什么?
我应该为渲染和逻辑设置单独的线程,还是更多? 我知道由于数据同步(更不用说任何互斥锁)导致的巨大性能下降。 我一直在考虑将其发挥到极致,并为每个可以想到的子系统做线程。但是我担心这也会减慢速度。(例如,将输入线程与渲染或游戏逻辑线程分开是明智的做法吗?)所需的数据同步是否会使它毫无意义甚至变得更慢?



5
游戏中的演员应该负责吸引自己吗?
我对游戏开发非常陌生,但对编程却不是。 我(再次)使用JavaScript的canvas元素在玩Pong类型的游戏。 我创建了一个Paddle具有以下属性的对象... width height x y colour 我也有一个Pong具有诸如...的属性的对象 width height backgroundColour draw()。 该draw()方法当前正在重置canvas,这就是出现问题的地方。 如果Paddle对象具有draw()负责其绘制的方法,或者draw()该Pong对象的负责负责其演员的绘制(我认为这是正确的术语,如果我不正确,请更正我)。 我发现在Paddle实例化两个对象Player和时,绘制自身会很有利Enemy。如果在没有Pong的draw(),我需要两次写类似的代码。 最佳做法是什么? 谢谢。


8
游戏如何一次处理所有角色?
这个问题只是为了获得有关游戏如何一次处理多个角色的知识。我是游戏新手,所以请您原谅。 例 我正在创建一个塔防游戏,该游戏中有15个塔槽,可在其中建造塔,每个塔均以一定速率发射弹丸。假设每个塔每秒钟创造出2枚弹丸,并且有敌人在战场上行进,比如说70(每个都有10种属性,例如HP,法力等,随着它们在战场上移动而变化战场)。 摘要 塔数 = 每秒每座塔创建的 15个弹丸 = 2 每秒创建的弹丸总数 = 战场计数中的 30个单位 = 70 现在,游戏是否通过在100个不同的线程(对于PC来说太多了)或1个移动所有线程,降低其值的线程上处理它们,来处理这30个弹丸和70个单位?(这有点慢, 我认为)? 我对此一无所知,所以有人可以指导我如何解决吗?

2
Android游戏应使用多少个线程?
至少,一个OpenGL Android游戏具有一个UI线程和一个由创建的Renderer线程GLSurfaceView。 Renderer.onDrawFrame()应该做最少的工作以获得最佳的FPS。物理,AI等不需要运行每一帧,因此我们可以将它们放在另一个线程中。现在我们有: 渲染器线程-更新动画并绘制多边形 游戏线程-逻辑与周期性物理学,AI等更新 UI线程-仅适用于Android UI交互 由于您永远不想阻塞UI线程,因此我为游戏逻辑运行了一个线程。也许那不是必需的?有没有理由在渲染器线程中运行游戏逻辑?

7
多线程2D重力计算
我正在开发一个太空探索游戏,目前我已经开始研究重力(在XNA的C#中)。 重力仍然需要调整,但是在我能够做到这一点之前,我需要在物理计算中解决一些性能问题。 这使用了100个对象,通常不进行物理计算就可以渲染其中的1000个对象,而FPS则超过300 FPS(这是我的FPS上限),但是超过10个左右的对象会将游戏(及其运行的单线程)带入在进行物理计算时会屈膝。 我检查了我的线程使用情况,发现第一个线程正在杀死所有工作,因此我认为只需要对另一个线程进行物理计算即可。但是,当我尝试在另一个线程上运行Gravity.cs类的Update方法时,即使Gravity的Update方法中没有任何内容,游戏仍然会降低到2 FPS。 Gravity.cs public void Update() { foreach (KeyValuePair<string, Entity> e in entityEngine.Entities) { Vector2 Force = new Vector2(); foreach (KeyValuePair<string, Entity> e2 in entityEngine.Entities) { if (e2.Key != e.Key) { float distance = Vector2.Distance(entityEngine.Entities[e.Key].Position, entityEngine.Entities[e2.Key].Position); if (distance > (entityEngine.Entities[e.Key].Texture.Width / 2 + entityEngine.Entities[e2.Key].Texture.Width / 2)) …

3
使用100%CPU的游戏正常吗?
我刚刚在游戏引擎中实现了多线程输入处理,其中轮询操作系统以从中收集输入信息并对其打上时间戳的代码位于单独的线程中,而主线程中的每一帧我都将收集到的输入吃掉逻辑游戏时间。一切正常,但是此设置使用了100%的CPU。我有两个核心,并且在运行我的游戏时会达到100%。 我已经与其他游戏进行了核对,以查看它们是否也这样做。例如,Skyrim和Doom 3看起来不错,CPU刚好超过60%。 使用多线程输入消耗100%CPU的游戏是否可以接受?如果没有,这种游戏通过输入线程降低cpu使用率的一些技巧是什么?

3
多平台多线程:真正的挑战是什么?
尽管像SDL这样的库提供了用于线程的跨平台包装器API,但我认为天真地假设这直接导致了在非常不同的平台(台式机/移动设备)上轻松开发游戏的想法。 考虑以下因素,解决这种问题的最佳方法是什么(考虑到任何跨平台线程API): 不同数量的核心 每个内核的处理能力大不相同 总体上不同的系统架构,例如 缓存,RAM和I / O访问的不同延迟 我觉得这样做的唯一方法是评估您打算支持的每个设备可以运行多少个线程,并找出最低的公分母。但是,这仍然使我对可用的处理吞吐量总量一无所知。我是否认为有效地做到这一点的唯一方法是在整个开发过程中积极开发我打算支持的最低规格的移动设备?-即最低公分母?这大概足够了吗?还是比这还更多? 编辑:请其他人对此提供进一步的经验,因为我还没有完全回答我的问题。

6
用于插值和线程处理的数据结构?
我最近一直在处理游戏中的一些帧速率抖动问题,看来最好的解决方案是Glenn Fiedler(游戏开发人员)在经典的“ 修复您的时间步伐”中提出的解决方案!文章。 现在-我已经在使用固定的时间步进行更新。问题是我没有进行建议的插值渲染。结果是,如果渲染速率与更新速率不匹配,我将获得双倍或跳过的帧。这些可以在视觉上引起注意。 因此,我想在游戏中添加插值法-我很想知道其他人如何构建数据和代码来支持这一点。 显然,我将需要存储(在何处/如何?)与渲染器相关的游戏状态信息的两个副本,以便可以在它们之间进行插值。 另外-这似乎是添加线程的好地方。我想像一个更新线程可以在游戏状态的第三个副本上工作,而将其他两个副本保留为渲染线程的只读状态。(这是一个好主意吗?) 看来,有游戏的状态的两个或三个版本可能会引入性能和- 远更重要的是-可靠性和开发人员的生产力问题,相比于仅具有单一版本。因此,我对缓解这些问题的方法特别感兴趣。 我认为应该特别注意的是如何处理游戏状态中添加和删除对象的问题。 最后,似乎某种状态不是直接需要渲染的,还是要跟踪不同版本的状态太难了(例如,存储单个状态的第三方物理引擎)-因此,我想知道如何人们已经在这样的系统中处理了这类数据。

4
如何减少多线程引擎中线程之间传递消息的麻烦?
我目前正在使用的C ++引擎分为几个大线程-生成(用于创建程序内容),游戏性(用于AI,脚本,模拟),物理和渲染。 线程之间通过小消息对象相互通信,这些消息对象在线程之间传递。在执行步进操作之前,一个线程会处理其所有传入消息-更新以进行转换,添加和删除对象等。有时,一个线程(Generation)会创建某种东西(Art)并将其传递给另一个线程(Rendering)以实现永久所有权。 在此过程的早期,我注意到了两点: 消息传递系统很麻烦。创建新的消息类型意味着要对基础Message类进行子类化,为其类型创建一个新的枚举,并编写有关线程应如何解释新消息类型的逻辑。这是开发的重灾区,并且容易出现拼写错误。(Sidenote-从事此工作使我很欣赏动态语言的出色表现!) 有一个更好的方法吗?我是否应该使用boost :: bind之类的工具使之自动运行?我担心如果这样做,我会失去说话的能力,无法根据类型对消息进行排序。不确定是否需要这种管理。 第一点很重要,因为这些线程进行了大量通信。创建和传递消息是使事情发生的重要部分。我想简化该系统,但也欢迎其他可能同样有用的范例。我应该考虑使用其他不同的多线程设计来简化此过程吗? 例如,有些资源很少被写入,但是经常从多个线程中读取。我是否应该对所有线程都可以访问的共享数据(受互斥锁保护)持开放态度? 这是我第一次从头开始考虑多线程设计。在这个早期阶段,我实际上认为进展非常顺利(正在考虑),但我担心扩展以及实现新内容的效率问题。

5
游戏逻辑线程与渲染线程之间的同步
一个游戏逻辑和渲染如何分开?我知道这里似乎已经有问题要问,但是答案对我来说并不令人满意。 据我所知,将它们分成不同的线程的目的是使游戏逻辑可以立即开始为下一个滴答运行,而不必等待下一个vsync,在此,渲染最终从swapbuffer调用返回而一直处于阻塞状态。 但是,具体来说,使用什么数据结构来防止游戏逻辑线程和渲染线程之间的竞争状况。大概渲染线程需要访问各种变量来确定要绘制的内容,但是游戏逻辑可以更新这些相同的变量。 是否有实际的标准技术来处理此问题。就像在每次执行游戏逻辑后复制渲染线程所需的数据一样。无论采用什么解决方案,同步的开销还是比仅运行单线程的所有开销都要少?

2
场景之间的平滑加载屏幕
我创建了一个加载屏幕,以在下一个场景加载时显示加载动画。我异步加载下一个场景: yield return SceneManager.LoadSceneAsync(scene,LoadSceneMode.Additive); 并且也设置了Application.backgroundLoadingPriority = ThreadPriority.Low;,但是其行为仍然与常规级别加载相同。 我想念什么吗? 预期的行为: 退出关卡,然后淡出。 出现载入画面。 加载完成后,淡出加载屏幕。 淡入下一场景。 怎么了: 退出关卡,然后淡出。 出现载入画面,冻结 突然,新景象渐渐消失了。 一旦开始加载,游戏就会像常规的场景加载一样疯狂。 我读到您必须设置allowSceneActivation = false,因此您可以淡出加载屏幕,然后将其设置true为让unity完成加载,但这完全冻结了我的游戏,就像异步操作永远不会完成加载一样。

4
RTS游戏AI线程
我有一个从头开始制作实时策略游戏的项目。我仍处于早期计划阶段,但是我已经进行了一些编程以了解其机制。 我知道如何编程。我对如何构造游戏类和面向计算机玩家的基于规则的(状态机)AI也有很好的想法。 我想开发一种教义,它会赋予特定单位特定的行为(但可以同时在多个单位上使用),例如侦察兵,跟随任务路线,保持位置(攻击不速之客或退缩)等 该学说仅适用于单位,因此它将具有单位的观点,而对整个地图的状况并不了解。 计算机AI将分析整个可见图,并根据另一套规则决定分配哪个单元的学说。 我正在C#和OpenGL中执行此操作。 就目前而言,在我开始主要构想之前,我还没有太多东西在测试中。我有一个游戏循环,所有游戏处理(我将其依次称为更新运动,战斗,渲染等)将发生,如果发生Application.Idle事件,则经常调用该循环。 现在,我在想。由于游戏循环中有很多事情要处理,因此计算机AI和单位应该在该循环中选择其动作还是会太慢? 如果我希望所有事物都同时存在,是否应该为计算机AI创建单独的线程?甚至每个单元都有单独的线程? 我在多线程方面没有太多经验。最好的方法是什么?
14 c#  ai  multithreading 

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.