public override void Draw()
        {
            for (int i = 0; i < m_AnalyzedData.Subshaders.Count; i++)
            {
                AnalyzedSubshaderData subshader = m_AnalyzedData.Subshaders[i];

                if (drawHeader(subshader, EDataType.Subshader, i.ToString(), string.Empty))
                {
                    EditorGUILayout.BeginVertical();
                    GUITools.BeginContents(GUITools.Styles.HelpBoxStyle);
                    EditorGUILayout.LabelField("LOD : ", subshader.LOD.ToString());

                    for (int j = 0; j < subshader.Passes.Count; j++)
                    {
                        AnalyzedPassData pass = subshader.Passes[j];

                        if (drawHeader(pass, EDataType.Pass, j.ToString(), pass.PassName))
                        {
                            GUITools.BeginContents(GUITools.Styles.HelpBoxStyle);

                            EditorGUILayout.LabelField("Name : ", pass.PassName);

                            for (int k = 0; k < pass.Variants.Count; k++)
                            {
                                AnalyzedVariantData variant = pass.Variants[k];

                                //TODO 这里需要分页,避免变体过多导致GUI卡顿

                                if (drawHeader(variant, EDataType.Variant, k.ToString(), getShortVariantName(variant.VariantName)))
                                {
                                    GUITools.BeginContents(GUITools.Styles.HelpBoxStyle);
                                    EditorGUILayout.LabelField("Name : ", variant.VariantName);

                                    ShaderDataDrawerBase drawer;
                                    if (!ShaderDrawer.TryGetValue(variant.GPUVendorType, out drawer))
                                    {
                                        Debug.LogError("无法获取到" + variant.GPUVendorType.ToString() + "的绘制器");
                                    }
                                    else
                                    {
                                        for (int l = 0; l < variant.Shaders.Count; l++)
                                        {
                                            AnalyzedShaderDataBase shader = variant.Shaders[l];

                                            if (drawHeader(shader, EDataType.Shader, shader.ShaderType.ToString(), string.Empty))
                                            {
                                                GUITools.BeginContents(GUITools.Styles.HelpBoxStyle);

                                                if (!string.IsNullOrEmpty(shader.ERROR))
                                                {
                                                    EditorGUILayout.HelpBox(shader.ERROR, MessageType.Error);
                                                }
                                                else
                                                {
                                                    drawer.Draw(shader);
                                                }

                                                GUITools.EndContents();
                                            }
                                        }
                                    }
                                    GUITools.EndContents();
                                }
                            }

                            GUITools.EndContents();
                        }
                    }
                    GUITools.EndContents();
                    EditorGUILayout.EndVertical();
                }
            }
        }
        private void OnGUI()
        {
            m_ScrollPosition     = GUILayout.BeginScrollView(m_ScrollPosition, false, true);
            m_SettingsFolderOpen = GUITools.DrawHeader("设置", false, m_SettingsFolderOpen, true);
            if (m_SettingsFolderOpen)
            {
                GUITools.BeginContents(GUITools.Styles.WizardBoxStyle);

                EditorGUI.BeginDisabledGroup(ShaderAnalyzer.Instance.CurrentStageType != EAnalyzeStageType.None);
                m_CurrentShader = EditorGUILayout.ObjectField(new GUIContent("Shader"), m_CurrentShader, typeof(Shader), false) as Shader;
                m_SkipUnused    = EditorGUILayout.Toggle(new GUIContent("是否跳过当前场景未使用的变体", ""), m_SkipUnused);
                EditorGUI.BeginChangeCheck();
                m_APIType = (EAPIType)EditorGUILayout.EnumPopup(new GUIContent("要编译的着色器语言类型"), m_APIType,
                                                                (Enum index) =>
                {
                    bool show = true;
                    switch ((EAPIType)index)
                    {
                    case EAPIType.None:
                    case EAPIType.All:
                    case EAPIType.Vulkan:
                        show = false;
                        break;
                    }

                    return(show);
                },
                                                                false
                                                                );
                if (EditorGUI.EndChangeCheck())
                {
                    initVendors();
                }

                EditorGUI.BeginChangeCheck();
                m_VendorsSelected = EditorGUILayout.Popup(new GUIContent("GPU厂商"), m_VendorsSelected, m_Vendors);
                if (EditorGUI.EndChangeCheck())
                {
                    initVendor();
                }

                m_GPUModelsSelected = EditorGUILayout.Popup(new GUIContent("目标GPU模型"), m_GPUModelsSelected, m_ModelNames);

                EditorGUI.BeginDisabledGroup(m_CurrentShader == null);

                if (GUILayout.Button("解析"))
                {
                    if (m_CurrentVendor.VendorType == EGPUVendorType.Mali)
                    {
                        if (string.IsNullOrEmpty(Settings.MaliOfflineCompilePath))
                        {
                            Debug.LogError("请设置Mali离线编译器路径!");
                            return;
                        }
                    }
                    ShaderAnalyzer.Instance.Analyze(this.getAnalyzeParams(), analyzeCallback);
                    GUITools.ClearContentDepth();
                    GUIUtility.ExitGUI();
                }

                EditorGUI.EndDisabledGroup();
                EditorGUI.EndDisabledGroup();

                GUITools.EndContents();
            }

            if (m_AnalyzedData != null)
            {
                EditorGUILayout.Space();

                EditorGUI.BeginChangeCheck();

                m_AnalyzedDataDrawType = (EAnalyzedDataViewType)EditorGUILayout.EnumPopup(m_AnalyzedDataDrawType);
                if (EditorGUI.EndChangeCheck())
                {
                    ViewerMap[m_AnalyzedDataDrawType].Init(m_AnalyzedData);
                }

                EditorGUILayout.LabelField("解析数据");

                GUITools.BeginContents(GUITools.Styles.WizardBoxStyle);
                EditorGUILayout.BeginVertical();

                EditorGUILayout.LabelField("GPU信息 : ", m_AnalyzedData.GPUModelInfo.ModelName);
                EditorGUILayout.LabelField("硬件信息 : ", m_AnalyzedData.Hardware);
                EditorGUILayout.LabelField("驱动信息 : ", m_AnalyzedData.Driver);

                EditorGUILayout.EndVertical();
                GUITools.EndContents();
                ViewerMap[m_AnalyzedDataDrawType].Draw();
            }
            GUILayout.EndScrollView();
        }
        public override void Draw()
        {
            GUITools.BeginContents(GUITools.Styles.WizardBoxStyle);

            EditorGUILayout.BeginHorizontal();
            if (GUILayout.Button(m_CurrentSortField != null ? "着色器类型" : (m_DescendingOrder ? "着色器类型 ▼" : "着色器类型 ▲"), GUILayout.MinWidth(m_MINWIDTH)))
            {
                if (m_CurrentSortField != null)
                {
                    m_DescendingOrder  = false;
                    m_CurrentSortField = null;
                }
                else
                {
                    m_DescendingOrder = !m_DescendingOrder;
                }

                m_List.Sort(sort);
            }
            GUILayout.Button(new GUIContent("源代码", "点击着色器代码可以复制到剪贴板"), GUILayout.MinWidth(m_MINWIDTH));

            foreach (var item in m_FieldInfoMap)
            {
                bool click = false;

                GUIContent buttonText;
                if (item.Value != null)
                {
                    buttonText = new GUIContent(item.Value.Abbreviate, item.Value.Tooltip);
                }
                else
                {
                    buttonText = new GUIContent(item.Key.Name);
                }

                if (m_CurrentSortField == item.Key)
                {
                    buttonText.text = buttonText.text + (m_DescendingOrder ? " ▼" : " ▲");
                }

                click = GUILayout.Button(buttonText, GUILayout.MinWidth(m_MINWIDTH));

                if (click)
                {
                    if (m_CurrentSortField != item.Key)
                    {
                        m_DescendingOrder = true;
                    }
                    else
                    {
                        m_DescendingOrder = !m_DescendingOrder;
                    }

                    m_CurrentSortField = item.Key;
                    m_List.Sort(sort);
                }
            }

            EditorGUILayout.EndHorizontal();

            EditorGUILayout.BeginVertical();
            for (int i = 0; i < m_List.Count; i++)
            {
                //TODO 这里需要分页,避免着色器过多导致GUI卡顿

                AnalyzedShaderDataBase shader = m_List[i];
                if (!string.IsNullOrEmpty(shader.ERROR))
                {
                    GUILayout.Button(shader.ERROR);
                }
                else
                {
                    EditorGUILayout.BeginHorizontal();

                    ShaderParem param = m_ParamMap[shader];
                    GUILayout.Button(new GUIContent(shader.ShaderType.ToString(), getTooltip(param)), GUILayout.MinWidth(m_MINWIDTH));

                    if (GUILayout.Button(new GUIContent("着色器代码", shader.SourceCode), GUILayout.MinWidth(m_MINWIDTH)))
                    {
                        GUIUtility.systemCopyBuffer = shader.SourceCode;
                    }

                    foreach (var item in m_FieldInfoMap)
                    {
                        FieldInfo field = item.Key;
                        GUILayout.Button(field.GetValue(shader).ToString(), GUILayout.MinWidth(m_MINWIDTH));
                    }
                    EditorGUILayout.EndHorizontal();
                }
            }
            EditorGUILayout.EndVertical();
            GUITools.EndContents();
        }