Unity CPU 中使用深度

Unity性能分析工具深度解析:从CPU、GPU到内存的优化实战指南 性能分析是游戏开发与软件工程中的核心环节,它通过采集和分析系统运行时数据,帮助开发者定位瓶颈、优化体验。其原理通常基于插桩采样、数据聚合与可视化呈现,能够精准度量CPU函数耗时、GPU渲染管线负载以及内存分配行为。这项技术的核心价值在于将性能问题从“主观感受”转化为“客观数据”,为优化决策提供科学依据,广泛应用于游戏、VR/AR、移动应用等高实时性要求的场景。在Unity引擎生态中,其内置的Profiler工具集成了CPU、GPU和内存分析模块,例如通过CPU层级视图能快速定位自耗时高的函数,而内存分析则能 阅读详情

Unity CPU 中使用深度贴图

大多数文章讲的都是在gpu中使用深度贴图 我记忆一下在CPU 中使用深度贴图。
我们今天利用深度贴图计算出世界坐标 。



前言

有射线的时候可以直接根据射线求出世界坐标。 如果没有包围盒子就很难根据鼠标输入求出世界坐标


一、把GPU中的深度贴图取出来

参考这个文章

     depthRT = new RenderTexture(Width, Height, 16, RenderTextureFormat.Depth);
     depthRT.name = "MainDepthBuffer";
     ///深度值 用 单通道  16bit 存起来
     depthTex = new RenderTexture(Width, Height, 0, RenderTextureFormat.R16);
     depthTex.name = "SceneDepthTex";
     _cbDepth = new CommandBuffer();
    _cbDepth.name = "CommandBuffer_DepthBuffer";
    ///得将深度贴图拷贝到一个 rendertexture 里面
    _cbDepth.Blit(depthRT.depthBuffer, depthTex.colorBuffer);

二、将根据鼠标输入取出RenderTexture里面的像素

      //将深度rendertexture拷贝到 texture2d
      myTexture = new Texture2D(Width, Height, TextureFormat.R16, false);
       RenderTexture.active = depthTex;

       Vector2 tmpPos = Input.mousePosition;

       int posX = Mathf.CeilToInt(tmpPos.x);
       int posY = Mathf.CeilToInt(tmpPos.y);

       myTexture.ReadPixels(new Rect(0, 0, Screen.width, Screen.height), 0, 0);
       myTexture.Apply();
       //取出某一个点的像素 r 通道即为 深度值
       Color tmpColor = myTexture.GetPixel(posX, posY);

三、求出距离相机的距离

根据这个文章
在这里插入图片描述

    float  CaculateZ( float d)
    {
         ///由于 DX 平台需要取反   有些平台不需要 
        float result = 1-d;

        float tmpMinus = _Camera.nearClipPlane - _Camera.farClipPlane   ;
        float tmpMuti = _Camera.farClipPlane * _Camera.nearClipPlane;
        result = ((tmpMinus * result) / tmpMuti) + (1.0f / _Camera.nearClipPlane);
        result = 1.0f / result;

        return result;
     }

四、算出世界坐标

     Vector3 screenPos = Input.mousePosition;
     float tmpZ = CaculateZ(tmpColor.r);
    
     screenPos.z = tmpZ ;

     Vector3 worldPos= Camera.main.ScreenToWorldPoint(screenPos);

Camera.main.ScreenToWorldPoint 这个输入值 Z 值表示距离 相机的距离 才能得到正确的 世界坐标。

可以使用另外一种方式算出世界坐标:
在相机前面摆一个 平面 ,然后用射线找到输入点的世界坐标

    void CaculateScreenDepth(float z)
    {

        Vector3 tmpZ = new Vector3(0, 0, z + _Camera.transform.position.z);
        Plane plane = new Plane(-Vector3.forward, tmpZ);

        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        float dist;
        if (plane.Raycast(ray, out dist))
        {
            Vector3 P = ray.GetPoint(dist);

            Debug.Log("p==" + P);

            GameObject tmpObj = GameObject.CreatePrimitive(PrimitiveType.Sphere);
            tmpObj.transform.localScale = Vector3.one * 0.1f;

            tmpObj.transform.position = P;
        }


    }

两种方式等价。

五、全部代码

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

public class TestDepth : MonoBehaviour
{

    private RenderTexture depthRT;
    private RenderTexture colorRT;
    private RenderTexture depthTex;

    private CommandBuffer _cbDepth = null;

    private Camera _Camera = null;

