Articles of multithreading

基于任务的并行机制在游戏引擎中的实现

我正在寻找这个实现,因为我很难理解如何处理数据。 据我所知,只是使用关键部分和locking代码区域修改共享资源发生是一个不行,因为locking和解锁在程序上施加相当严重的性能损失。 因此,另一种方法是在创建任务时将所有相关数据简单地复制并传递给线程,并在任何工作线程返回给我时在下一帧的结尾或开始处覆盖原始数据。导致的问题是,如果两个任务修改相同的资源…我不清楚如何有意义地解决这个“结果碰撞”。 我想理论上可以只应用传入变化的增量:假设每个实体在帧的开始处检查消息传递系统对自身的修改。 如果对实体组件e有n个修改,那么新e可能只是旧e加上每个n的所有“old_e – new_e”的总和。 但是这似乎有点丑,我不确定它是否适用于不仅仅是单个数字的简单改变的事情。 是否有任何开源的例子来实现这个系统,我可以看看?

每个连接的Websocket服务器线程

我正在创建一个html5多人游戏,并且正在研究如何创建一个websocket服务器。 我一直在寻找各种图书馆,我注意到,每个人都会为每个连接的客户端创建一个新的线程。 现在我对websocket还是比较陌生的,但是我知道在过去,当谈到游戏服务器devise时,每个连接的线程是不好的做法。 这对websockets是否正确? 为什么每个连接都需要一个新线程?

与游戏勾号同步

我正在开发一款多人游戏,目前正在设置。 它接受来自客户端的数据包,并执行所需的任何处理。 还有一个主要的游戏勾号是这样设置的: for every online player update every player in the region for every online player reset flags 我看到可能发生的问题是,因为它在运行中处理数据包,它可能会修改更新和标志重置之间的某些内容,这可能导致它完全忽略某些内容。 我不认为有可能使用实际的同步块进行同步,因为它不能同时更新和重置标志 – 它需要在更新每个玩家之后重置标志。 我看到的唯一的解决scheme是不在飞行中处理数据包,并在主循环中执行,但这可能会损害性能。 这是最好的解决scheme,还是有另一种select,我不考虑? 谢谢

带有multithreading的Timestep

有几个问题和文章涉及时间步 – 例如: 游戏逻辑应该更新每秒或每帧? https://gafferongames.com/post/fix_your_timestep/ 考虑蜱之间的漂移 (这是我以前的问题) 虽然最后一个在评论中开始讨论 – 但我仍然有一个关于如何构建一个multithreading系统的未解决的问题。 给定两个线程: 状态工作者:简单地对数据进行纯粹的转换。 IO渲染器:处理input,并呈现最新的可用状态对象 比方说,状态工作线程只是连续循环地更新游戏状态,而渲染器以固定的时间步长(例如60fps)更新屏幕。 现在让我们忽略input。 渲染器通过获取最新的数据来完成工作,每当数据完成时(可能在渲染之间发生了几十次),数据就从国有工作人员传入。 在我看来,这将是最stream畅的解决scheme,并且非常简单(除了读取状态更新之间的增量时间(不考虑渲染更新)之外,没有插值)。 虽然非常小 – 我说我们可以忽略input,它也给了一点点快乐,因为它轮询input并与游戏状态更新同步,在这种情况下发生得更为频繁,而基于渲染滴答至less对于简单的游戏)。 这个想法有什么缺陷? 或者是固体?

通常由计划任务完成哪种工作

我正在阅读有关任务调度程序如何在游戏引擎中工作。 我不清楚的是这些任务通常会安排什么样的工作。 引擎通常在一个单独的任务中勾选一个演员? 如果这个演员触发了寻路请求,那么这是一个子任务吗? 寻路任务应该分配自己的内存还是访问全局导航网格数据? 我想我想要的是关于这种并行系统如何在实践中使用的实际生活实例。 也许一些基于示例的最佳实践会很好。 我发现的大多数文献都是相当理论化的,给我留下了很多问题。

在OpenGL中使用多重上下文进行multithreading的正确方法是什么?

