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

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

目录

[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 组价上,打包运行到设备上,此时设备上也能正常显示了

五、空后处理完整代码

cs 复制代码
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、其他渲染设置和状态: 在渲染管线中可能会涉及到其他许多设置和状态,这些设置和状态可能会影响最终的显示结果。通过应用一个空的后处理效果,可能会对这些设置和状态进行重置或调整,从而解决一些显示问题。

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

 */
相关推荐
枯萎穿心攻击3 小时前
响应式编程入门教程第二节:构建 ObservableProperty<T> — 封装 ReactiveProperty 的高级用法
开发语言·unity·c#·游戏引擎
X_StarX11 小时前
【Unity笔记02】订阅事件-自动开门
笔记·学习·unity·游戏引擎·游戏开发·大学生
霸王•吕布15 小时前
游戏引擎中顶点着色&像素着色
游戏引擎·顶点着色器·像素着色器·顶点颜色·顶点uv·顶点法向
Thomas_YXQ18 小时前
Unity URP法线贴图实现教程
开发语言·unity·性能优化·游戏引擎·unity3d·贴图·单一职责原则
徐子竣1 天前
[学习记录]Unity-Shader-几何着色器
unity·游戏引擎·着色器
EQ-雪梨蛋花汤1 天前
【Part 3 Unity VR眼镜端播放器开发与优化】第四节|高分辨率VR全景视频播放性能优化
unity·音视频·vr
与火星的孩子对话1 天前
Unity进阶课程【六】Android、ios、Pad 终端设备打包局域网IP调试、USB调试、性能检测、控制台打印日志等、C#
android·unity·ios·c#·ip
幻世界2 天前
【Unity智能模型系列】Unity + MediaPipe + Sentis + ArcFace模型:构建高效人脸识别比对系统
unity·游戏引擎
漫游者Nova2 天前
虚幻引擎Unreal Engine5恐怖游戏设计制作教程,从入门到精通从零开始完整项目开发实战详细讲解中英字幕
ue5·游戏引擎·虚幻·游戏开发完整教程·恐怖游戏开发
死也不注释2 天前
【Unity 编辑器工具开发:GUILayout 与 EditorGUILayout 对比分析】
unity·编辑器·游戏引擎