Java 关于lunarlander示例的简单问题
我的游戏基于lunarlander示例。这是我正在使用的运行循环(与lunarlander中使用的非常类似)。即使我几乎什么也没画,我也会遇到与我的绘画相关的相当大的性能问题 我注意到下面的方法。为什么每个周期都要创建画布并将其设置为空Java 关于lunarlander示例的简单问题,java,android,performance,graphics,drawing,Java,Android,Performance,Graphics,Drawing,我的游戏基于lunarlander示例。这是我正在使用的运行循环(与lunarlander中使用的非常类似)。即使我几乎什么也没画,我也会遇到与我的绘画相关的相当大的性能问题 我注意到下面的方法。为什么每个周期都要创建画布并将其设置为空 @Override public void run() { while (mRun) { Canvas c = null; try
@Override
public void run()
{
while (mRun)
{
Canvas c = null;
try
{
c = mSurfaceHolder.lockCanvas();//null
synchronized (mSurfaceHolder)
{
updatePhysics();
doDraw(c);
}
} finally
{
// do this in a finally so that if an exception is thrown
// during the above, we don't leave the Surface in an
// inconsistent state
if (c != null)
{
mSurfaceHolder.unlockCanvasAndPost(c);
}
}
}
}
大多数时候,我读过关于画布的文章,更多的是:
mField = new Bitmap(...dimensions...);
Canvas c = new Canvas(mField);
我的问题是:为什么谷歌的例子是这样做的(空画布),这有什么好处,有没有更快的方法呢?在你的例子中,你确实在制作一个新的画布。但是当你说 为什么每个周期都要创建画布并将其设置为空
@Override
public void run()
{
while (mRun)
{
Canvas c = null;
try
{
c = mSurfaceHolder.lockCanvas();//null
synchronized (mSurfaceHolder)
{
updatePhysics();
doDraw(c);
}
} finally
{
// do this in a finally so that if an exception is thrown
// during the above, we don't leave the Surface in an
// inconsistent state
if (c != null)
{
mSurfaceHolder.unlockCanvasAndPost(c);
}
}
}
}
我不认为会发生这种情况。创建了“a”画布(变量),并将其设置为null。那么这个叫做
c = mSurfaceHolder.lockCanvas();
返回所使用的画布。(见附件)
没有你所说的“新画布”。如果出现错误,c将保持为空,您可以检查它。如果不为空,则执行解锁。可能您没有像Lunar示例中那样在单独的线程中进行绘制。啊,如果您不知道,我对这一点相当陌生。使用lockCanvas方法,指定脏矩形会有任何性能优势吗?另外,您是否需要在任何地方指定画布的大小?创建一个线程,该线程将引用支架或曲面。开始。在Run()方法中,添加图形。不要忘记在显示曲面之前不要启动线程,否则您将有一个空画布。当然,只需使用holder上的回调或onSurfaceCreate方法启动线程。