首页 >Unity3D频道 >【Unity3D研究院之游戏开发】 > URP场景渲成一张图优化性能
2022
09-07

URP场景渲成一张图优化性能

我们游戏是回合制卡牌,场景并不会像MMO那样人物在屏幕上可以自由移动,这里产生的一个优化的可能就是将场景先渲染到一张图上,然后在Blit到屏幕上,然后在绘制后面的人物。前提是相机不能移动和旋转,这样在低端机上可以从设计上锁了镜头的旋转移动。如果对效果要求不那么高其实RT用ARGB32就够了。

    public Camera RtCamera;
    private void OnGUI()
    {
        if (GUILayout.Button("截图"))
        {
            var rt =  RenderTexture.GetTemporary(Screen.width, Screen.height, 0, RenderTextureFormat.RGB111110Float);
            RtCamera.targetTexture = rt;
            RtCamera.Render();
            ColorBlitRendererFeature.Enable = true;
            ColorBlitRendererFeature.RenderIdentifier = rt;
        }
    }

 

接着就是Blit的操作了。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;

public class ColorBlitRendererFeature : ScriptableRendererFeature
{
    public static bool Enable = false;
    public static RenderTargetIdentifier RenderIdentifier;
    public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData)
    {
        if (Enable)
        {
            if (renderingData.cameraData.cameraType == CameraType.Game)
            {
                m_RenderPass.SetTarget(renderer.cameraColorTarget);
                renderer.EnqueuePass(m_RenderPass);
            }
        }
    }

    ColorBlitPass m_RenderPass = null;
    public override void Create()
    {
        m_RenderPass = new ColorBlitPass();
    }

    class ColorBlitPass : ScriptableRenderPass
    {
        ProfilingSampler m_ProfilingSampler = new ProfilingSampler("ColorBlit");
        RenderTargetIdentifier m_CameraColorTarget;
        public ColorBlitPass()
        {
            renderPassEvent = RenderPassEvent.BeforeRenderingOpaques;
        }

        public void SetTarget(RenderTargetIdentifier colorHandle)
        {
            m_CameraColorTarget = colorHandle;
        }

        public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
        {
            var camera = renderingData.cameraData.camera;
            if (camera.cameraType != CameraType.Game || !ColorBlitRendererFeature.Enable)
                return;

            CommandBuffer cmd = CommandBufferPool.Get();
            using (new ProfilingScope(cmd, m_ProfilingSampler))
            {
                Blit(cmd, RenderIdentifier, m_CameraColorTarget);
            }
            context.ExecuteCommandBuffer(cmd);
            cmd.Clear();

            CommandBufferPool.Release(cmd);
        }
    }
}

URP的skybox是晚于不透明物体的,如果使用了内置的skybox还需要调整渲染层级。

URP场景渲成一张图优化性能 - 雨松MOMO程序研究院 - 1

这个例子中我使用了一个RT摄像机,其实完全可以不使用额外相机,但是需要在Feature中先画场景层在保存到一张临时RT中,因为实际过程中场景可能由多个层组成也包括半透明和不透明两种,所以多使用一个RT相机负责截图更灵活方便。

最后编辑:
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
捐 赠写博客不易,如果您想请我喝一杯星巴克的话?就进来看吧!

留下一个回复

你的email不会被公开。 必填项已用 * 标注。