乐趣区

关于rendering:Application-targetFrameRate设置帧率慢

1)Application. targetFrameRate 设置帧率慢
​2)URP Shader FrameBuffer Fetch Mali Crash
3)Unity 2021 出 Profiler 包长时间黑屏问题
4)在 Android 设施上,是否能够同时预览前后摄像头


这是第 334 篇 UWA 技术常识分享的推送,精选了 UWA 社区的热门话题,涵盖了 UWA 问答、社区帖子等技术知识点,助力大家更全面地把握和学习。

UWA 社区主页:community.uwa4d.com
UWA QQ 群:465082844

Rendering

Q:应用天玑 8100 处理器,我的项目用到动静帧率,60/30 频繁切换,关了垂直同步的。在 30 切 60 时,若场景有大量 GPU Skin,30 到 60 就特地慢,大略 6 - 7 秒。

求教下有解决办法吗?

A:这个问题的起因有几个方面:

  1. targetFrameRate 从 30 切换到 60 时,须要渲染更多的帧来达到 60fps 的帧率,这会导致 GPU 须要做更多工作,特地是在场景中有大量 GPU 皮肤(GPU Skin)这类资源时,GPU 的工作量会猛增,因而帧率切换时会呈现比拟长的 Stall。
  2. 尽管敞开了垂直同步(VSync),然而 GPU 仍须要肯定的工夫来筹备好图像并切换帧缓冲(Framebuffer),这也会导致额定的提早。
  3. 如果 GPU 渲染能力较弱,那么在简单场景下,特地是产生帧率变动时,GPU 更难以跟上 CPU 的节奏,导致呈现卡顿。
  4. Unity 的 Render Pipeline 机制也会对此产生影响。当指标帧率变动时,Unity 须要重新配置和优化其渲染流程,这也须要肯定的工夫,在低端 GPU 上会更显著。

综上所述,这个问题的本源在于 GPU 在解决大量 GPU 资源的简单场景时,渲染能力跟不上帧率的变动,导致 Tile 重绘和 Framebuffer 切换时呈现提早景象。

一些改良措施能够尝试:

  1. 防止频繁切换 targetFrameRate,尽量保持稳定的帧率。
  2. 缩小场景中的 GPU 资源或减低材质品质来升高 GPU 负载。
  3. 应用更高性能的 GPU,特地进步 GPU 的带宽和填充率指标。
  4. 调整 Unity 的 Graphics 品质设置,敞开一些高负载的成果。
  5. 优化自定义 Shader 的性能,缩小适度耗费 GPU 资源的 Shader。

感激 NG 週 @UWA 问答社区提供了答复

Rendering

Q:以下设施应用 FrameBuffer Fetch 华为 Mali 设施编译 Shader 间接闪退,然而如果把纹理采样去掉就失常了,有遇到过这种问题的嘛?

Unity 2021.3.23
Custom SRP
Device : HUAWEI P40 — Mali-G76

代码如下:

