我正在设置一个游戏循环。循环设置为以 50 FPS 更新。目前,该应用程序所做的唯一操作是在响应触摸事件时绘制屏幕坐标。最初我将绘图功能设置为仅绘制新的触摸事件。这导致文本闪烁。多个触摸事件在不同时间闪烁,这让我认为 Canvas 在幕后使用了多个页面。为了解决这个问题,我列出了发生的每个触摸事件,并在每次绘制调用时重绘整个列表。
如果我错了,请纠正我,lockCanvas()/unlockCanvasAndPost() 调用本质上是一个后缓冲交换。阅读有关锁定和解锁的文档听起来好像有必要在调用之间重绘整个场景,除非您使用 lockCanvas(Rect dirty)。在这种情况下,需要重绘脏矩形区域,同时保留外部区域。
在 unlockCanvas() 和 lockCanvas() 之间永远不会保留 Surface 的内容,因此,必须写入 Surface 区域内的每个像素。此规则的唯一例外是指定脏矩形时,在这种情况下,将保留非脏像素。
我知道这听起来像是我已经回答了我自己的问题,但根据文档,Surface 在调用之间永远不会保留。然而,这并不能解释我的第一个实现的行为,即我会点击屏幕并且文本会开始闪烁。由于我只绘制了一次文本,这意味着闪烁是从交换到没有得到 drawText() 调用的“backbuffer”,以及没有被破坏但可能需要考虑的原始 Surface不可靠。
所以,问题是:我是否需要在每次绘制调用时重绘所有对象?如果是这样,我是否需要“清除”画布,或者至少也重绘背景图像?