Ste*_*e M 14 android frame-rate google-play
我有一个应用程序列在新Google Play控制台的最低25% - 用于慢速渲染的Android生命周期部分.我对此感到担心,因为有些文章似乎表示,如果你跌到最低25%,Google Play可能会在Play商店排名中惩罚你的应用.
但是,似乎无法为我的应用程序改进此指标.它播放音乐,并有一个SeekBar和TextView,每隔250ms更新一次,就像任何音乐播放器一样.我做了最小的基本程序来演示:
public class MainActivity extends AppCompatActivity {
int count;
SeekBar seekBar;
TextView textView;
Runnable runnable =
new Runnable() {
@Override
public void run() {
textView.setText(Integer.toString(count));
seekBar.setProgress(count);
++count;
seekBar.postDelayed(runnable, 250);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
seekBar = (SeekBar) findViewById(R.id.seek);
textView = (TextView) findViewById(R.id.text);
seekBar.post(runnable);
}
}
Run Code Online (Sandbox Code Playgroud)
完整项目:https://github.com/svenoaks/SlowRendering.git
当我在类似于Nexus设备的硬件上运行此程序时,我得到一个
adb shell dumpsys gfxinfo com.example.xyz.slowrendering命令的结果:
Stats since: 19222191084749ns
Total frames rendered: 308
Janky frames: 290 (94.16%)
90th percentile: 32ms
95th percentile: 36ms
99th percentile: 44ms
Number Missed Vsync: 2
Number High input latency: 0
Number Slow UI thread: 139
Number Slow bitmap uploads: 0
Number Slow issue draw commands: 283
Run Code Online (Sandbox Code Playgroud)
这意味着几乎所有的帧都需要16ms才能渲染,我想由于更新的周期性.据我所知,我测试的所有其他音乐播放器应用程序也有这个慢渲染问题.我担心谷歌的算法破坏了我的应用排名,有什么方法可以提高我的分数?
Tin*_*ran 16
在TextView你的布局引起的问题.因为它具有layout width的wrap_content,其中所述的,它的宽度必须等于该内容(在这个例子中的文本)的宽度.因此,每次调用TextView.setText昂贵的度量/布局都必须通过.简单设置layout_widthto match_parent将解决问题.
这里有两张图片systrace,它展示了在1帧中在UI线程上运行的工作.最上面一个完成,layout_width=wrap_content底部一个完成layout_width=match_parent.
我测试的以下两种方法将提高帧速率:
如果你以更短的跨度发布runnable,比如16ms(seekBar.postDelayed(runnable, 16)),你可以得到这个平滑的60fps:

P/s:我不知道为什么.
使用其他方式更新count值而不是更新Runnable.使用View.postOnAnimation(Runnable)重新安排了Runnable.结果是示例项目的60FPS.
编辑:两个Runnable使用postOnAnimation(Runnable)
Runnable runnable =
new Runnable() {
@Override
public void run() {
textView.setText(Integer.toString(count));
seekBar.setProgress(count);
seekBar.postOnAnimation(this);
}
};
Runnable updateCount = new Runnable() {
@Override public void run() {
++count;
seekBar.postDelayed(this, 250);
}
};
Run Code Online (Sandbox Code Playgroud)
我检查了你的代码。不确定这是实际代码还是您有更多代码。在任何情况下,我都会提请注意 android 中的一些渲染问题。
1. 过度绘制
过度绘制是通过对像素着色而浪费 GPU 处理时间的地方,这些像素只会被其他东西再次着色。如果您向父容器布局添加了背景,然后子项也被添加了背景,或者如果您在应用程序主题的样式文件中添加了通用背景,然后将背景添加到 xml 的其余部分,则这些可能很常见您创建的布局文件。
过度绘制的原因可能是任何原因,请尝试检查您的代码。所有移动设备中都安装了一个开发人员工具,可以在开发人员选项中检查 Overdraw。这是透支的官方文档。
2.查看层次
为了渲染每个视图,Android 经历了三个阶段:
1.测量
2.布局
3.画画
Android 完成这些阶段所需的时间与层次结构中的视图数量成正比。我在您的布局文件中看到您有包含线性布局的约束布局。我看不出有什么用。引入约束布局以帮助开发人员减少视图层次结构。减少特定布局可以拥有的孩子数量。还有一个工具可以帮助您解决这个问题。这是它的官方android指南。尝试这些步骤来找出 GPU 渲染问题。
| 归档时间: |
|
| 查看次数: |
5219 次 |
| 最近记录: |