Shader "unlit/test"
{
    Properties
    {_Color ("Main Color", Color) = (1,1,1,1)
        [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}}
    SubShader
    {
        Tags
        {
            "Queue"="Transparent"
            "IgnoreProjector"="True"
            "RenderType"="Transparent"
            "PreviewType"="Plane"
            "CanUseSpriteAtlas"="True"
        }

        Pass
        {
            Name "ForwardLit"
            Tags {"LightMode" = "UniversalForward"}

            HLSLPROGRAM

            #define ENABLE_FRAMEBUFFER_FETCH 1

            #pragma vertex Vertex
            #pragma fragment Fragment

            #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl"
            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"

            struct Attributes
            {
                float4 positionOS   : POSITION;
                float4 color        : COLOR;
                float2 texcoord     : TEXCOORD0;
                UNITY_VERTEX_INPUT_INSTANCE_ID
            };

            struct Varyings
            {
                float4 positionCS    : SV_POSITION;
                float4 texcoord      : TEXCOORD0;
                half4 color            : TEXCOORD2;
                UNITY_VERTEX_OUTPUT_STEREO
            };

            TEXTURE2D(_MainTex); SAMPLER(sampler_MainTex);

            CBUFFER_START(UnityPerMaterial)
            half4 _Color;
            CBUFFER_END      

            Varyings Vertex(Attributes input)
            {
                Varyings output;
                UNITY_SETUP_INSTANCE_ID(input);
                UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);

                output.positionCS = TransformObjectToHClip(input.positionOS.xyz);
                output.texcoord = input.texcoord.xyxy;
                output.color = input.color;
                return output;
            }

            half4 FragmentInner(Varyings input)
            {half4 color = SAMPLE_TEXTURE2D(_MainTex, sampler_LinearClamp, input.texcoord.xy).rgba;
                return color * input.color * _Color;
            }

            void Fragment(Varyings input, inout half4 output : CoLoR0)
            {half4 col = FragmentInner(input);
                output.rgb = lerp(output.rgb, col.rgb, col.a); output.a = col.a;
            }

            ENDHLSL
        }
    }
}

设施自身是反对 GL_EXT_shader_framebuffer_fetch 的,代码如下:

2023/04/20 19:54:29.555 13797 13846 Debug Unity GL_EXT_debug_marker GL_ARM_rgba8 GL_ARM_mali_shader_binary GL_OES_depth24 GL_OES_depth_texture GL_OES_depth_texture_cube_map GL_OES_packed_depth_stencil GL_OES_rgb8_rgba8 GL_EXT_read_format_bgra GL_OES_compressed_paletted_texture GL_OES_compressed_ETC1_RGB8_texture GL_OES_standard_derivatives GL_OES_EGL_image GL_OES_EGL_image_external GL_OES_EGL_image_external_essl3 GL_OES_EGL_sync GL_OES_texture_npot GL_OES_vertex_half_float GL_OES_required_internalformat GL_OES_vertex_array_object GL_OES_mapbuffer GL_EXT_texture_format_BGRA8888 GL_EXT_texture_rg GL_EXT_texture_type_2_10_10_10_REV GL_OES_fbo_render_mipmap GL_OES_element_index_uint GL_EXT_shadow_samplers GL_OES_texture_compression_astc GL_KHR_texture_compression_astc_ldr GL_KHR_texture_compression_astc_hdr GL_KHR_texture_compression_astc_sliced_3d GL_EXT_texture_compression_astc_decode_mode GL_EXT_texture_compression_astc_decode_mode_rgb9e5 GL_KHR_debug GL_EXT_occlusion_query_boolean GL_EXT_disjoint_timer_query GL_EXT_blend_minmax GL_EXT_discard_framebuffer
2023/04/20 19:54:29.555 13797 13846 Debug Unity GL_OES_get_program_binary GL_OES_texture_3D GL_EXT_texture_storage GL_EXT_multisampled_render_to_texture GL_EXT_multisampled_render_to_texture2 GL_OES_surfaceless_context GL_OES_texture_stencil8 GL_EXT_shader_pixel_local_storage GL_ARM_shader_framebuffer_fetch GL_ARM_shader_framebuffer_fetch_depth_stencil GL_ARM_mali_program_binary GL_EXT_sRGB GL_EXT_sRGB_write_control GL_EXT_texture_sRGB_decode GL_EXT_texture_sRGB_R8 GL_EXT_texture_sRGB_RG8 GL_KHR_blend_equation_advanced GL_KHR_blend_equation_advanced_coherent GL_OES_texture_storage_multisample_2d_array GL_OES_shader_image_atomic GL_EXT_robustness GL_EXT_draw_buffers_indexed GL_OES_draw_buffers_indexed GL_EXT_texture_border_clamp GL_OES_texture_border_clamp GL_EXT_texture_cube_map_array GL_OES_texture_cube_map_array GL_OES_sample_variables GL_OES_sample_shading GL_OES_shader_multisample_interpolation GL_EXT_shader_io_blocks GL_OES_shader_io_blocks GL_EXT_tessellation_shader GL_OES_tessellation_shader GL_EXT_primitive_bounding_box GL_OES_primitive_bounding_
2023/04/20 19:54:29.555 13797 13846 Debug Unity box GL_EXT_geometry_shader GL_OES_geometry_shader GL_ANDROID_extension_pack_es31a GL_EXT_gpu_shader5 GL_OES_gpu_shader5 GL_EXT_texture_buffer GL_OES_texture_buffer GL_EXT_copy_image GL_OES_copy_image GL_EXT_shader_non_constant_global_initializers GL_EXT_color_buffer_half_float GL_EXT_unpack_subimage GL_EXT_color_buffer_float GL_EXT_YUV_target GL_OVR_multiview GL_OVR_multiview2 GL_OVR_multiview_multisampled_render_to_texture GL_KHR_robustness GL_KHR_robust_buffer_access_behavior GL_EXT_draw_elements_base_vertex GL_OES_draw_elements_base_vertex GL_EXT_protected_textures GL_EXT_buffer_storage GL_EXT_external_buffer GL_EXT_EGL_image_array GL_EXT_texture_filter_anisotropic GL_ARM_texture_unnormalized_coordinates GL_HUAWEI_smart_cache GL_EXT_shader_framebuffer_fetch GL_HUAWEI_framebuffer_partial_update

