2020.3.10.遗留问题

1,GPA连不上手机,是需要root还是其它问题???

问题起源:定位GPU问题时,需要细致到填充率,CPU到GPU的传输带宽问题(纹理带宽,framebuffer带宽问题等)

这里定位是否是纹理带宽问题时就需要在游戏运行时动态更改所有纹理的尺寸,目前似乎只有GPA有这个功能,或者自己写工具去HOOK到gles底层API实现。

经过实验发现:还是root的问题,不root的手机,有些ADB命令执行不了。

试验过程如下:

1,使用oppoR9S,这破手机无法ROOT,就不管ROOT了,操作:打开【开发者选项】和【USB调试】,然后打开使用GPA中的System Analyzer 2019 R3,看到设备号后,点击 connect,提示不是user0,切换后还是这个错误提示,没办法了,换成System Analyzer 2014 R3后,点击connect后,手机上弹出一个相应的System Analyzer安装,确认后安装失败,被OPPOR9S给杀了吧。

2,没办法,换成红米note7,再点击connect后,提示无法执行什么O,没有权限,这个权限是要ROOT才行的。

总之,想要对安卓手机使用GPA,就必须ROOT了

另外,参考链接:对于自家的App只要加一个debuggable=true就行了,对于别人家的……咳咳,我一开始以为用Xposed + enable-debugger Flag可以解决,后来发现ROOT的机子直接就能跑了 

 2016官方的演讲 

2,systrace看不到unity的具体函数调用 ,只能看到UnityMain,原因是什么???如何看到??

这个好像要设置APK为debuggabble=true,但对应到unity是哪个选项?怎么设置?snapdraggon profiler也需要这个来开启类似systrace的trace

TODO:需要熟悉安卓开发,以及UNITY底层是如何与安卓结合的(启动)

一些歪方法:打包APK后,修改其中的debuggable配置项:https://www.jianshu.com/p/e3e6154db43a https://www.jianshu.com/p/e3e6154db43a  https://www.cnblogs.com/qcloud1001/p/6650023.html

1,后来使用snapdragon profiler,发现可以找到并连接上手机,而且其中有各种gl statu override功能,包括了实时的【use small texture]功能,这就完全可以替代GPA了,

并且包含了systrace中的查看unity函数调用栈的功能

2,实验证明:player settings选项中的 script debugging = 脚本中的EditorUserBuildSettings.allowDebugging 等价于 BuildOptions.AllowDebugging 最终都等价于android manifest中的 debuggable。

    [MenuItem("testx/build")]
    public static void testx()
    {
        EditorUserBuildSettings.allowDebugging = true;

        var bdop = new BuildPlayerOptions();
        bdop.target = BuildTarget.Android;
        bdop.locationPathName = "Z:/unity/abcx.apk";
        bdop.options = BuildOptions.Development | BuildOptions.AllowDebugging;
        BuildPipeline.BuildPlayer(bdop);
        
    }

只有开启了 debuggable,在systrace和snapdragon profiler中才能看到unity的函数调用栈。其中systrace要注意的是:还要同时为enable Application Traces From:选择你要trace的包名。

关于各种性能剖析工具:https://www.jianshu.com/p/0ef3e8315416

3,Unity能否针对不同档次的机器采取不同的纹理压缩格式?比如低端机采用高压缩的ASTC12X12,而高端机采用ASTC4X4

似乎不行,一方面来说,低端机可能都不支持ASTC这种新的压缩格式。

在Quality设置中,有可以设置纹理分辨率的,比如标签为low的质量等级采用1/2图片分辨率。

如何动态设置质量等级:

using UnityEngine;

public class Example : MonoBehaviour
{
    void OnGUI()
    {
        string[] names = QualitySettings.names;
        GUILayout.BeginVertical();
        for (int i = 0; i < names.Length; i++)
        {
            if (GUILayout.Button(names[i]))
            {
                QualitySettings.SetQualityLevel(i, true);
            }
        }
        GUILayout.EndVertical();
    }
}

4,垂直同步:

显示器与显卡:

双缓冲:前后缓冲,即frontbuffer,backbuffer

显卡-GPU,负责渲染图形数据到前缓冲,然后交换前后缓的指针,然后继续在前缓冲绘制,显示器从后缓冲取数据显示出来。

由于显示器显示画面的过程是一行一行的,当一屏画面画到一半时,后缓冲指针被换成了前缓冲指针时,显示器的一屏画面就有一半是前一帧的,一半是的下一帧的,就出现了画面撕裂。

画面撕裂,不管显示器的刷新率多高或多低都一样出现画面撕裂。

如何避免画面撕裂:在显示器完整的显示完一屏画面后,下一屏画面显示之前的这段时间内交换前后缓冲指针,这段时间就是vertical blanks,即垂直空白。

原文地址:https://www.cnblogs.com/timeObjserver/p/12497096.html