Unity 检测手机性能,区分高中低端机型(URP)

这篇具有很好参考价值的文章主要介绍了Unity 检测手机性能,区分高中低端机型(URP)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

有兴趣可查看之前写的标准渲染管线的版本

适配了URP渲染管线,并增加了抛弃第一次采样的数据(涉及Shader编译会影响采样数据)

可设置隔帧采样不影响游戏运行

一般在游戏启动进登录界面时可以开始,Camera设置为场景相机

unity 机型分档位的规则,unity,游戏引擎,性能评分,机型适配,c#

 注意:

Maximum Sample Counter和Draw Times Per Batch不宜设置太高,否则可能出现在UPR或者UWA报告中看到DrawCall和面数超高的情况

Mesh最好在500面左右

using Logic;
using Sirenix.OdinInspector;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using UnityEngine;
using UnityEngine.Rendering;

public class GPUPerformanceTest : MonoBehaviour
{
    public Camera Camera;
    public Material Material;
    public Mesh Mesh;

    RenderTexture texture;

    float startTestTime;
    int sampleCounter;
    int skipCounter;
    public int skipSample = 1; // 丢弃采样,第一次渲染可能涉及shader编译,会影响统计数据
    public int maximumSampleCounter = 5;
    public int DrawTimesPerBatch = 100;
    public int BatchCountPerFrame = 1;
    public int FrameTimeMS = 10;
    public int DelayFramePerTest = 5;

    public float ScoreScale = 1;
    public float ScoreAdjust = 0;

    //public int MaximumDrawCount = 5000;

    long elapsedMS;

    [HideInInspector]
    public float TestScore = 0;// 性能测试评分

    private int _TotalDrawTimes = 0;
    private long _TotalDrawMilliseconds = 0;

    int delayFrameCounter;

    public bool RunOnStart = true;

    public Action OnComplete;

    enum TestState
    {
        Waiting,
        Tasting,
        Delaying,
        Completed,
        Freeze,
    }

    TestState State;

    private void Awake()
    {
        State = TestState.Waiting;
    }
    private void Start()
    {
        if (RunOnStart)
        {
            StartTest();
        }
    }
    [Button]
    public void StartTest()
    {
        sampleCounter = 0;
        skipCounter = 0;
        delayFrameCounter = 0;
        startTestTime = Time.realtimeSinceStartup;

        if (!this.gameObject.activeSelf)
        {
            this.gameObject.SetActive(true);
        }

        State = TestState.Tasting;
        Common.Log.Info("Performance test begin-------------");
    }

    private void OnEnable()
    {
        //texture = RenderTexture.GetTemporary(Camera.pixelWidth, Camera.pixelHeight, 0, UnityEngine.Experimental.Rendering.GraphicsFormat.R16G16B16A16_SFloat);

        RenderPipelineManager.endCameraRendering += RenderPipelineManager_endCameraRendering;

    }
    void TestDrawMesh()
    {
        long milliseconds = 0;
        int draw_times = 0;

        var stopwatch = Stopwatch.StartNew();
        for (int n = 0; n < BatchCountPerFrame; ++n)
        {
            {

                for (int i = 0; i < DrawTimesPerBatch; ++i)
                {
                    CommandBuffer commandBuffer = new CommandBuffer();

                    Vector3 look = this.Camera.transform.TransformDirection(Vector3.forward);
                    Vector3 pos = this.Camera.transform.position + look.normalized * 10;
                    RenderTargetIdentifier targetIdentifier = new RenderTargetIdentifier(texture);
                    commandBuffer.DrawMesh(Mesh, Matrix4x4.TRS(pos, Quaternion.identity, Vector3.one), Material);

                    Graphics.ExecuteCommandBuffer(commandBuffer);

                    draw_times++;
                }
            }

            if (stopwatch.ElapsedMilliseconds > FrameTimeMS)
            {
                break;
            }

            //             if (_TotalDrawTimes >= MaximumDrawCount)
            //             {
            //                 break;
            //             }
        }
        stopwatch.Stop();

        milliseconds = stopwatch.ElapsedMilliseconds;

        _TotalDrawTimes += draw_times;
        _TotalDrawMilliseconds += milliseconds;
    }
    private void RenderPipelineManager_endCameraRendering(ScriptableRenderContext arg1, Camera arg2)
    {
        if (State != TestState.Tasting)
            return;

        TestDrawMesh();

        sampleCounter++;

        if (skipCounter < skipSample)
        {
            skipCounter++;

            sampleCounter = 0;
            _TotalDrawTimes = 0;
            _TotalDrawMilliseconds = 0;
        }

        if (sampleCounter >= maximumSampleCounter)
        //if (_TotalDrawTimes >= MaximumDrawCount)
        {
            State = TestState.Completed;
        }
        else
        {
            delayFrameCounter = 0;
            State = TestState.Delaying;
        }
    }

