Questions tagged «multithreading»

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

2
尽管使用了Time.deltaTime,但移动似乎与帧速率有关。
我有以下代码来计算在Unity中移动游戏对象所需的转换LateUpdate。据我了解,我对的使用Time.deltaTime应使最终的翻译帧速率独立(请注意CollisionDetection.Move(),仅用于进行射线广播)。 public IMovementModel Move(IMovementModel model) { this.model = model; targetSpeed = (model.HorizontalInput + model.VerticalInput) * model.Speed; model.CurrentSpeed = accelerateSpeed(model.CurrentSpeed, targetSpeed, model.Accel); if (model.IsJumping) { model.AmountToMove = new Vector3(model.AmountToMove.x, model.AmountToMove.y); } else if (CollisionDetection.OnGround) { model.AmountToMove = new Vector3(model.AmountToMove.x, 0); } model.FlipAnim = flipAnimation(targetSpeed); // If we're ignoring gravity, then just …

5
精灵作为演员
我没有游戏开发方面的经验,但是是一名程序员。据我所知,在Scala语言中,您可以使用Actors进行可扩展的多任务处理,非常稳定。您甚至可以立即运行成千上万个它们,而不会出现问题。 所以我想,也许您可​​以将它们用作2D精灵的基类,以突破需要遍历所有精灵并移动它们的游戏循环事物。他们基本上会移动自己,受事件驱动。 这对游戏有意义吗?像这样多任务吗?毕竟,它将在JVM上运行,尽管如今这应该不成问题。 编辑: 摸索了一段时间之后,我注意到该想法只有一个真正的优势:多核支持。一个简单的游戏循环将仅在一个内核上运行,并将依次处理所有事情。 由于现代计算机,即使是现在的家用计算机,如今都内置了两个或多个内核,我认为让游戏程序员有效地使用其他内核是一个好主意。毕竟,我认为通常玩家只会在他的八核计算机上运行游戏,所以为什么不这样做呢。 我看到的另一个优点是,在Scala中,您可以拥有RemoteActors,可以用相同的方式来对待它,但可以在另一台计算机上运行。因此,这也许也可以简化网络游戏。 我打算尽快将其构建到我的Scala 2D引擎中。

1
单独线程中的场景图
我开发自己的游戏引擎是为了娱乐(但不是赢利)。我在一个线程中渲染,而我的场景图在另一个线程中更新(速度等)。当需要渲染时,渲染线程将可见节点添加到新的线性缓冲区中并遍历它们。 更详细地讲,我的场景图是三重缓冲的。我的场景图中的每个节点都有其相对和绝对转换矩阵(4x4)的三个副本。在任何给定时间,场景图线程都将写入一个副本,渲染器将读取一个副本,而第三个副本则存在,以便读取器或写入器可以继续移动到下一个,而无需等待另一个。这样可以防止在渲染时写东西,也不会渲染半更新的场景图。不知何故,我还获得了每个矩阵的第四份副本供用户使用,以免与更新线程冲突。通过避免始终保持同步,这似乎表现良好。 但是,这是一团糟。 这些是系统的最终目标: 渲染和场景图更新位于单独的线程中。 最小化这些线程必须等待的时间。 不要渲染已被更新线程中途更新的场景。如果相机快速移动并且有时是在更新之前或之后渲染的,则这一点尤其明显。 减少内存使用。我每个节点的矩阵太多。由于矩阵的浮点漂移增加,因此我也正在考虑移至矢量进行位置/旋转/缩放。 能够处理数万个节点。当前的系统可以做到这一点。 我也希望将来能结合Bullet(物理引擎)和网络,但我都没有考虑太多。 完成更好的场景图有哪些方法?

2
在单独的线程中更新和渲染
我正在创建一个简单的2D游戏引擎,我想在不同的线程中更新和渲染精灵,以了解其完成方式。 我需要同步更新线程和渲染线程。当前,我使用两个原子标志。工作流程如下所示: Thread 1 -------------------------- Thread 2 Update obj ------------------------ wait for swap Create queue ---------------------- render the queue Wait for render ------------------- notify render done Swap render queues ---------------- notify swap done 在此设置中,我将渲染线程的FPS限制为更新线程的FPS。此外,我sleep()经常将渲染和更新线程的FPS限制为60,因此这两个等待函数不会等待太多时间。 问题是: 平均CPU使用率约为0.1%。有时,在四核PC中,它会上升25%。这意味着一个线程正在等待另一个线程,因为wait函数是一个带有test and set函数的while循环,而while循环将使用您的所有CPU资源。 我的第一个问题是:是否有另一种方式同步两个线程?我注意到std::mutex::lock在等待锁定资源时不要使用CPU,因此它不是while循环。它是如何工作的?我无法使用,std::mutex因为我需要将它们锁定在一个线程中并在另一个线程中解锁。 另一个问题是;由于该程序始终以60 FPS的速度运行,为什么有时它的CPU使用率会跃升到25%,这意味着两个等待中的一个正在等待很多?(两个线程都限制为60fps,因此理想情况下它们不需要太多同步)。 编辑:感谢所有答复。首先,我想说的是,我不会在每个帧开始渲染新线程。我从一开始就开始了update和render循环。我认为多线程可以节省一些时间:我具有以下功能:FastAlg()和Alg()。Alg()既是我的Update obj又是render obj,而Fastalg()是我的“发送渲染队列到” renderer”“。在一个线程中: Alg() //update FastAgl() Alg() //render …

2
如何等待异步操作/协程?
我正在寻找一种通用/可重用的方法来等待协程和异步操作在Unity 5中完成,类​​似于C#5的await关键字。 我能想到的最简单的方法是这样的: public class SomeUtility { public bool IsDoingSomething { get; private set; } public IEnumerator DoSomethingAsync() { IsDoingSomething = true; yield return new WaitForSeconds(2); IsDoingSomething = false; } } 然后在另一个协程中: while(!someUtilityInstance.IsDoingSomething) yield return null; 但是,这不是很好,因为它会使while语句变得混乱,不可重用(即使是简单的实用程序功能,也需要实例和专用的类!)以及很多甚至不需要的单例或静态内容。 我发现最接近的是使用Unity的AsyncOperation。这在这里很好地工作: public static IEnumerator Await(this AsyncOperation operation) { while(!operation.isDone) yield return operation; } …

3
有效分离读取/计算/写入步骤,以便在实体/组件系统中对实体进行并发处理
设定 我有一个实体组件体系结构,其中实体可以具有一组属性(它们是纯数据,没有任何行为),并且存在运行运行于该数据上的实体逻辑的系统。本质上,用某种伪代码: Entity { id; map<id_type, Attribute> attributes; } System { update(); vector<Entity> entities; } 只是以恒定的速率沿所有实体移动的系统可能是 MovementSystem extends System { update() { for each entity in entities position = entity.attributes["position"]; position += vec3(1,1,1); } } 本质上,我正在尝试尽可能高效地并行化update()。这可以通过并行运行整个系统来完成,也可以通过为一个系统的每个update()提供几个组件来实现,以便不同的线程可以执行同一系统的更新,但对于在该系统中注册的实体的不同子集而言。 问题 对于所示的MovementSystem,并行化是微不足道的。由于实体彼此不依赖,并且不修改共享数据,因此我们可以并行移动所有实体。 但是,这些系统有时要求实体彼此交互(从/向彼此读/写数据),有时在同一系统内,但经常在彼此依赖的不同系统之间。 例如,在物理系统中,有时实体可能会彼此交互。两个对象发生碰撞,它们的位置,速度和其他属性会从它们读取,更新,然后将更新后的属性写回到两个实体。 并且在引擎中的渲染系统可以开始渲染实体之前,它必须等待其他系统完成执行,以确保所有相关属性都是它们所需要的。 如果我们试图盲目地并行化它,这将导致经典的竞争条件,其中不同的系统可能同时读取和修改数据。 理想情况下,将存在一种解决方案,其中所有系统都可以从其希望的任何实体读取数据,而不必担心其他系统同时修改相同的数据,而无需程序员关心正确地排序执行和并行化。这些系统是手动的(有时甚至是不可能的)。 在基本实现中,这可以通过将所有数据读写放在关键部分中(用互斥锁保护它们)来实现。但是,这会导致大量的运行时开销,并且可能不适用于对性能敏感的应用程序。 解? 在我看来,可能的解决方案是将数据的读取/更新和写入分开的系统,以便在一个昂贵的阶段,系统仅读取数据并计算其需要计算的内容,以某种方式缓存结果,然后将所有内容写入将更改后的数据通过单独的写入传递回目标实体。所有系统都将以数据在帧开始时的状态对数据进行操作,然后在帧结束之前,在所有系统完成更新后,会发生序列化写入过程,其中所有不同的缓存结果系统遍历并写回到目标实体。 这是基于(可能错了?)的思想,即简单的并行化胜利可能足以超过结果缓存和写入过程的成本(在运行时性能以及代码开销方面)。 问题 如何实现这样的系统以获得最佳性能?这样的系统的实现细节是什么?要使用此解决方案的实体组件系统的先决条件是什么?

1
如何使用多线程OpenGL应用程序更新VBO并同时使用它们?
我有一个简单的应用程序。它有两个线程,每个线程都有自己的呈现上下文,但是它们共享一个VBO(这是有效的,我已经对其进行了测试)。 现在我想要的是:一个线程正在从VBO的上半部分渲染一些数据,第二个线程正在更新VBO的第二部分。 当我不更新VBO时,它工作正常。 但是更新时我遇到了一些奇怪的问题。当我glMapBuffer用来更新VBO(在第二个线程中)时,在大多数情况下,在第一个线程中,它什么都不呈现-整个屏幕清晰(glClear调用后)。看起来它无法触摸来自VBO的数据(这是可以理解的,因为整个缓冲区已映射,因此可以某种方式锁定)。 我尝试使用glMapBufferRange,它使用GL_MAP_UNSYNCHRONIZED_BIT。这意味着,“不要等待并根据需要使用VBO,我(程序)将自己同步它”。另外,当我映射一系列VBO并从另一部分渲染数据时,它不应该等待,但是遇到的问题与相同glMapBuffer。 谁能帮我解决这个问题或解释为什么会发生吗?

2
UDP非阻塞还是单独的线程来接收?
我正在创建一个多人游戏(适用于64位以下的玩家)。我已经决定为网络循环设置一个单独的线程,但是我想知道是否最好创建一个额外的线程来接收UDP或将接收套接字设置为非阻塞(没有额外的线程)。 还是使用其他方法(例如异步套接字)更好?始终欢迎更好的方法!

5
为什么在Vector3s中不能使用运算符'> ='?
我正在尝试获得一个矩形,以便在我称为_positionA和的两个位置之间移动_positionB。两者都是类型Vector3。矩形移动得很好。但是,到达时_positionB它不会像应该的那样朝相反的方向移动。 我回到代码中看一看。我得出的结论是,随着对象的移动,if代码中的语句错过了rects位置等于的框架_positionB。如果rects的位置大于或等于, 我决定将代码修改为反向_positionB。我的代码不太长,因此我将在下面显示它: using UnityEngine; using System.Collections; public class Rectangle : MonoBehaviour { private Vector3 _positionA = new Vector3(-0.97f, -4.28f); //Start position private Vector3 _positionB = new Vector3(11.87f, -4.28f); //End position private Transform _rect_tfm; private bool _atPosA = false, _atPosB = false; public Vector2 speed = new Vector2(1f, 0f); private …
9 unity  c#  vector  mathematics  vector  matrix  unity  c#  transformation  java  3d  terrain-rendering  shading  ios  opengl-es  opengl  rendering  optimization  python  scripting  minecraft-modding  modding  pc  3d-meshes  mesh  culling  point-cloud  networking  interpolation  mathematics  game-design  ai  game-mechanics  animation  unreal-4  skeletal-animation  3dsmax  unity  c#  3d  opengl  c++  textures  unity  ide  cocos2d  cocos2d-x-js  unity  c#  mono  il2cpp  c++  game-loop  timer  linux  flash  actionscript-3  java  glsl  c++  vector  entity-component  c++  directx11  windows  visual-studio  libgdx  mouse  unity  c#  architecture  storage  unity  c#  rotation  coordinates  quaternion  vrpn  movement  vector  unreal-4  unity  shaders  unity  gui  text  bug  shooter  3d  animation  rendering  voxels  c++  mmo  multithreading  linux  textures  procedural-generation  terrain-rendering  multiplayer  mmo  game-state  java  android  libgdx  opengl  procedural-generation  unity  gui  3d  animation  tools  geometry-shader  mobile  advertisements  unity  c#  animation  scripting  unity  animation  unityscript  coroutines  unity  shaders  lighting  camera 

1
为什么V8不能与SDL线程一起运行?
我能够将V8与我的游戏进行编译和链接,并且代码解释正常。但是我想划分代码,游戏循环应该在一个线程中存在,脚本引擎应该在游戏循环的第二个线程中运行。我正在使用SDL,因此尝试使用此代码生成新线程 SDL_CreateThread(ScriptingEngine::SpawnMain, NULL); 以下代码是我的测试脚本引擎: namespace ScriptingEngine { v8::HandleScope handleScope; v8::Handle<v8::ObjectTemplate> global = v8::ObjectTemplate::New(); v8::Persistent<v8::Context> context; void Setup() { // TODO: bind functions to global // ... context = v8::Context::New(NULL, global); } int SpawnMain(void *arguments) { v8::Context::Scope scope(context); v8::Handle<v8::Script> script = v8::Script::Compile( v8::String::New("'Hello World'") ); v8::Handle<v8::Value> result = script->Run(); context.Dispose(); return …

3
Android线程困扰着我围绕设计
我无法将精力集中在游戏设计上。在android平台上,我有一个活动,并使用自定义表面视图设置了其内容视图。自定义曲面视图充当我的面板,我创建所有类的实例,并在那里进行所有绘图和计算。 问:我应该在活动中创建其他类的实例吗? 现在,我创建一个处理游戏循环的自定义线程类。 问题:如何在所有活动中使用这一课程?还是我每次都要创建扩展线程类的单独实例? 在我以前的游戏中,我有多个级别必须创建线程类的实例,并且在线程类中,我必须为每个单独的级别设置构造函数方法,并在循环中使用switch语句检查它需要呈现的级别和更新。抱歉,这听起来令人困惑。 我只想知道我使用的方法是否效率低下(可能是这样),以及如何设计正确的方法。我已经阅读了许多教程,但是在这个特定主题上仍然遇到很多麻烦。也许是一些解释此问题的教程的链接?谢谢。

1
XNA:线程如何工作?
我想在我的XNA游戏中实现线程处理,但是不确定XBOX 360编译时的工作方式。有人可以详细说明吗? 例如,XBOX支持多少个线程?我意识到XNA使用了Compact Framework的特殊版本。这在开发过程中如何影响代码?在为XBOX开发时,与Windows实施的方式是否有所不同? 谢谢。
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.