我正在开发一款Android游戏,我开始注意到在开发过程中有点迟钝,所以我想尝试利用多线程来获得乐趣和学习。
我的应用程序有3个主题:
我尽可能地最小化了线程2和3之间的关键部分,并认为游戏逻辑可以独立于渲染线程进行更新,然后在两个线程的末尾我可以有一个尽可能短的窗口,其中我将所有图形更新从逻辑线程推送到游戏循环。这应该允许两个线程在大多数情况下独立工作。理论上听起来像是表演胜利。
然而,一旦我开始实施,我的表现大幅下降。它比以前更糟糕,一个更新和渲染循环花了50毫秒(20fps),所以它看起来像垃圾。这只是渲染大约20个三角形和20个纹理四边形,这是一个非常简单的工作量(我不敢想到当我实现适当的图形时会是什么)。
无论如何,我在android中使用DDMS跟踪来描述出现问题或者可以改进的地方。
http://i.stack.imgur.com/DDUYE.png
这是我游戏大约3帧的视图。到目前为止,它似乎大致按照我的预期行事。以蓝色突出显示的部分是锁定部分,它看起来是正确的(保持glThread在锁定时大多等待)。然而,一旦我解锁它,我应该看到两个线程同时工作,它看起来像它们,但如果我仔细观察:
http://i.stack.imgur.com/vukXQ.png
我正在双核手机上进行开发,但是如果我理解了正确的跟踪它看起来并不像是并行执行任何操作,而且更糟糕的是它似乎每次切换活动线程数百次毫秒! (除非我不正确地解释这个)。所有这些上下文切换似乎对性能都很糟糕,所以我不确定为什么它会如此快速地来回切换。
因此,在我冗长的解释之后,我想知道一些事情:
答案 0 :(得分:4)
非常好的问题,让我从答案开始:
希望你会发现这个答案很有帮助。
答案 1 :(得分:1)
感谢您的提问。内部人员的完整答案对我也有帮助。我会说出我所知道的。
某些(全部?)手机可以选择启用/禁用第二个核心。你检查过你的了吗?
在我自己的应用程序中,我注意到仅仅从一个线程到两个线程(在一个核心上)并且总工作量没有变化导致1.5倍的减速,因此显然线程本身有成本。
有消息称,英特尔正在呼吁Google解决多核线程执行不力问题:
http://www.pcworld.com/article/257307/dual_core_processors_wasted_on_android_intel_claims.html
您的结果验证了这一点。
要记住的另一件事是多核不是多处理器。您在内核之间共享缓存和内存控制器带宽。在等待另一个用共享资源完成时,可以停止,特别是对于共享高速缓存行上的写入。但是,这种影响不应该考虑到您所看到的单线程。