AndEngine学习(二):AndEngine引擎运行原理
通过对于一般游戏的逻辑原理的分析,以及对AndEngine源码的阅读,总算是对游戏的一般架构以及AndEngine是如何实现这一架构的原理有了一定的了解,总结一下备忘!
一般的游戏主逻辑:(在游戏的主线程中)
[java] <span style="font-size:16px;">while (true)
{
用户交互监听(用户输入)
逻辑运算
绘制屏幕
}</span>
<span style="font-size:16px;">while (true)
{
用户交互监听(用户输入)
逻辑运算
绘制屏幕
}</span>
如果简单的写成这样会有一个很严重的问题,就是在不同配置的机器上游戏运行的效果不一样,因为线程是在一直不停的运行的,而不同的CPU会影响到逻辑的运算,而不同的GPU又会影响其绘制效率,所以就是,在不同的配置的机器上在一定的时间内,循环运行的次数是不一样的,假设一个精灵会在一帧中走10px,不同机器上每秒跑10帧和跑100帧,那么精灵就会出现在不同的机器上在相同的时间内移动的距离是不同的!这是很严重的!所以,主逻辑有了下面的改进,
[java] <span style="font-size:16px;">while (true)
{
startTime = currentTime;
用户输入监听
逻辑运算
endTime = currentTime;
deltaTime = endTime - startTime;
if (deltaTime < FRAME_LENGTH_PER_SECOND)
{
sleep(deltaTime);
}
绘制屏幕
}</span>
<span style="font-size:16px;">while (true)
{
startTime = currentTime;
用户输入监听
逻辑运算
endTime = currentTime;
deltaTime = endTime - startTime;
if (deltaTime < FRAME_LENGTH_PER_SECOND)
{
sleep(deltaTime);
}
绘制屏幕
}</span>
注意currentTime是获取的系统当前时间,deltaTime即用于用户输入监听,逻辑运算的时间,而FRAME_LENGTH_PER_SECOND这个值很重要,这是我们希望每帧用的时间(当然是毫秒级的,即 每秒 / 我们希望游戏在不同的机器上每秒都运行的帧数上限制,比如我们希望游戏在所有的机器上都保持在30帧以内,则FRAME_LENGTH_PER_SECOND=1000 / 30 = 33ms(毫秒)),当然我们是认为绘制屏幕过程很快的,如果使用双缓冲的话,在逻辑运算部分就已经将要绘制的内容绘制到缓冲区了,而绘制屏幕的过程则相当于缓冲区到屏幕的一个拷贝,过程会非常快!
帅帅的分割线 www.zzzyk.com ===============================================================================================
下面就要来介绍一下AndEngine是来如何实现这个主线程死循环的!
在Engine类中有一个内部类UpdateThread类,
[java] <span style="font-size:16px;"> private class UpdateThread extends Thread
{
// ===========================================================
// Constants
// ===========================================================
// ===========================================================
// Fields
// ===========================================================
// ===========================================================
// Constructors
// ===========================================================
public UpdateThread()
{
super(UpdateThread.class.getSimpleName());
}
// ===========================================================
// Getter & Setter
// ===========================================================
// ===========================================================
// Methods for/from SuperClass/Inte易做图ces
// ===========================================================
@Override
public void run()
{
android.os.Process.setThreadPriority(Engine.this.mEngineOptions.getUpdateThreadPriority());
try
{
while (true)
{
Engine.this.onTickUpdate();
}
}
catch (final InterruptedException e)
{
Debug.d(this.getClass().getSimpleName() + " interrupted. Don't worry - this "
+ e.getClass().getSimpleName() + " is most likely expected!", e);
this.interrupt();
}
}
// ===========================================================
// Methods
// ===========================================================
// ===========================================================
补充:移动开发 , Android ,