1

我使用 SurfaceView 构建了一个简单的游戏引擎。

我使用 RectF 作为“相机”窗口,以表示 SurfaceView 画布的缩放像素宽度和高度,并找出屏幕上的内容。

我使用 canvas.translate 移动到相机“指向”的位置。这是绘制循环:

mCamera.UpdateCamera();
scaleWorld(c, mCamera);
c.translate(-mScreen.left, mScreen.top - miHeight
* (1 / mCamera.getScaleLevel()));
drawBehavior.drawGame(c);

无论如何,如果我发射弹丸,游戏会流畅地渲染,并且我看不到黑色的视觉闪烁,这是我用来冲洗画布的颜色。

但是,如果我立即更改相机可以看到的内容,可能在 3 个或更多“屏幕”之外,经常会出现黑色闪烁,但并非总是如此。有时我会变得“幸运”,并且过渡是无缝的。

这些闪光通常在我的位图的位置,因为我使用一个或两个位图递归地绘制地面和背景。

在我看来,突然的变化是问题所在,所以我试图从本质上破坏 gameLoop 线程以停止一切,然后设置新的 Rect 坐标,然后用另一个线程重新启动,但这不起作用。

我想经过反思,我只是通过这样做来延迟系统的“冲击”,而不是对其进行处理。

在尝试通过淡出或其他视觉技巧将这个可能残暴的设计扫到地毯下之前,我想知道是否有人对这个问题有更深入的了解,并且可以引导我找到更优雅的解决方案。

4

1 回答 1

1

我猜在绘制完成之前屏幕正在刷新。多线程仍然有点让我失望 - 但这里有一些尝试:尝试在游戏循环开始时锁定画布,并在结束时解锁它:http: //developer.android.com/reference/android/view /SurfaceHolder.html#lockCanvas ()

于 2011-05-05T23:58:17.910 回答