针对以上问题,有教训的敌人欢送转至社区交换分享:
https://answer.uwa4d.com/question/6441fea4c165ab39387f39cb


Editor

Q:Build 的时候勾选上 Development Build 出包没问题,勾选 Auto Connect Profiler,在安卓机器上,只有切换 APP 进后盾再回来(包含第一次启动)都会卡住 10 秒左右的工夫,去掉 Auto 后一切正常。

Unity 版本是 Unity 2021.3.17(LTS),新建 3D 空我的项目,IL2CPP+.NETFramework。

请问怎么解决?

A1:这段时间是在连贯调试器,去掉 Auto Connect 本人连也能够,这个流程应该不辨别哪个版本,如果本人连,那游戏刚启动时的信息可能会错过,正式版本这个选项肯定要去掉。

切换 APP 进后盾再回来应该是另一个问题,看看你的利用是不是又得新关上了一次,如果又从新关上了,查一下 AndroidManifest 里的 LaunchMode 是否有问题。

感激李伟 @UWA 问答社区提供了答复

A2:2021.3.1f1 也有过,有时候切出切入时会闪退。不过感觉是失常景象,就是在尝试连贯到编辑器的 Profiler,正式包是没问题的。

在意的话,能够再测试下这两种状况是否还会卡住:

  1. 关上编辑器,顺利连贯至 Profiler
  2. 敞开编辑器,不连贯数据线

感激家养西瓜 @UWA 问答社区提供了答复

TextMeshPro

Q:在 Android 设施上,应用 Unity 开发后,是否能够同时预览前后摄像头?

我本人试了间接预览只能单个,我用的 WebCamTexture,这个 WebCamTexture.play 执行后,会把前一个摄像头间接顶掉,如果原生不能够,有其余举荐的计划吗?

针对以上问题,有教训的敌人欢送转至社区交换分享:
https://answer.uwa4d.com/question/643f63d8dda39c02044480b2

封面图来源于网络


明天的分享就到这里。生有涯而知无涯,在漫漫的开发周期中,咱们遇到的问题只是冰山一角,UWA 社区愿伴你同行,一起摸索分享。欢送更多的开发者退出 UWA 社区。

UWA 官网:www.uwa4d.com
UWA 社区:community.uwa4d.com
UWA 学堂:edu.uwa4d.com
官网技术 QQ 群:465082844

退出移动版