我正在用 Android/OpenGL 编写游戏,并试图将我的 OpenGL(渲染)逻辑与我的游戏更新逻辑分开,通过在自己的线程上运行每个以提高性能。
我设法让每个线程都在自己的线程上运行,但是根据 DDMS 中的 Tracer,线程仍在按顺序运行(世界是我的游戏更新线程):
请参阅网址,因为我没有图像权限:http: //img849.imageshack.us/img849/9688/capturegff.png
线程似乎不会同时执行代码。我初始化世界线程如下:
public class World implements Runnable {
Thread thread;
public World(...) {
...
// Initialise the player/ball objects
initialiseObjects();
thread = new Thread(this, "World");
thread.start();
}
}
我已经在两个线程之间实现了自己的同步。使用类似于 Replica Island 的方法,我有两个渲染缓冲区:更新线程(理想情况下应该)写入其中一个缓冲区,而渲染线程正在读取另一个缓冲区。缓冲区包含渲染器绘制每个精灵所需的信息。一旦更新线程完成更新其缓冲区并且渲染器完成绘制,它们交换缓冲区并重复该过程。
在游戏更新线程的代码中(渲染线程中的类似代码):
currBuffer.write();
player.draw(currBuffer.getNext());
ball.draw(currBuffer.getNext());
if (particleEffect != null) {
particleEffect.draw(currBuffer);
}
currBuffer.finished();
while(otherBuffer.isFinished() == false) {
//otherBuffer is finished once the render thread has finished drawing
}
DrawBuffer tempBuffer = currBuffer;
currBuffer = otherBuffer;
otherBuffer = tempBuffer;
currBuffer.changed();
while(otherBuffer.isChanged() == false) {
//otherBuffer is changed once the render thread has also swapped buffered
}
我看不出上面的代码如何导致线程的顺序执行,尽管我以前从未尝试过多线程,所以我可能做错了什么。我试图加快游戏速度使其明显变慢且流畅度大大降低。知道为什么线程没有并行运行吗?
更新:问题是我手机的处理器只有单核。我确信 Incredible S 是双核的,但可惜它只是单核的。我在 S2 上尝试过,它确实并行运行了线程。
但是,如果市场上只有较新的手机支持多线程,那么多线程的优势是什么?我不明白 Replica Island 如何通过实现多线程在较旧的单核手机上管理更好的性能。如果没有第二个内核可以利用,那么线程之间同步的额外开销肯定会导致性能降低吗?
由于必须生成缓冲区,然后将缓冲区传递给绘图线程,多线程导致单核性能下降。在双核上,速度提高了 5-10%,尽管在大约 500 个精灵时,由于缓冲区的原因,更新周期再次比绘制周期花费了更长的时间,从而限制了速度增益。显然,通过优化我可以改善这一点,但问题是是否值得以牺牲单核处理器为代价来支持多线程。是否可以确定手机的处理器以便在运行时确定是否使用多线程?