    private void Update()
    {
        switch (State)
        {
            case TestState.Delaying:
                {
                    if (delayFrameCounter >= DelayFramePerTest)
                    {
                        State = TestState.Tasting;
                    }
                    delayFrameCounter++;
                }
                break;
            case TestState.Completed:
                {
                    TestScore = 1.0f * _TotalDrawTimes / Mathf.Max(1, _TotalDrawMilliseconds);
                    TestScore = TestScore * ScoreScale + ScoreAdjust;

                    Common.Log.Info($"Performance test draw mesh time(MS): {_TotalDrawMilliseconds}, draw times: {_TotalDrawTimes}, score: {TestScore}. ({Time.realtimeSinceStartup - startTestTime}s");

                    State = TestState.Freeze;

                    OnComplete?.Invoke();
                }
                break;
            case TestState.Freeze:
                {
                    this.gameObject.SetActive(false);
                }
                break;
        }
    }
    private void OnDisable()
    {
        RenderPipelineManager.endCameraRendering -= RenderPipelineManager_endCameraRendering;

        //RenderTexture.ReleaseTemporary(texture);
    }
}

 文章来源地址https://www.toymoban.com/news/detail-525365.html

到了这里,关于Unity 检测手机性能,区分高中低端机型(URP)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MIUI系统ROM固件,小米手机所有历史全部机型合集

    小米所有ROM镜像系统刷机包下载,小米官方原版rom系统镜像没有任何修改,有需求小米miui官方ROM的,可以自行下载,本站提供小米手机ROM、小米红米ROM、小米noteROM、红米noteROM及小米平板ROM系统包索引,包含最新miuirom和历史miui系统包,涵盖国行版、国际版、欧洲版、印度版

    2024年02月12日
    浏览(46)
  • 玩机搞机---全网最详细的手机全机型 刷机教程一

    今天的系列教程给大家详细的指导手机刷机的全部步骤。从基本的卡刷到各芯片的线刷步骤与有些刷机中各个选项的详细说明。让最基本的用户都可以轻易上手刷机。当然各个机型版本较多。虽然可能界面略有不同。但最基本的选项操作没有太大的区别。   【刷机简介】 通

    2024年02月09日
    浏览(48)
  • emui免root改MAC,手机机型修改免root

    修改mac地址的方法: 前提是机器必须ROOT,和有安装RE管理器(或ES文件浏览器)。 1.关闭WIFI,2.重启手机,3.RE管理器进入 data/misc/wifi目录找到macwifi,长按选择 在文本编辑器中打开。修改成你想要的mac地址后保存退出,OK(注:修改0~9 A~F 不要有符号) mate8亲测成功 修改

    2024年02月04日
    浏览(40)
  • root清理手机预装软件,安卓全机型卸载预装软件免root

    删除方法如下: 1,对于安卓预装系统应用的卸载方法,我们可以借助手机类管理来实现。比如“百度手机卫士”、“360手机卫士”以及“刷机类软件”来实现。在此就以“360手机卫士”卸载预装应用在例进行说明。 2,打开“360手机卫士”程序,在其主界面中点击“软件管理

    2024年02月10日
    浏览(40)
  • 【Unity URP】URP Camera使用及动态设置

    官方文档:   摄像机 | Universal RP | 12.1.1 https://docs.unity3d.com/cn/Packages/com.unity.render-pipelines.universal@12.1/manual/cameras.html 相机类型: Render Type(渲染类型) Base(基础相机):渲染到特定渲染目标的通用相机,场景中必须至少有一个。 Overlay(叠加相机):将其视图渲染在另一个摄

    2024年02月12日
    浏览(43)
  • 性能测试、负载测试、压力测试、稳定性测试简单区分

    是一个总称,可细分为性能测试、负载测试、压力测试、稳定性测试。 以系统设计初期规划的性能指标为预期目标,对系统不断施加压力,验证系统在资源可接受范围内,是否能达到性能瓶颈。 提取理解 有性能指标,验证 性能测试目标 验证系统的性能指标,是否为

    2024年02月09日
    浏览(43)
  • Unity 基础之 URP 项目创建\项目转URP Pipline

    目录 Unity 基础之 URP 项目创建项目转URP Pipline 一、简单介绍 二、创建 URP 项目 三、工程项目转 URP Unity中的一些基础知识点,方便日后查阅。 Unity游戏开发中,这里简单介绍如何创建 URP 工程项目,和把已有项目转为 URP 项目的过程,这里做简单记录,如果有不对,欢迎指出。

    2024年02月16日
    浏览(48)
  • Unity——URP相机详解

    2021版本URP项目下的相机,一般新建一个相机有如下组件 1:Render Type( 渲染类型 ) 有Base和Overlay两种选项,默认是Base选项         Base:主相机使用该种渲染方式,负责渲染场景中的主要图形元素         Overlay(叠加):使用了Oveylay的相机会把它渲染出的图形叠加到其他相机之上

    2024年02月05日
    浏览(48)
  • 【Unity URP】手写PBR:从build-in转到URP

    写在前面 后续要在URP下实现PBR+NPR的风格化渲染,所以这里要赶紧把之前手写的PBR挪到URP管线下。由于URP各个版本更新换代太快了,贴一下项目环境,给后面看到这篇文章的小伙伴提个醒,我的项目环境: URP12.1.7 Unity2021.3.8f1 整体框架几乎一样吧,目前先实现主光源的部分,

    2024年02月14日
    浏览(78)
  • Unity URP 平面反射笔记

    平面反射的具体内容可以参考以下几篇文章,都总结得很不错: https://zhuanlan.zhihu.com/p/493766119?utm_id=0 https://blog.csdn.net/Phantom1516/article/details/128762625 https://blog.csdn.net/puppet_master/article/details/80808486 下面是平面反射实现的具体思路: 首先在原相机的基础上拷贝一个反射摄像机,其位

    2024年02月09日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包