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万+

三维重建之条纹投影结构光(三)——相位展开优化与多频外差实践

本文深入探讨了三维重建中条纹投影结构光技术的核心环节——相位展开优化。针对传统路径跟踪法存在的误差传播与路径依赖问题,重点解析了多频外差法的原理与优势,并通过详细的C++代码实践,展示了如何利用三频外差法实现鲁棒、高精度的相位展开,从而获得连续的绝对相位图,为后续三维点云生成奠定坚实基础。

weixin_29074295的博客 531

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

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

失业求捞! 3828

Unity2D像素刀光实现:粒子方向控制与像素级渲染规范

像素风游戏中的刀光特效并非普通粒子动画,而是需严格遵循像素艺术原理的视觉暂留模拟。其核心在于将‘瞬时切割感’转化为程序可执行的渲染逻辑:通过禁用纹理滤波保障1:1像素锐度,绑定刀锋向量控制粒子运动方向,限定≤0.15秒生命周期匹配人眼暂留阈值,并采用Stretched Billboard实现动态拉伸拖影。该方案兼顾美术语义(如直劈、横扫、突刺)与工程约束(Sorting Layer分层、对象池复用、单粒子GPU优化),广泛适用于Unity2D平台的动作反馈系统,尤其适配《空洞骑士》《死亡细胞》类高节奏像素R

weixin_32390647的博客 283

STM32F407+LAN8720A+LwIP实战:FreeModbus TCP从机功能开发指南

本文详细介绍了基于STM32F407和LAN8720A硬件平台,结合LwIP协议栈实现FreeModbus TCP从机功能的开发指南。内容涵盖硬件连接、LwIP移植、FreeModbus TCP从机实现、任务调度及调试技巧,为工业控制领域的以太网通信开发提供实用参考。

weixin_29190651的博客 546

Unity中URP下实现深度贴花

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

楠溪泽岸的博客 3210

告别过热焦虑:用Ansys Icepak给你的电子设备做个“水冷体检”(附冷板案例全流程)

本文详细介绍了如何利用Ansys Icepak进行电子设备水冷系统的热仿真分析,帮助工程师解决设备过热问题。通过冷板案例全流程演示,展示了从几何处理、材料设定到求解器设置和后处理的关键步骤,提升散热设计效率与准确性。

weixin_29299807的博客 441

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

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

weixin_30263277的博客 358

VSCode PlantUML 插件超详细教程:从安装配置到实战绘图全流程

VSCode PlantUML 插件超详细教程:从安装配置到实战绘图全流程

weixin_69237381的博客 911

物流分拣YOLO实战:YOLO26 OBB+YOLOv8多尺度融合,不规则包裹分拣效率提升40%(附训练+部署代码)

在物流分拣的工业场景中,模型的检测精度、推理速度、部署友好性本次基于YOLO26 OBB+YOLOv8多尺度融合打造的物流分拣视觉检测方案,精准解决了工业场景中不规则包裹的旋转检测、多尺度包裹的漏检问题,最终实现分拣效率提升40%,检测准确率提升至95%以上,且模型在边缘设备上的推理帧率稳定35FPS+,完全适配物流分拣的工业落地需求。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 882

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

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

weixin_30596023的博客 639

YOLO11改进|卷积篇|引入SPDConv

YOLO11中添加SPDConv卷积

A1983Z的博客 3696

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

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

weixin_29009669的博客 235

英伟达DeepStream学习笔记7——DeepStream接入USB相机并实现广角摄像头的畸变矫正

deepstream官方提供了一个畸变矫正的例子,包含了鱼眼和普通广角的矫正。我目前准备做一个广角的畸变矫正,我已经使用opencv实现功能,目前增加到deepstream框架中。示例代码在\opt\nvidia\deepstream\deepstream-5.0\sources\apps\sample_apps\deepstream-dewarper-test 中,鱼眼矫正——deepstream官方版 https://developer.nvidia.com/blog/calibration-trans

耶律大石的博客 1602

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

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

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

gitblog_00156的博客 610

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

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

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

fengya1的专栏 3311

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

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、付费专栏及课程。

余额充值