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

news2024/11/25 20:35:16

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.coloradmin.cn/o/1632429.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

鸿蒙开发HarmonyOS4.0入门与实践

鸿蒙开发HarmonyOS4.0 配合视频一起食用&#xff0c;效果更佳 课程地址&#xff1a;https://www.bilibili.com/video/BV1Sa4y1Z7B1/ 源码地址&#xff1a;https://gitee.com/szxio/harmonyOS4 准备工作 官网地址 鸿蒙开发者官网&#xff1a;https://developer.huawei.com/con…

使用FPGA发送一个经过曼彻斯特编码的伪随机序列

介绍 这几天突然就不知道要使用FPGA实现什么样的功能了,然后就跑去学习数电了,学的也是晕晕的。正好之前写了一个使用FPGA发送伪随机序列的代码,然后因为需要使用曼彻斯特编码,所以又加了一个模块吧,使得最后输出的波形经过曼彻斯特编码。 曼彻斯特编码 首先,曼彻斯特编…

【操作系统复习资料】(持续更新中)

目录 第一章&#xff1a;操作系统引论 第二章&#xff1a;进程的描述与控制 未完待续。。。。。接 第三章&#xff1a;处理机调度与死锁 第四章&#xff1a;存储器管理 第五章&#xff1a;虚拟存储器 第六章&#xff1a;第八节 磁盘存储器的性能和调度 第一章&#xff1a…

pgvector扩展在IvorySQL Oracle兼容模式下的应用实践

向量数据库是生成式人工智能(GenAI)的关键组成部分。作为PostgreSQL的重要扩展&#xff0c;pgvector支持高达16000维的向量计算能力&#xff0c;使得PostgreSQL能够直接转化为高效的向量数据库。 IvorySQL基于PostgreSQL开发&#xff0c;因此它同样支持添加pgvector扩展。在Ora…

社交媒体数据恢复:新浪微博

当我们在使用新浪微博时&#xff0c;可能会遇到一些意外情况&#xff0c;如误删微博、账号出现问题等。这时&#xff0c;我们需要进行数据恢复。本文将详细介绍如何在新浪微博中进行数据恢复。 首先&#xff0c;我们需要了解新浪微博的数据恢复功能。根据微博的帮助中心&#…

实验8 顺序图、状态图

一、实验目的 通过绘制顺序图、状态图&#xff0c;掌握顺序图、状态图之间的基本原理和差异。 能对简单问题进行顺序图、状态图的分析与绘制。 二、实验项目内容&#xff08;实验题目&#xff09; 在图书信息管理系统中&#xff0c;系统管理员可以对图书信息进行管理和维护…

Python轻量级Web框架Flask(12)—— Flask类视图实现前后端分离

0、前言&#xff1a; 在学习类视图之前要了解前后端分离的概念&#xff0c;相对于之前的模板&#xff0c;前后端分离的模板会去除views文件&#xff0c;添加两个新python文件apis和urls&#xff0c;其中apis是用于传输数据和解析数据 的&#xff0c;urls是用于写模板路径的。 …

merge and rebase

文章目录 什么是merge什么是rebasemerge和rebase的区别操作执行git merge操作git rebase操作冲突解决解决冲突的步骤 Git Merge 和 Git Rebase 都是用于集成来自不同分支的修改的 Git 命令。 什么是merge Git Merge 是将一个分支的改动合并到另一个分支的方式。当你执行一个 m…

Unity 物体触碰事件监听

声明委托 public delegate void MyDelegate(Collider trigger); C# 委托&#xff08;Delegate&#xff09; | 菜鸟教程 (runoob.com)https://www.runoob.com/csharp/csharp-delegate.html 定义委托 public MyDelegate onTriggerEnter; public MyDelegate onTriggerStay; pu…

Leetcode—1041. 困于环中的机器人【中等】

2024每日刷题&#xff08;121&#xff09; Leetcode—1041. 困于环中的机器人 实现代码 class Solution { public:bool isRobotBounded(string instructions) {int x 0;int y 0;int d 0;vector<vector<int>> direction{{0, 1}, {1, 0}, {0, -1}, {-1, 0}};for…

