使用 SurfaceView 的 Android 游戏循环;快速更改相机“镜头”会导致黑色闪光等

Posted

技术标签:

【中文标题】使用 SurfaceView 的 Android 游戏循环;快速更改相机“镜头”会导致黑色闪光等【英文标题】:Android gameLoop using SurfaceView; quickly changing camera 'shots' results in black flashes, etc 【发布时间】:2011-02-12 01:14:15 【问题描述】:

我使用 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 坐标,然后用另一个线程重新启动,但这不起作用。

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

在尝试通过淡出或其他视觉技巧来掩盖这个可能很糟糕的设计之前,我想知道是否有人对这个问题有更深入的了解并可以引导我找到更优雅的解决方案。

【问题讨论】:

【参考方案1】:

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

【讨论】:

以上是关于使用 SurfaceView 的 Android 游戏循环;快速更改相机“镜头”会导致黑色闪光等的主要内容,如果未能解决你的问题,请参考以下文章

android-tip-关于SurfaceView的使用

android surfaceview 怎么用

Android使用SurfaceView搭建OpenGL环境

Android使用SurfaceView搭建OpenGL环境

Android使用SurfaceView搭建OpenGL环境

相机中使用的Android模糊surfaceview