Unity 问题之 开发应用在设备上运行闪屏花屏问题的分析处理

ops/2024/9/25 19:14:18/

Unity 问题之 开发应用在设备上运行闪屏花屏问题的分析处理

目录

Unity 问题之 开发应用在设备上运行闪屏花屏问题的分析处理

一、简单介绍

二、问题现象

三、问题分析

四、使用空后处理,解决闪屏花屏显示问题

五、空后处理完整代码


一、简单介绍

Unity 在开发中,记录一些报错问题,以便后期遇到同样问题处理。

二、问题现象

背景是这样的,由于开发需要,应用需要引入 OpenXR 。

在没有引用 OpenXR 之前,应用 UI  什么等,显示正常,在引用 OpenXR 后,应用打包,运行在设备上,显示却出现了闪屏花屏的现象,如下图:

三、问题分析

1、首先这些都是 UI 元素,且这些 UI Canvas 使用的 Render Mode 是 World Space

2、由于涉及到世界空间的 UI 渲染,又由于 在Unity中使用OpenXR时,Canvas的显示可能会受到渲染层级和摄像机设置的影响。Canvas的显示不正常可能是由于Canvas与OpenXR的深度测试或渲染层级相关的问题。

相机渲染原理:

硬件中会分配一块区域,作为帧缓存,当然,如果是双缓冲的话,会分配两块。主缓冲区用于显示,副缓冲区可以进行离屏渲染。最终,副缓冲区中的内容会被复制到主缓冲区,显示出来。


另外一项功能是锁定内存。在访问这些内存和读写缓存时,需要先对内存进行锁定,读写完成之后,解除对内存的锁定。主缓存和副缓存只在锁定期间有用,并且,不能认为在下一次锁定时,缓存地址仍然是相同的。这是硬件的一种特征,它可能会移动帧缓存。

清除缓存用于清屏。一般用黑色来清除。主缓存用来显示,所以,一般只清除副缓存;之后将新的要显示的东西写入副缓存,然后执行主副缓存的交换,最后显示显示器上。

3、要进一步解决Canvas显示不正常的问题,你可以尝试以下几个方法:

  • 调整Canvas的渲染层级: 确保Canvas的渲染层级设置正确,使其能够在正确的深度上正确显示。你可以尝试调整Canvas的Order in Layer属性来改变渲染顺序。

  • 检查摄像机设置: 确保Canvas所在的摄像机设置正确,使其能够正确显示Canvas内容。你可以尝试调整摄像机的深度、裁剪平面、投影方式等设置。

  • 使用Canvas Overlay: 如果可能的话,尝试添加一个Canvas Overlay来覆盖其他Canvas。Canvas Overlay通常会被设置在最上层,并且不受深度测试的影响,因此可以用来解决显示不正常的问题。

  • 检查OpenXR插件设置: 检查OpenXR插件的设置,确保与Canvas和摄像机的设置兼容。有时,OpenXR的设置可能会影响Canvas的显示

然后使用 Canvas Overlay 做了一个辅助渲染,果然渲染正常了

(就是 UI Canvas 使用的 Render Mode 是 ScreenSpace - Overlay)

4、但是添加一个额外的 Canvas Overlay 做了一个辅助渲染,有点破坏当前开发场景的嫌疑,

考虑到 Canvas的显示受到了渲染层级和摄像机设置的影响,其实可以考虑使用一个空的后处理,因为 空的后处理通常不会实际修改输入图像,但它们可能会影响渲染管线中的其他部分,从而解决一些显示问题。

四、使用空后处理,解决闪屏花屏显示问题

空后处理的代码其实很简单,如下图

空的后处理脚本通常不会实际修改输入图像,但它们可能会影响渲染管线中的其他部分,从而解决一些显示问题。以下是一些可能的原因:

  1. 渲染顺序和深度测试: 在渲染管线中,后处理通常是在渲染目标绘制完成后应用的。这意味着在应用后处理之前,所有其他的渲染工作都已经完成。在某些情况下,重新排列或调整渲染顺序可能会解决一些显示问题。

  2. 渲染目标的清除: 在一些情况下,渲染目标可能会被清除或重置。通过将一个空的后处理效果应用到最终渲染目标,可以确保目标不会在渲染管线的某些阶段被错误地清除或重置。

  3. 深度缓冲区的设置: 后处理脚本可能会影响渲染管线中的深度缓冲区设置。如果深度缓冲区的设置不正确,可能会导致一些显示问题,而通过应用一个空的后处理效果,可能会重置或修复深度缓冲区的状态。

  4. 其他渲染设置和状态: 在渲染管线中可能会涉及到其他许多设置和状态,这些设置和状态可能会影响最终的显示结果。通过应用一个空的后处理效果,可能会对这些设置和状态进行重置或调整,从而解决一些显示问题。

总的来说,虽然空的后处理脚本本身并不会对图像做任何修改,但它们可能会通过影响渲染管线中的其他部分来解决一些显示问题。因此,在解决一些显示问题时,尝试应用一个空的后处理效果是一个常见的技巧。

这时候把空后处理脚本挂载到摄像机 Camera 组价上,打包运行到设备上,此时设备上也能正常显示