    public GameObject mainTexture;
    private void Awake()
    {
        _Camera = Camera.main;

        int Width =  Screen.width;
        int Height = Screen.height;

        _Camera.depthTextureMode = DepthTextureMode.Depth;

        depthRT = new RenderTexture(Width, Height, 16, RenderTextureFormat.Depth);
        depthRT.name = "MainDepthBuffer";
        colorRT = new RenderTexture(Width, Height, 0, RenderTextureFormat.ARGB32);
        colorRT.name = "MainColorBuffer";



        depthTex = new RenderTexture(Width, Height, 0, RenderTextureFormat.R16);
        depthTex.name = "SceneDepthTex";

        _cbDepth = new CommandBuffer();
        _cbDepth.name = "CommandBuffer_DepthBuffer";
        _cbDepth.Blit(depthRT.depthBuffer, depthTex.colorBuffer);

        
         myTexture = new Texture2D(Width, Height, TextureFormat.R16, false);
       // _cbDepth.Blit(depthTex.colorBuffer, myTexture);
        _Camera.AddCommandBuffer(CameraEvent.AfterDepthTexture, _cbDepth);

        mainTexture.GetComponent<Renderer>().material.mainTexture = myTexture;

    }

    float  CaculateZ( float d)
    {

        float result = 1-d;

        float tmpMinus = _Camera.nearClipPlane - _Camera.farClipPlane   ;
        float tmpMuti = _Camera.farClipPlane * _Camera.nearClipPlane;
        result = ((tmpMinus * result) / tmpMuti) + (1.0f / _Camera.nearClipPlane);


         result = 1.0f / result;

        return result;
     }

    Texture2D myTexture;
    private void Update()
    {
      

        if (Input.GetMouseButtonDown(0))
        {
          
            RenderTexture.active = depthTex;

            Vector2 tmpPos = Input.mousePosition;

            int posX = Mathf.CeilToInt(tmpPos.x);
            int posY = Mathf.CeilToInt(tmpPos.y);

            myTexture.ReadPixels(new Rect(0, 0, Screen.width, Screen.height), 0, 0);
            myTexture.Apply();

        
            Color tmpColor = myTexture.GetPixel(posX, posY);
        
   

            Vector3 screenPos = Input.mousePosition;
            float tmpZ = CaculateZ(tmpColor.r);
           
            screenPos.z = tmpZ ;

            Vector3 worldPos= Camera.main.ScreenToWorldPoint(screenPos);
           
        
          

        }

    }



    void OnPreRender()
    {
        _Camera.SetTargetBuffers(colorRT.colorBuffer, depthRT.depthBuffer);
    }

    private void OnPostRender()
    {
        //目前的机制不需要这次拷贝
        Graphics.Blit(colorRT, (RenderTexture)null);
    }



    void CaculateScreenDepth(float z)
    {

        Vector3 tmpZ = new Vector3(0, 0, z + _Camera.transform.position.z);
        Plane plane = new Plane(-Vector3.forward, tmpZ);

        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        float dist;
        if (plane.Raycast(ray, out dist))
        {
            Vector3 P = ray.GetPoint(dist);

            Debug.Log("p==" + P);

            GameObject tmpObj = GameObject.CreatePrimitive(PrimitiveType.Sphere);
            tmpObj.transform.localScale = Vector3.one * 0.1f;

            tmpObj.transform.position = P;
        }


    }



}

Unity Profiler 深度排查指南:3 个真实案例定位 CPU 与 GPU 瓶颈 本文通过三个真实案例详细解析如何使用Unity Profiler精准定位CPU与GPU性能瓶颈,涵盖工具配置、诊断步骤及优化策略。从Gfx.WaitForPresent GPU过载到内存带宽危机,提供实战解决方案,帮助开发者提升游戏性能优化效率。 阅读详情

相关推荐

Unity Profiler 深度分析:3 个实战案例定位 CPU/GPU 性能瓶颈

本文深入探讨了Unity Profiler在性能优化中的高级应用,通过三个实战案例详细解析如何定位和解决CPU/GPU性能瓶颈问题。从GC卡顿、DrawCall爆炸到Shader耗时,文章提供了专业的技术分析和优化方案,帮助开发者提升游戏性能。

weixin_34216107的博客 370

【Unity小技巧】记一个RenderTexture无法正确输出Camera视图下的Depth渲染的问题

这个问题出现在使用URP管线时,我试图用Shader实现血条的制作,并用RenderTexture将视图渲染到RawImage上。但是渲染结果出现了问题:可以看到液体边缘的渲染出现了错误,原因不明似乎是摄像机渲染到RenderTexture时Shader的透明度测试的问题?

milu_ELK的博客 1061

