【问题标题】:Android partial invalidation doesn't work as expected with hardware accelerationAndroid 部分失效无法通过硬件加速按预期工作
【发布时间】:2014-04-14 15:43:47
【问题描述】:

我知道这与partial-invalidation-in-custom-android-view-with-hardware-acceleration 的问题完全相同,但我想我会更详细地解释我的问题,并希望有人能就如何解决问题给出答案。

我编写了一个简单的井字游戏应用程序,它在模拟器上运行良好。但是在我禁用硬件加速时,我发现它在设备上按预期工作,因此无法在设备上运行。

所有字段都用Canvas.drawBitmap() 绘制,“空”字段也用空白图像绘制。线条用Canvas.drawLine()绘制 我正在使用invalidate(Rect) 的部分失效,因为我只想重绘选择设置十字/圆形的区域,并再次使用Canvas.drawBitmap()。但随后整个区域无效,这意味着我看到整个区域/屏幕都是灰色的(白色图像和线条消失了)并且只有十字/圆圈的图像设置在所选区域中。

当我在方法onDraw() 中使用Canvas.getClipBounds() 打印出无效的字段矩形时,使用硬件加速它是整个区域(例如“0,0,320,407”),并且没有硬件加速,我使用@ 失效的相同矩形987654328@(例如“106,135,106,135”)。

目前,作为解决方法,我用相应的图像和线条重绘所有字段。如何防止整个区域因硬件加速而失效?

如果这很重要:我在三星 Galaxy Young Duos S6312 上使用的是 Android 版本 4.1.2。

问候 桑德罗

【问题讨论】:

    标签: android canvas invalidation


    【解决方案1】:

    我已经在您给定的link 中发布了我的答案。要理解这个问题,你应该知道软件渲染和硬件渲染的区别。这真的是一个很大的话题,我不会在这里讨论。我认为最好的方法是阅读source code(我几天前做了同样的事情)。关键问题是“DisplayList 是什么以及何时使用” .在这里重复我的回答,onDraw 中的Canvas 只是用来重建DisplayList。这并不意味着您的视图中的所有内容都会被重绘。

    【讨论】:

    • 这不是我的经验。性能使得整个视图被重绘。我已经通过将自定义位图拆分为 4x4 子视图网格并仅使已更改的子视图无效来验证这一点,并且性能要好得多。
    • @PsychoDad,你怎么知道“整个视图被重绘了”?
    • @suitianshi 因为与制作视图网格并仅使更改的视图无效相比,性能要差得多。
    • 您的自定义视图的onDraw 方法将被调用以在将其渲染到屏幕之前重绘整个DisplayList。那么您确定性能成本不是由您的绘图代码造成的吗?如果是这样,您能否提供分析结果?
    猜你喜欢
    • 2017-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-01
    • 2020-03-09
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多