五、空后处理完整代码

using UnityEngine;/// <summary>
/// 自定义空处理
/// 处理些显示问题
/// 可以事先挂载在 Camera 组件上
/// </summary>
public class CustomEmptyPostProcessing : MonoBehaviour
{/// <summary>/// 空处理/// 处理一些显示问题/// </summary>/// <param name="source"></param>/// <param name="destination"></param>void OnRenderImage(RenderTexture source, RenderTexture destination){// 将输入纹理渲染到目标纹理Graphics.Blit(source, destination);}
}/**  说明* 空的后处理脚本通常不会实际修改输入图像,但它们可能会影响渲染管线中的其他部分,从而解决一些显示问题。以下是一些可能的原因:1、渲染顺序和深度测试: 在渲染管线中,后处理通常是在渲染目标绘制完成后应用的。这意味着在应用后处理之前,所有其他的渲染工作都已经完成。在某些情况下,重新排列或调整渲染顺序可能会解决一些显示问题。2、渲染目标的清除: 在一些情况下,渲染目标可能会被清除或重置。通过将一个空的后处理效果应用到最终渲染目标,可以确保目标不会在渲染管线的某些阶段被错误地清除或重置。3、深度缓冲区的设置: 后处理脚本可能会影响渲染管线中的深度缓冲区设置。如果深度缓冲区的设置不正确,可能会导致一些显示问题,而通过应用一个空的后处理效果,可能会重置或修复深度缓冲区的状态。4、其他渲染设置和状态: 在渲染管线中可能会涉及到其他许多设置和状态,这些设置和状态可能会影响最终的显示结果。通过应用一个空的后处理效果,可能会对这些设置和状态进行重置或调整,从而解决一些显示问题。总的来说,虽然空的后处理脚本本身并不会对图像做任何修改,但它们可能会通过影响渲染管线中的其他部分来解决一些显示问题。因此,在解决一些显示问题时,尝试应用一个空的后处理效果是一个常见的技巧。 */


http://www.ppmy.cn/ops/22994.html

相关文章

docker各目录含义

目录含义builder构建docker镜像的工具或过程buildkit用于构建和打包容器镜像&#xff0c;官方构建引擎&#xff0c;支持多阶段构建、缓存管理、并行化构建和多平台构建等功能containerd负责容器生命周期管理&#xff0c;能起、停、重启&#xff0c;确保容器运行。负责镜管理&am…

制作一个RISC-V的操作系统十四-任务同步和锁

文章目录 并发与同步临界区和锁锁死锁解决死锁自旋锁&#xff08;spin lock&#xff09;原子性问题原子操作实现amoswap.w.aq例子 另一种方法自旋锁的注意事项代码其他同步技术 并发与同步 控制流&#xff1a;可理解为任务或进程 中断也可以理解为一个切换到另一个任务&#…

目标检测YOLO实战应用案例100讲-基于YOLOv5的目标检测与6D位姿估计算法研究(中)

目录 3.3 相机成像原理 3.3.1 坐标系的建立及关系 3.3.2 相机标定 3.3.3 相机畸变

自动驾驶横向控制算法

本文内容来源是B站——忠厚老实的老王&#xff0c;侵删。 三个坐标系和一些有关的物理量 使用 frenet坐标系可以实现将车辆纵向控制和横向控制解耦&#xff0c;将其分开控制。使用右手系来进行学习。 一些有关物理量的基本概念&#xff1a; 运动学方程 建立微分方程 主要是弄…

分布式与一致性协议之Paxos算法(三)

Paxos算法 兰伯特关于Multi-Paxos的思考 领导者 我们可以通过引入领导者(Leader)节点来解决第一个问题。也就是说将领导者节点作为唯一提议者&#xff0c;如图所示。这样就不存在多个提议者同时提交提案的情况&#xff0c;也就不存在提案冲突的情况了。这里补充一点:在论文中…

Word插件开发

VSTO是Visual Studio Tools for Office的简称&#xff0c;它是Microsoft Visual Studio的一个扩展&#xff0c;用于开发基于Microsoft Office平台的应用程序。VSTO提供了一套API和工具&#xff0c;使开发人员能够利用Visual Studio IDE来开发定制的Office解决方案。 在 Visual…

【Nginx】(七)HAProxy+Nginx实现高可用

使用HAProxy创建一个active-active模式的分布式高可用Nginx集群&#xff0c;需要在每台Nginx节点上安装并配置Nginx&#xff0c;然后安装HAProxy作为负载均衡器分发流量到这些节点上。以下是详细步骤&#xff1a; 步骤1&#xff1a;安装Nginx 在所有三台服务器上安装Nginx。 …

YOLOv8: 快速而准确的对象检测

YOLOv8: 快速而准确的对象检测 背景 对象检测是计算机视觉中的一个关键任务,它可以帮助我们在图像或视频中识别和定位感兴趣的物体。其中,YOLO(You Only Look Once)系列是一类非常出色的实时对象检测算法,以其快速和准确的特点而闻名。YOLOv8是YOLO系列的最新版本,由Ultralyti…