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

news/2024/5/18 23:12:08

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.mrgr.cn/p/38037826

相关文章

JAVA语言开发的智慧城管系统源码:技术架构Vue+后端框架Spring boot+数据库MySQL

通过综合应用计算机技术、网络技术、现代通信技术等多种信息技术&#xff0c;充分融合RS遥感技术、GPS全球定位技术、GIS地理信息系统&#xff0c;开始建设一个动态可视的、实时更新的、精细量化的城市管理系统。智慧城管将采用云平台架构方式进行建设&#xff0c;基于现有数字…

探究Android的多分辨率支持以及各种类型图标尺寸大小

术语和概念 屏幕尺寸 屏幕的物理尺寸&#xff0c;以屏幕的对角线长度作为依据&#xff08;比如 2.8寸&#xff0c; 3.5寸&#xff09;。 简而言之&#xff0c; Android把所有的屏幕尺寸简化为三大类&#xff1a;大&#xff0c;正常&#xff0c;和小。 程序可以针对这三种尺寸…

手机恢复出厂设置ip地址会变吗

当我们对手机进行恢复出厂设置时&#xff0c;很多人会担心手机的IP地址是否会发生变化。IP地址对于手机的网络连接至关重要&#xff0c;它决定了手机在网络中的身份和位置。那么&#xff0c;手机恢复出厂设置后&#xff0c;IP地址到底会不会发生变化呢&#xff1f;虎观代理小二…

线上线下交友社区系统,支持打包小程序/公众号/H5,源码交付!

上网交友的好处有很多&#xff0c;以下是一些主要的好处&#xff1a; 1. 拓展人际关系&#xff1a;通过上网交友可以认识更多的人&#xff0c;拓展自己的社交圈。这有助于扩大自己的视野、增加人生经验和开阔心胸。 2. 找到志同道合的朋友&#xff1a;在网络上&#xff0c;我们…

从零开始学AI绘画,万字Stable Diffusion终极教程(四)

【第4期】图生图 欢迎来到SD的终极教程&#xff0c;这是我们的第四节课 这套课程分为六节课&#xff0c;会系统性的介绍sd的全部功能&#xff0c;让你打下坚实牢靠的基础 1.SD入门 2.关键词 3.Lora模型 4.图生图 5.controlnet 6.知识补充 在前面的课程中&#xff0c;我…

Leetcode—163. 缺失的区间【简单】Plus

2024每日刷题&#xff08;126&#xff09; Leetcode—163. 缺失的区间 实现代码 class Solution { public:vector<vector<int>> findMissingRanges(vector<int>& nums, int lower, int upper) {int n nums.size();vector<vector<int>> an…

06.数组

1.数组概述 数组是相同类型数据的有序集合; 数组描述的是相同类型的若干各数据,按照一定的先后次序排列组合而成; 其中,每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它们。 2.数组声明创建 首先必须声明数组变量,才能在程序中使用数组: dataType[] a…

『FPGA通信接口』DDR(3)DDR3颗粒读写测试

文章目录 前言1.配套工程简介2.测试内容与策略3. 测试程序分析4.程序结果分析5.一个IP控制两颗DDR36.传送门 前言 以四颗MT41K512M16HA-125AIT颗粒为例&#xff0c;介绍如何在一块新制板卡上做关于DDR3的器件测试。前面两篇介绍了什么是DDR&#xff0c;并介绍了xilinx给出的FPG…

c#学习基础1

一、复杂数据类型 1&#xff09;概述 2&#xff09;枚举 1.基本概念 枚举是一个比较特别的存在&#xff0c;它是一个被命名的整形常量的集合&#xff0c;一般用它来表示状态&#xff0c;类型等 1.1申明枚举和申明枚举变量 1.2申明枚举语法 2.在哪里申明枚举 3.枚举的使用 4…

Java中使用RediSearch进行高效数据检索

RediSearch是一款构建在Redis上的搜索引擎&#xff0c;它为Redis数据库提供了全文搜索、排序、过滤和聚合等高级查询功能。通过RediSearch&#xff0c;开发者能够在Redis中实现复杂的数据搜索需求&#xff0c;而无需依赖外部搜索引擎。本文将介绍如何在Java应用中集成并使用Red…

