Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/217.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何在opengl游戏循环中使用双核?_Android_Opengl Es_Core Graphics_Game Loop - Fatal编程技术网

Android 如何在opengl游戏循环中使用双核?

Android 如何在opengl游戏循环中使用双核?,android,opengl-es,core-graphics,game-loop,Android,Opengl Es,Core Graphics,Game Loop,我的问题是关于opengl中的游戏循环设计 我相信游戏循环可以分为三个主要步骤 接受输入-它可能来自用户单击屏幕或系统警报或其他任何内容 做逻辑 更新视图 为了简单起见,让我们只关注第2步和第3步 我认为以并行顺序运行它们或将它们混合到一个步骤中是错误的。 我给你举个例子 Lats说你正在创建一个战争游戏,你需要在屏幕上绘制100名士兵在战斗,逻辑是更新他们的位置,更新背景区域,然后你需要绘制结果。在更新另一名士兵的位置之前,不能开始绘制一名士兵 因此,根据这些简单的步骤,很明显步骤2和步骤3需

我的问题是关于opengl中的游戏循环设计

我相信游戏循环可以分为三个主要步骤

  • 接受输入-它可能来自用户单击屏幕或系统警报或其他任何内容
  • 做逻辑
  • 更新视图
  • 为了简单起见,让我们只关注第2步和第3步

    我认为以并行顺序运行它们或将它们混合到一个步骤中是错误的。 我给你举个例子

    Lats说你正在创建一个战争游戏,你需要在屏幕上绘制100名士兵在战斗,逻辑是更新他们的位置,更新背景区域,然后你需要绘制结果。在更新另一名士兵的位置之前,不能开始绘制一名士兵

    因此,根据这些简单的步骤,很明显步骤2和步骤3需要以某种方式同步,步骤2必须在步骤3之前完成

    现在告诉我如何在多个线程和多个进程上运行游戏循环?opnegl是否使用多核?怎么做

    编辑:使用多线程的一种方法是预先计算游戏逻辑,或者换句话说,使用向量。但向量有两大缺点,使得它们几乎无法使用

  • 有时你不想改变你的向量,所以你做了很多计算,你不打算使用它们
  • 在大多数情况下,您试图达到60+FPS,这意味着游戏循环需要16毫秒,切换线程需要某种同步,任何同步都会对性能有害,从我所看到的,即使是android中的一个简单处理程序.post()(只需将任务添加到队列以在其他线程上运行)也可能需要3毫秒(帧速率时间的18%),所以除非你的计算需要更长的时间,否则不要这样做!现在我没有发现任何东西需要这么长的时间
  • 现在告诉我如何在多个线程上运行游戏循环

    多核计算的概念是并行化,即将计算密集型任务拆分为独立的工作集,这些工作集可以并行处理。正如你自己发现的那样,游戏的并行空间非常小

    在游戏中使用多核的通常方法是将I/O与逻辑操作并行化。也就是说,在一个线程中完成所有网络和用户交互,在另一个线程中完成AI和场景管理。声音通常也并行化

    OpenGL使用多核吗?如何使用

    OpenGL规范没有规定这一点。但是一些实现可能会选择使用多个核心。尽管这不太可能。为什么?因为它会产生不必要的缓存管理开销

    现在告诉我如何在多个线程上运行游戏循环

    多核计算的概念是并行化,即将计算密集型任务拆分为独立的工作集,这些工作集可以并行处理。正如你自己发现的那样,游戏的并行空间非常小

    在游戏中使用多核的通常方法是将I/O与逻辑操作并行化。也就是说,在一个线程中完成所有网络和用户交互,在另一个线程中完成AI和场景管理。声音通常也并行化

    OpenGL使用多核吗?如何使用


    OpenGL规范没有规定这一点。但是一些实现可能会选择使用多个核心。尽管这不太可能。为什么?因为它会产生不必要的缓存管理开销。

    我将尝试以图形方式解释,为什么两个线程(一个用于渲染,一个用于逻辑)更好,并且不会导致不一致s:

    您建议的单线程设计将按如下方式运行:

    logic    |-----|     |-----|
    graphics       |-----|     |-----| and so forth.
    
    但由于您有多个CPU,您应该使用它们。这意味着,在第一次逻辑完成后,图形可以呈现该游戏状态。同时,可以计算下一个逻辑步骤:

    logic    |-----||-----||-----|
    graphics       |-----||-----|    and so forth.
    
    如您所见,通过这种方式,您的性能几乎可以翻一番:当然会有一些开销,但无论如何,它会比单线程版本快


    此外,您可以假设游戏逻辑计算渲染线程所需的时间比计算渲染线程所需的时间要少:这使得线程处理变得非常简单,因为您可以在逻辑线程中等待渲染线程的回调,以向渲染线程提供新的指令,然后计算下一个逻辑步骤。

    我将尝试以图形方式解释,为什么2线程(一个用于渲染,一个用于逻辑)要好得多,不会导致不一致:

    您建议的单线程设计将按如下方式运行:

    logic    |-----|     |-----|
    graphics       |-----|     |-----| and so forth.
    
    但由于您有多个CPU,您应该使用它们。这意味着,在第一次逻辑完成后,图形可以呈现该游戏状态。同时,可以计算下一个逻辑步骤:

    logic    |-----||-----||-----|
    graphics       |-----||-----|    and so forth.
    
    如您所见,通过这种方式,您的性能几乎可以翻一番:当然会有一些开销,但无论如何,它会比单线程版本快


    此外,您可以假设游戏逻辑计算渲染线程所需的时间比计算渲染线程所需的时间要少:这使得线程处理变得非常简单,因为您可以在逻辑线程中等待渲染线程的回调,以向渲染线程提供新的指令,然后计算下一个逻辑步骤。

    这个问题可能是最好的答案。这个问题可能是最好的答案。说得好,但你只说了显而易见的一点,今天大多数电脑甚至手机都有不止一个内核(你今天在苹果电脑上甚至可以找到12个内核),计算机工程师致力于为我们提供更多的内核。我们,开发人员,以及当时要求最多的游戏开发人员,并不总是能够使用它。我想让人们了解这一点,了解真正的性能是什么,有没有可能有这么多的工程师免费使用内核……P.S SP3有7个内核,它是一个游戏控制台。@Ba