解释多核性能跟踪(Eclipse/Android)

解释多核性能跟踪(Eclipse/Android),android,eclipse,multithreading,debugging,Android,Eclipse,Multithreading,Debugging,我正在开发一款android游戏,我开始注意到在开发过程中有点迟钝,所以我想尝试利用多线程来娱乐和学习 我的应用程序有3个线程: UI线程(应该大部分处于空闲状态) 博弈逻辑线程 图形线程 我尽可能地最小化线程2和线程3之间的关键部分,其思想是游戏逻辑可以独立于渲染线程进行更新,然后在两个线程的末尾,我可以有一个尽可能短的窗口,将所有图形更新从逻辑线程推送到游戏循环。这将允许两个线程在大部分时间内独立工作。从理论上讲,这听起来像是一场性能胜利 然而,一旦我着手实施,我的表现就大跌。比以前更糟糕的

我正在开发一款android游戏,我开始注意到在开发过程中有点迟钝,所以我想尝试利用多线程来娱乐和学习

我的应用程序有3个线程:

  • UI线程(应该大部分处于空闲状态)
  • 博弈逻辑线程
  • 图形线程
  • 我尽可能地最小化线程2和线程3之间的关键部分,其思想是游戏逻辑可以独立于渲染线程进行更新,然后在两个线程的末尾,我可以有一个尽可能短的窗口,将所有图形更新从逻辑线程推送到游戏循环。这将允许两个线程在大部分时间内独立工作。从理论上讲,这听起来像是一场性能胜利

    然而,一旦我着手实施,我的表现就大跌。比以前更糟糕的是,一个更新和渲染循环需要50毫秒(20帧/秒),所以看起来像垃圾。这只是渲染大约20个三角形和20个纹理四边形,这是一个非常简单的工作负载(我不敢想象当我实现正确的图形时会是什么)

    无论如何,我在安卓系统中进行了DDMS跟踪,以确定哪里出了问题,或者哪里可以改进

    这是我的游戏大约3帧的视图。到目前为止,它似乎做的和我预期的差不多。以蓝色突出显示的部分是锁定部分,看起来大致正确(使glThread在锁定时大部分时间处于等待状态)。然而,一旦我解锁它,我会看到两个线程同时工作,看起来它们是一样的,但如果我仔细看:

    我在双核手机上进行开发,但如果我正确理解跟踪,它看起来不会并行执行任何操作,更糟糕的是,它似乎以每秒数百次的速度切换活动线程!(除非我的解释不正确)。所有这些上下文切换似乎对性能很糟糕,所以我不确定它为什么要如此快速地来回切换

    在我冗长的解释之后,我想知道一些事情:

  • 我的理解正确吗,轨迹中的填充矩形是活动线程,而彩色线是休眠线程?否则它们意味着什么
  • 为什么我从来没有看到我的线程在一个假定的双核手机上同时运行
  • 为什么它会如此快速地切换活动线程
  • 在DDMS中,我得到警告“警告:调试器处于活动状态;方法跟踪结果将被扭曲”。这有什么好担心的吗?我怎样才能摆脱这个警告?(我通过Run而不是Debug启动了应用程序,如果它起作用的话)

  • 非常好的问题,让我从答案开始:

  • 您混淆了线程/方法/activeMethod。traceview中的每一行都是线程(如果您命名了线程,您将在左侧看到它的名称,如“GL线程”、“主线程”等)。矩形(彩色)表示每个线程内的活动执行方法,而彩色线表示线程内的“暂停”方法。“暂停”,我的意思是“方法仍在执行,但上下文已切换到其他线程,当上下文再次切换到此线程时,此方法将继续工作。在您在问题中使用的术语中,行是休眠线程的方法,矩形是活动线程执行方法。您可以找到
  • 在内核之间分配线程是另一回事,这在很大程度上取决于底层的安卓操作系统机制。首先,确保目标安卓操作系统启动时启用SMP(对称多处理)选项,这是多核手机的默认情况,我猜:),但我不擅长这些方面
  • 线程切换取决于操作系统线程/进程调度器、线程优先级等。有关这方面的更多信息,您可以
  • 即使您在非调试模式下运行应用程序,当您连接DDMS并执行方法分析等操作时,也会激活davlik vm的调试部分

  • 希望你会觉得这个答案很有帮助。

    谢谢你的提问。一位内部人士的完整回答也会对我有所帮助。我会说我知道的

    • 一些(全部?)手机有启用/禁用第二个核心的选项。您是否已检查您的手机是否已打开

    • 在我自己的应用程序中,我注意到仅仅从一个线程到两个线程(在一个内核上),而完成的总工作量没有变化,会导致1.5倍的速度减慢,因此线程本身显然有成本

    • 有消息称,英特尔正在对谷歌的多核线程实施不力进行谴责:

      您的结果验证了这一点

    • 要记住的另一件事是,多核不是多处理器。您在多核之间共享缓存和内存控制器带宽。一个可以在等待另一个使用共享资源完成时暂停,特别是在共享缓存线上的写入。但是,这种影响不应解释您正在使用的单线程伊琳


    Re:Bullet 1:我找不到任何选项来启用/禁用姜饼下的第二个核心,我怀疑是否有人会在默认情况下禁用第二个核心的双核手机。Re#3和#4,“执行差”是一回事,但“零执行”是另一回事。在整个traceview中没有一个飞秒两个线程同时处于活动状态。我还认为,英特尔的声明可能与英特尔试图销售其单核处理器有关,而不是与其他任何事情有关。我想知道traceview是否在多核手机上不能正常工作?无论如何,感谢您的反馈。可能是“执行不力”“意味着存在完全不使用第二个核心的不受限制的条件。(OpenGL驱动程序调用?JNI?这些都是胡乱猜测。)另一个可能较差的实现是为每个