Unity性能分析器深度指南:从CPU、内存到GPU的实战优化

在游戏与应用开发中,性能优化是保障流畅用户体验的核心环节。其原理在于通过实时监控与分析应用的运行时资源消耗,定位瓶颈所在。这项技术的核心价值在于将性能调优从经验猜测转变为数据驱动的科学过程,能显著提升应用在移动端、WebGL及数字孪生等复杂场景下的稳定性和效率。常见的应用场景包括解决运行时卡顿、内存泄漏、渲染效率低下等问题。本文聚焦于Unity 2022.3 LTS的性能分析器(Profiler),这一综合诊断工具如同开发者的“听诊器”,能深入剖析CPU耗时、内存分配(如**GC.Alloc**引发的垃圾回

weixin_42519826的博客 305

Unity3D Shader系列之深度纹理

详细解释了深度纹理存储的内容,给出了OpenGL与DirectX平台下的裁剪矩阵,推导了获取线性深度值的公式,详细介绍了深度值精度问题出现的原因以及为什么Reverse Z可以解决此问题,并给出了Unity中实现场景扫描的实现。

老王的博客 8482

Unity性能优化全攻略:从CPU、GPU、内存到I/O的深度实践

性能优化是游戏开发中的核心工程实践,其本质在于高效管理计算机的有限硬件资源,包括CPU、GPU、内存和I/O。理解其底层原理,如渲染管线、垃圾回收机制和异步编程模型,是进行有效优化的基础。这项技术的核心价值在于提升应用流畅度、降低功耗并保障稳定性,尤其在移动端和大型项目中至关重要。应用场景广泛,涵盖实时渲染、资源加载和复杂逻辑运算。本文以Unity引擎为例,系统性地拆解了性能监控、脚本优化、渲染合批、内存管理等关键技术,并提供了针对移动端的特殊优化策略。通过结合对象池、Job System、GPU Inst

weixin_33164198的博客 322

Unity零基础到进阶 | Unity SRP Batcher深度解析:现代渲染管线的CPU性能优化基石

SRP Batcher(Scriptable Render Pipeline Batcher)是Unity在2019.3版本引入的底层渲染优化机制,专为URP(通用渲染管线)、HDRP(高清渲染管线)及自定义SRP设计,核心目标是大幅降低CPU在渲染阶段的开销,尤其在包含大量渲染对象的复杂场景中效果显著。 与传统的Draw Call合并(如Static Batching和Dynamic Batching)不同,SRP Batcher的优化思路是减少Draw Call之间的渲染状态切换成本,而非简单合并Dr

努力前行,总会成为自己心中的那道光 1万+

unity-shader-深度图及其应用

title: unity-shader-深度图及其应用 categories: Unity3d-Shader tags: [unity, shader, 深度图, depth] date: 2019-05-13 20:44:51 comments: false unity-shader-深度图及其应用 前篇 Unity Shader - 深度图基础及应用 (比较详细的记录了深度图) -...

. 1万+

【工具】GitHub学生认证+PyCharm配置Copilot全流程指南

本文提供了一份详细的GitHub学生认证及在PyCharm中配置Copilot的完整指南。通过完成A2F认证、准备有效材料并使用干净网络环境,学生可免费获取GitHub Copilot Pro订阅,极大提升编程学习与开发效率。

w7x8y9z的博客 1459

unity shaderlab 相机深度图渲染 Shader+C# 脚本教程(带代码详解)

本文介绍了一种相机深度图渲染方案,通过Shader与C#脚本协作实现场景深度可视化。Shader核心逻辑是采样Unity内置的_CameraDepthTexture深度纹理,将非线性深度值转为[0,1]线性范围并以黑白颜色映射(近白远黑)。C#脚本负责启用相机深度纹理生成,并通过OnRenderImage将相机画面用深度Shader处理。实现步骤包括创建深度Shader材质、挂载相机脚本、配置深度纹理模式。该方案适用于深度可视化、景深特效开发等场景,完整代码可直接用于项目实践。

失业求捞! 3828

从《视觉SLAM十四讲》到项目实战:一文读懂拓扑地图与语义地图为何是服务机器人的未来

本文探讨了服务机器人地图技术的演进,从传统几何地图到拓扑地图与语义地图的跨越。通过分析栅格地图的局限性和拓扑地图、语义地图的优势,揭示了它们在动态开放环境中的智能应用。文章还介绍了多模态语义融合架构和动态语义更新技术,为服务机器人的未来发展提供了技术路线图。

weixin_30292843的博客 478

告别sgmediation!Stata中介效应分析新选择:mediation包完整操作指南

本文介绍了Stata中介效应分析从传统sgmediation命令向mediation包的范式升级。重点阐述了如何使用medeff和medsens命令进行更严谨的因果推断,并执行关键的敏感性分析,以评估结果对未观测混杂的稳健性,为学术研究提供发表级的分析工具。

redis7keeper的博客 1159

Unity中URP下实现深度贴花

在游戏中,有很多用到贴画的地方。比如:地面污渍、地面喷漆、地面血迹、魔法阵、地裂等效果。我们在这篇文章中,来用深度图实现一下贴画的效果。

楠溪泽岸的博客 3210

一个响应ping包延迟偏大的问题

前段时间客户反馈一个使用pc上的命令行ping无线设备(WiFi4)时,设备平均响应时间(测试时长2小时,1秒Ping一次)相比其它机型偏慢的问题,并上传上具体的时间的Log.从log中看到,大多数包的响应还是比较快的,只是个别响应时间较长,且响应时间长的包时间几乎都是一样的100多ms.如下是部分响应时间截图. 整个2小时的测试时间里,总是时不时的出这么上102,104ms的响应时间,这直接导致了平均响应时间被拉大.于是本地测试,也发现了类似的延迟.本地测试时,现象略有...

流风回雪的博客 1万+

Unity渲染流水线深度解析:从CPU到GPU的完整渲染流程与性能优化

渲染流水线是现代计算机图形学的核心概念,它定义了三维场景如何被转换为二维屏幕图像的标准流程。其基本原理是将渲染任务划分为应用阶段、几何阶段和光栅化阶段,通过CPU与GPU的协同工作实现高效图形渲染。这一架构的技术价值在于为开发者提供了控制渲染细节的标准化接口,是实现复杂视觉效果和性能优化的基础。在游戏开发、虚拟现实、数据可视化等应用场景中,深入理解渲染流水线是解决渲染问题、提升应用性能的关键。本文聚焦于Unity引擎中的渲染管线实现,详细拆解了DrawCall提交、顶点变换、片元着色等核心环节,并针对Sha

weixin_30263277的博客 358

verilog CORDIC对数运算

verilog CORDIC对数运算

m0_64355812的博客 1736

Vue3 - [兼容PC和手机H5] 详细监听浏览器刷新 / 关闭 / 前进后退事件,用户点击关闭和刷新页面前 “拦截“ 操作并弹出提示框(实时监听用户关闭或刷新网页,触发时文字提醒并执行自定义操作)

vue3监听页面关闭和刷新,vue3中如何监听页面刷新和关闭事件,vue3中监听浏览器窗口关闭事件,并在窗口关闭进行操作,vue3怎么只在某个页面监听,其他页面不监听,vue3监听刷新和关闭怎么离开页面时注销释放,vue3怎么阻止浏览器前进和后退并提示,页面跳转离开后依旧可以监听到刷新和关闭,vue3怎么知道用户关闭了网页,vue3如何监听刷新网页操作并截断,vue3移动端手机h5网页手机网站监听浏览器刷新关闭,vue3当页面关闭或刷新时怎么提示用户离开不保存数据,vue3项目监听浏览器窗口或标签页关闭,并

🏆 前端领域优质创作者 1万+

Unity渲染流程深度解析:从CPU调度到GPU绘制的实时管线

渲染流程是实时图形学的核心概念,指CPU组织数据、GPU执行计算并最终输出像素的完整链路。其底层原理涉及命令缓冲、GPU队列调度与帧同步机制,技术价值在于决定帧率稳定性、Draw Call效率与内存带宽利用率。典型应用场景包括游戏性能优化、UI闪烁排查、阴影异常诊断及后处理瓶颈定位。理解该流程,需掌握Culling裁剪逻辑、Setup阶段状态切换开销、Draw阶段顶点/片元着色器硬件协同,以及Post-Processing全屏Pass叠加特性。本文聚焦Unity引擎中真实项目可验证的渲染四阶段——Culli

weixin_30596023的博客 639

欺诈文本分类微调(一):基座模型选型

通义千问Qwen2具有0.5B、1.5B、7B、72B等一系列参数大小不等的模型,我们需要做的是从大到小依次测试每个模型的能力,找到满足自己需要的最小参数模型。依1.5B和1.5B-Instruct的主要区别:按照官方文档,前者是预训练模型,后者是经过指令微调的模型。

golfxiao的专栏 2655

Unity Profiler性能剖析实战:从CPU、内存到GPU的深度优化指南

在游戏与应用开发中,性能优化是保障用户体验的核心环节。其原理在于通过系统性的监控与分析工具,深入理解应用在运行时对计算、内存及图形资源的消耗模式。这项技术的核心价值在于将性能问题从模糊的感知转化为可量化的数据,从而精准定位瓶颈,指导高效优化。在实际开发场景中,无论是应对移动端的卡顿、解决内存泄漏,还是优化高负载的渲染管线,都需要一套科学的工作流。Unity Profiler正是实现这一目标的专业工具链,它提供了从CPU耗时分析、内存分配追踪到GPU渲染剖析的完整视角。通过掌握其模块化工具链,包括CPU Us

weixin_29009669的博客 235

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

OpenSeeFace深度解析:CPU实时面部追踪的革命性突破与Unity集成指南

OpenSeeFace是一款革命性的开源面部追踪库,专注于在CPU上实现高性能的实时面部及特征点追踪,并提供无缝的Unity集成方案。它采用MobileNetV3架构构建面部特征点检测模型,通过ONNX Runtime优化,在普通计算机上即可达到30-60fps的追踪速度,为虚拟形象驱动、实时交互等场景提供了强大支持。 ## 🌟 核心优势:重新定义CPU面部追踪体验 传统面部追踪方案往往依赖

gitblog_00156的博客 610

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

不一样的视角,深度解读unity性能优化。unity性能优化,unity内存优化,cpu优化,gpu优化,资源优化,资源包、资源去重优化,ugui优化。

通过从多个角度进行优化,可以显著提高Unity游戏的性能。物理计算:减少触发器和刚体使用、优化碰撞体的数量和复杂性、利用Layer Collision Matrix进行分层碰撞检测。模型和渲染:使用LOD技术、遮挡剔除、简化模型顶点。动画:减少关键帧、简化Animator状态机。布料模拟:减少布料物理模拟的使用。对象管理:实现对象缓存池来减少对象实例化。导航网格:调整NavMesh的精度和分区来优化寻径计算。

fengya1的专栏 3311

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Unity SRP Batcher深度解析:CPU渲染瓶颈与Shader结构优化实战

SRP Batcher是Unity现代渲染管线(URP/HDRP)中专为缓解CPU端渲染指令生成开销而设计的核心机制,其本质并非减少DrawCall数量,而是通过复用Uniform Buffer模板来压缩材质属性提取与常量缓冲区组装的重复计算。它依赖严格的Shader CBUFFER内存布局一致性——尤其是UnityPerMaterial块内的字段对齐、类型约束与纹理分离原则,一旦违反(如Texture误入Material级CBUFFER或float3后紧跟float导致字节偏移错乱),即触发全组退批。该机

weixin_33050117的博客 374

unity unity改变kinect深度颜色_Unity性能优化经验分享

在Unite Copenhagen 2019上,Unity技术支持工程师Ignacio Liverotti进行了一次主题为《性能优化经验分享》的演讲,旨在帮助中级Unity开发者诊断和解决遇到的性能问题。作为Unity EMEA(欧洲、中东和非洲)地区的咨询及开发团队的技术支持工程师。Ignacio Liverotti在大部分时间中会和Unity的大客户进行接触,帮助他们解决项目中出现的...

weixin_39869959的博客 453

unity 性能分析工具 --Profiler

一, 概述:   profiler 可以让你查看在游戏各方面花费的时间,分析GPU,CPU和内存,渲染和音频的性能。  使用时要关注消耗时间最多的部分 ,比较代码更改前后的分析结果,但是会影响帧率。 二,窗口信息    打开方式:Windows-profiler   当游戏运行且探查器正在收集数据时,单击任何这些传输控件会暂停游戏,"current"传输按钮使配置文件统计窗口显示实时收...

nt_xs_j的博客 4628

Unity Android构建报错“Select at least one Android CPU/ABI”深度解析与解决方案

在移动应用开发中,跨平台兼容性是核心挑战之一,尤其在Android生态中,设备碎片化问题突出。这背后涉及的关键技术原理是CPU架构(ABI)的适配,不同的处理器(如ARMv7、ARM64)需要不同的本地机器码才能高效运行。理解并正确配置目标架构,对于确保应用性能、兼容性以及满足应用商店(如Google Play的64位强制要求)规范至关重要。在Unity引擎中,这一配置集中体现在PlayerSettings的“Target Architectures”与“Scripting Backend”选项中。错误配置

weixin_33519829的博客 281
上一篇: webgl 整数 或者浮点数越界问题
下一篇: unity webgl与 js 交互
ithinking110
博客等级 码龄14年 54粉丝 52原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值