我正在尝试并行化我在OpenGL中创建的程序。 我已经完全testing了我的代码的单线程版本,它的工作原理。 我用valgrind运行它,事情很好,没有错误,没有内存泄漏,代码的行为完全符合我所做的所有testing的预期。 在单线程版本中,我发送了一堆要呈现的多维数据集。 我通过在称为“world”的数据结构中创建多维数据集,通过将OpenGL信息附加到堆栈中,将OpenGL信息发送到另一个名为“Renderer”的结构,最后遍历队列并呈现每个对象。 由于单线程版本的作品,我认为我的问题是,我没有正确使用多个OpenGL上下文。 这些是我的整个过程的三个function: 主函数,初始化全局结构和线程。 int main(int argc, char **argv) { //Init OpenGL GLFWwindow* window = create_context(); Rendering_Handler = new Renderer(); int width, height; glfwGetWindowSize(window, &width, &height); Rendering_Handler->set_camera(new Camera(mat3(1), vec3(5*CHUNK_DIMS,5*CHUNK_DIMS,2*CHUNK_DIMS), width, height)); thread world_thread(world_handling, window); //Render loop render_loop(window); //cleanup world_thread.join(); end_rendering(window); } 世界的处理,应该运行它自己的线程: void world_handling(GLFWwindow* window) { GLFWwindow* inv_window = create_inv_context(window); glfwMakeContextCurrent(inv_window); […]

在独立线程中运行的Box2D和libGDX Stage(Scene2D)之间的通信

我正在使用libGDX和Box2D制作基于物理的2D游戏。 我想将渲染线程的模拟执行。 我使用不可变消息和BlockingQueue传递关于玩家行为的信息。 Box2D施加力量并运行一个模拟框架。 在接下来的步骤中,我想同步备份更改并相应地更新Scene2D Actor。 使用Gdx.app.postRunnable()制作一个不可变的游戏世界状态副本是一种select,但效率不高。 还有其他的select吗?

在openGL ES 2.0 Android项目中加载资源时的Nullpointerexception

概观 我的启animation面首先显示一个“加载”对话框,然后启动一个asyncTask (加载对话框来自标准的Android视图类) 在asyncTask的doInBackground方法中,我所有的quads / sprite对象都被创建,其他值被设置等等。 当代码进入onSurfaceCreated时 ,它加载所有的纹理并运行游戏。 纹理加载发生在onSurfaceCreated,因为它必须在GL线程上完成。 现在,在一个不错的平板电脑上,这一切都很好,而且都非常稳定。 但是,当我在老手机上运行它时,它会(间歇性地)以nullpointerexceptions的方式在所有的地方崩溃。 原因 发生什么事是在较慢的设备上, asyncTask正在运行,并且(由于它的asynchronous性质)继续在后台运行,而主代码移动到GLRenderer的onSurfaceCreate方法,在那里尝试应用纹理因为asyncTask还在做生意,所以还不存在的对象。 如何最好地继续? 什么是我可以实现的一些方法,将允许我保证asynchronous已经做了它的东西之前,试图影响它创建的任何对象? 有没有办法“暂停”GLThread,直到asyncTask完成? 我曾经被告知使用单独的线程或asynchronous来加载资源,但是我很困惑如何正确地处理它,并保持它和GL线程之间的一切同步(如果“同步” “在这方面是正确的术语)。 任何帮助,将不胜感激。 代码示例 从Activity类显示onCreate和doInBackground @Override protected void onCreate(Bundle savedInstanceState) { //Request full screen requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); super.onCreate(savedInstanceState); //Create a displayMetrics object to get pixel width and height metrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metrics); width = metrics.widthPixels; height […]

任务vs线程与执行队列

我的游戏服务器将不得不经常回应请求,所以我认为线程是一个很好的select。 但是,我应该从.NET使用任务类,或者有几个线程将执行我将存储在队列(链接列表)中的请求。 哪种方式会更快?

C ++ glGenBuffers在线程中调用时没有返回正确的VBOID

目前我正在学习如何在C ++中正确使用multithreading,结合OpenGL和GLFW,并且在我的应用程序中遇到了一个奇怪的错误。 我在sidethread中生成了一个程序生成的地形,但是每次我要为生成的地形(块)创建缓冲区时,glGenBuffers()只会将我放入的值给回给我! 它不会创建一个适当的缓冲区。 我甚至用gDEBugger检查过,没有创建VBO。 这里是伪代码: void init(){ //This is in the main thread! sharedWindow = glfwCreateWindow(1, 1, "shared", NULL, NULL); mainWindow = glfwCreateWindow(400, 400, "main", NULL, sharedWindow); glfwMakeContextCurrent(mainWindow); } void terrainGeneratorLoop() { //This is in another thread! glfwMakeContextCurrent(sharedWindow); while(running){ /* Generate vertex data for terrain */ //Upload generated data into GPU: unsigned int m_vbo […]