- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个小实验应用程序(本质上是 Android SDK 中的 LunarLander 演示的非常精简版),只有一个 SurfaceView
。我有一个 Drawable
“sprite”,我会定期将其绘制到不同位置的 SurfaceView
的 Canvas
对象中,而不会尝试删除之前的图像.因此:
private class MyThread extends Thread {
SurfaceHolder holder; // Initialised in ctor (acquired via getHolder())
Drawable sprite; // Initialised in ctor
Rect bounds; // Initialised in ctor
...
@Override
public void run() {
while (true) {
Canvas c = holder.lockCanvas();
synchronized (bounds) {
sprite.setBounds(bounds);
}
sprite.draw(c);
holder.unlockCanvasAndPost(c);
}
}
/**
* Periodically called from activity thread
*/
public void updatePos(int dx, int dy) {
synchronized (bounds) {
bounds.offset(dx, dy);
}
}
}
在模拟器中运行,我看到的是在发生一些更新后,图像的几个旧“副本”开始闪烁,即出现和消失。我最初假设我可能误解了 Canvas
的语义,并且它以某种方式维护“层”,并且我正在将它打死。然而,我随后发现,只有当我试图以比大约每 200 毫秒更快的速度更新时,我才会得到这种效果。所以我的下一个最佳理论是,这可能是模拟器无法跟上并撕裂显示器的产物。 (我还没有可以测试的物理设备。)
这两种理论是否正确?
注意:我实际上并不想在实践中这样做(即绘制同一事物的数百个重叠副本)。但是,我想了解为什么会这样。
环境:
切题:
我的 run()
方法本质上是 LunarLander 示例工作方式的精简版本(删除了所有多余的逻辑)。我不太明白为什么这不会使 CPU 饱和,因为似乎没有什么可以阻止它全速运行。谁能澄清一下?
最佳答案
好吧,我已经用与你类似的方式对月球着陆器进行了屠杀,并且看到了闪烁我可以告诉你,你所看到的是双缓冲机制的简单 Artifact ,每个 Surface
有。
当您在附加到 Surface
的 Canvas
上绘制任何内容时,您正在绘制到“后”缓冲区(不可见的缓冲区)。当您 unlockCanvasAndPost()
时,您正在交换缓冲区……当“后”缓冲区变为“前”缓冲区时,您绘制的内容突然变得可见,反之亦然。所以你的下一帧绘图是对旧的“前”缓冲区完成的......
要点是您总是在交替帧上绘制以分离缓冲区。我想图形架构中有一个隐含的假设,即您总是将要写入每个像素。
理解到这里,我想真正的问题是为什么它在硬件上不闪烁?在过去的几年里从事图形驱动程序方面的工作,我可以猜测原因,但不愿推测得太远。希望以上内容足以满足您对这个渲染 Artifact 的好奇心。 :-)
关于android - 调用 Drawable.draw() 时防止 "flickering",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4985563/
我最近从 Xcode 4.3 升级到 4.4,我正要沮丧地砸我的屏幕。 我遇到的问题是代码完成。当我输入一个变量或方法名称时,完成窗口会弹出它应该有的建议。但是,如果我尝试使用光标键在建议之间滚动,建
我在使用 jQuery 图像旋转器时遇到了一些问题。当快速单击下一个/上一个按钮两次时,图像会闪烁,您最终会看到两个图像。关于如何修复它有什么想法吗? 这是 HTML CSS
我已尽最大努力成为 Javascript/Ajax 技术的纯粹主义者,确保所有 Ajax-y 行为都是对基本功能的增强,而当禁用 Javascript 时,网站也能正常运行。但是,这会导致一些问题。
我的 Gatbsy 网站的页面加载时,未设置样式的内容“闪烁”。在此处查看当前部署预览可能最有帮助 https://happy-mahavira-5cd669.netlify.com/ . 到目前为止
背景:我们有一个嵌入式系统,可使用 10 位模数转换器将线性位置(0 毫米 - 40 毫米)从电位器电压转换为其数字值。 ------------------------ 0mm |
我尝试为伪元素宽度 css3 设置动画。一切都好。但在 Firefox (43.0.3) 上,动画结束时字体会闪烁: div { width:500px; height:500px; co
[已解决]:应用适当的列表迭代过程修复了问题。 (如下图) 我目前有一个程序,如果满足特定条件,列表中的元素将被迭代并删除。由于程序的性质,这可以直观地看到。 屏幕上正在迭代的对象有时会闪烁。这通常发
我有一个进度条,我想在用户单击某项时更新它。所以可以通过进度条来回前进。 目前,该栏似乎可以正常工作,但是该栏在闪烁,好像每秒都在加载该栏。例如,用户处于 70%,因此该条将填充到那里,然后清除,然后
我将 GridView 与图像项一起使用,通过 android DataBinding 技术 加载图像。如果向列表中添加一些新项目并通知适配器,那么 GridView 会闪烁,为什么会出现这种情况?如
我正在使用 KO 构建 SPA(单页应用程序)。该应用程序看起来像一本书,用户可以翻页。 问题是每次加载页面时,页面都会有短暂的“闪烁”,用户看到的是页面的无样式版本。我猜这是由于很多样式都依赖于 k
问题 如交互式 BaseTable API Playground 所示 here ,当我开始滚动时,跨行会闪烁开/关。 这是库中的一个已知错误,并且已经发布了很多关于它的问题: https://git
例如:我有一个 TFrame(称为 TPageFrame),它有许多控件,例如TreeView 左对齐、拆分器和由编辑和 RichEdit 组成的主客户区域,如下图所示: 代码看起来像这样: type
我正在尝试在 F# 中实现双缓冲。我遇到的所有示例都是 C#。 let r = form.DisplayRectangle let buffer = new Bitmap(r.Widt
我正在使用 grid 设计一个交互式绘图R 中的包。作为交互性的一部分,我反复删除并重新创建绘图的各个部分。但是,网格元素的总数(使用 grid.ls() 命令获得)保持不变;我创建的所有内容之前都已
场景如下:我有一些信息要显示在 ListView 上。每行都可以有标题、正文、日期、头像和更多数据。还有一个来自网络的 ImageView。 ImageView 的每一行都有不同的高度。我知道下载后它
我正在尝试制作数字时钟。它的问题之一是显示器会“闪烁”。换句话说,wx.StaticText 小部件(在本例中为 self.ST)将在很短的时间内变为空白。我相信原因可能在于 self.ST 更新的方
我似乎在使用在 Firefox(以及 iOS)中设置了“位置”的背景图像时遇到了问题。 在 iOS 上,当您滚动时图像会消失一秒钟,然后再回来。在 Firefox 上,它们只会在我使用 .animat
标题听起来有点乱,但我不想写得太长,所以请耐心阅读...... 我正在编写一个非常简单的 OpenGL 演示,它将图像加载为纹理,然后在屏幕上无限地水平滚动图像。以下是我如何加载纹理并渲染单帧: vo
我遇到了此处描述的相同问题:same problem ( fiddle :original fiddle)但我还不了解 JS,我在编写代码时正在学习,所以当我的 html 代码与现在有点不同时,我不知
您好 stackoverflow 社区... 我已将多个 (JavaFX) Menu 实例放入一个菜单中(位于 GluonMobile-View 的子节点中): 问题是,当类(class)器悬停其中一
我是一名优秀的程序员,十分优秀!