C语言阶段的题目解析

前言 我们C语言已经学习的差不多了&#xff0c;但是C语言之中存在的一些问题与难点我们还不一定能够又快又好地解决&#xff0c;为了夯实我们的基础&#xff0c;我们来练习几道稍微有点难度的C语言习题吧 例题一 题目 int main(void) {unsigned char i 7;int j 0;for (; i…

织梦云端:网络信号原理的艺术解码

hello &#xff01;大家好呀&#xff01; 欢迎大家来到我的Linux高性能服务器编程系列之《织梦云端&#xff1a;网络信号原理的艺术解码》&#xff0c;在这篇文章中&#xff0c;你将会学习到网络信号原理以及应用&#xff0c;并且我会给出源码进行剖析&#xff0c;以及手绘UML图…

MQTT数据传输Payload的常见格式介绍

使用MQTT client过程中看到常见的数据格式&#xff1a; 下面是介绍 Plaintext&#xff08;纯文本&#xff09; 介绍&#xff1a;纯文本编码是最基本的编码形式&#xff0c;它使用标准的ASCII或Unicode字符来表示数据。这种编码格式是人类可读的&#xff0c;因为它直接表示文本信…

centos 7使用源码编译安装Python 3.12.2(最新版本)

&#xff08;一&#xff09;、说明 在centos 7上&#xff0c;默认安装出来的python是&#xff1a;2.7.5版本 1.查看python版本&#xff1a; python --version 2.通过yum安装出来的&#xff0c;适合当前操作系统的&#xff0c;最新的python版本是&#xff1a;3.6.8 python3…

C#队列(Queue)的基本使用

概述 在编程中&#xff0c;队列&#xff08;Queue&#xff09;是一种常见的数据结构&#xff0c;它遵循FIFO&#xff08;先进先出&#xff09;的原则。在C#中&#xff0c;.NET Framework提供了Queue<T>类&#xff0c;它位于System.Collections.Generic命名空间下&#x…

Spring事务回滚核心源码解读

记一次Springboot事务超时不回滚的分析过程 在Springboot中&#xff0c;我用的xml进行事务管理&#xff0c;DataSourceTransactionManager作为事务管理器&#xff0c;配置了事务控制在Service层&#xff1b;在事务管理器中&#xff0c;配置了defaultTimeout事务超时时间为5秒&…

RK3588 - RKNN(Rockchip 神经处理单元)的逆向工程

本文翻译自https://jas-hacks.blogspot.com/2024/02/rk3588-reverse-engineering-rknn.html RK3588 NPU 的内部操作和功能主要隐藏在名为RKNPU2的闭源 SDK 中。由于对大型语言模型 (LLM) 的兴趣以及对transform模型最佳矩阵乘法的追求&#xff0c;想了解 RKNPU SDK 新引入的矩阵…

Jetpack Compose简介

文章目录 Jetpack Compose简介概述声明式UI和命令式UIJetpack Compose和Android View对比Compose API设计原则一切皆为函数组合优于继承单一数据源 Jetpack Compose和Android View关系使用ComposesetContent()源码ComposablePreview Jetpack Compose简介 概述 Jetpack Compos…

数据结构-二叉搜索树(BST)

目录 什么是二叉搜索树 二叉搜索树的特性 (1)顺序性 (2)局限性 二叉搜索树的应用 二叉搜索树的操作 (1)查找节点 (2)插入节点 (3)删除节点 (4)中序遍历 什么是二叉搜索树 如图所示&#xff0c;二叉搜索树&#xff08;binary search tree&#xff09;满足以下条件。…

Unity 递归实现数字不重复的排列组合

实现 private void Permutation(List<int> num, int leftIndex, List<string> strs) {if (leftIndex < num.Count){for (int rightIndex leftIndex; rightIndex < num.Count; rightIndex){Swap(num, leftIndex, rightIndex);Permutation(num, leftIndex 1…