第三单元 控件

第三单元控件 Button控件 知识点一:如何设置点击事件 (1)方法一: 首先对xml中想要设置点击的控件添加onclick属性 即android onclick=“点击后要进行的函数名”activity_main.xml<?xml version="1.0" encoding="utf-8"?> <LinearLayout and…

Adobe InDesign 2024 v19.4 (macOS, Windows) - 版面设计和桌面出版软件

Adobe InDesign 2024 v19.4 (macOS, Windows) - 版面设计和桌面出版软件Adobe InDesign 2024 v19.4 (macOS, Windows) - 版面设计和桌面出版软件 Acrobat、After Effects、Animate、Audition、Bridge、Character Animator、Dimension、Dreamweaver、Illustrator、InCopy、InDe…

Adobe InCopy 2024 v19.4 (macOS, Windows) - 编写和副本编辑软件

Adobe InCopy 2024 v19.4 (macOS, Windows) - 编写和副本编辑软件Adobe InCopy 2024 v19.4 (macOS, Windows) - 编写和副本编辑软件 Acrobat、After Effects、Animate、Audition、Bridge、Character Animator、Dimension、Dreamweaver、Illustrator、InCopy、InDesign、Lightr…

免费开源,无需 GPU,本地化部署大语言模型的对话系统

免费开源&#xff0c;无需 GPU&#xff0c;本地化部署大语言模型的对话系统 分类 编程技术 项目名: FreeAskInternet -- 本地化部署大语言模型的对话系统 Github 开源地址&#xff1a; https://github.com/nashsu/FreeAskInternet FreeAskInternet 是一个免费开源的工具&am…

【深度学习基础(3)】初识神经网络之深度学习hello world

文章目录 一. 训练Keras中的MNIST数据集二. 工作流程1. 构建神经网络2. 准备图像数据3. 训练模型4. 利用模型进行预测5. (新数据上)评估模型精度 本节将首先给出一个神经网络示例&#xff0c;引出如下概念。了解完本节后&#xff0c;可以对神经网络在代码上的实现有一个整体的了…

STM32标准库控制一盏LED闪烁

实物连接&#xff1a; ## 软件编程&#xff1a;默认已经有一个工程模板&#xff0c;代码实现逻辑&#xff1a; 1、使用RCC开启GPIO的时钟&#xff1b; 2、使用GPIO初始化函数实现初始化GPIO 3、使用输入或输出的函数控制GPIO口 #include "stm32f10x.h" …

题解:AT_abc352_C [ABC352C] Standing On The Shoulders

考场憋了很久,最后代码贼短……理想状态下,直接全排列解决问题。但是,\(1 \le n \le 2 \times 10^5\),明显 TLE,试都不用试的。 咋优化呢? 其实,前面的巨人只负责“打地基”,作为“塔尖儿”的巨人有且仅有 1 个。而前面地基随便排列,地基高度(他们的和)都不会变。所…

Electron+Vue3+Vite+ElectronForge整合 - 一键启动两个服务 一键打包两个服务

说明 本文介绍一下 Electron Vue3 Vite Electron Forge 的高级整合操作。vue3 : 使用 TS 的语法开发&#xff1b; Electron : 使用 JS 的语法开发。本文将从项目初始化开始&#xff0c;一步一步的完成项目的启动、打包全流程的介绍。实现的效果是 &#xff1a; 1、一个正常…

perl:用 MIDI::Simple 生成midi文件,用 pygame 播放 mid文件

在 csdn.net 下载 strawberry-perl-5.32.1.1-64bit.zip 解压安装在 D:\Strawberry\ 运行 cpan install MIDI::Simple D:\Strawberry\c\bin\gmake.exe test -- OK Running make install for CONKLIN/MIDI-Perl-0.84.tar.gz Installing D:\Strawberry\perl\site\lib\MIDI.pm I…

Apache Shiro 550反序列化漏洞

Shiro 框架提供了一个RememberMe功能,允许用户在下次访问时无需重新登录。这个功能通过在Cookie中设置一个rememberMe字段来实现。Shiro在处理rememberMe字段时,会先进行Base64解码,然后使用AES解密,最后反序列化。然而Shiro的默认AES密钥是硬编码在框架中的。目录漏洞原理…