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

embedded/2024/9/25 18:34:53/

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/embedded/30108.html

相关文章

Docker搭建LNMP+Wordpress

目录 一.项目模拟 1.项目环境 2.服务器环境 3.任务需求 &#xff08;1&#xff09;使用 Docker 构建 LNMP 环境并运行 Wordpress 网站平台 &#xff08;2&#xff09;限制 Nginx 容器最多使用 500MB 的内存和 1G 的 Swap &#xff08;3&#xff09;限制 Mysql 容器写 /d…

C# Solidworks二次开发:枚举应用实战(第十讲)

大家好&#xff0c;今天要讲的还是我们的枚举应用实战系列。 下面是今天要介绍的枚举&#xff1a; &#xff08;1&#xff09;第一个枚举为swsMaterialErrorWarning_e&#xff0c;这个API的含义为材料错误&#xff0c;下面是官方的具体枚举值&#xff1a; MemberDescriptions…

移动端适配方案

移动端适配 方案 1&#xff1a;rem html font-size 方案 2&#xff1a;vw rem html font-size rem 是相对于 html 元素的 font-size 来设置的单位&#xff0c;通过在不同屏幕尺寸下动态修改 html 元素的 font-size 可达到适配效果 在开发中&#xff0c;我们只需要考虑两个…

2024最新UI发卡盗U/支持多语言/更新UI界面/支持多个主流钱包

本文来自&#xff1a;2024最新UI发卡盗U/支持多语言/更新UI界面/支持多个主流钱包 - 源码1688 应用介绍 简介&#xff1a; 2024最新UI发卡盗U/支持多语言/更新UI界面/支持多个主流钱包 自行检查后门&#xff0c;最好是部署智能合约后用合约地址来授权 包含转账支付页面盗U授…

解决iview(view ui)中tabs组件中使用图片预览组件ImagePreview,图片不显示问题

同学们可以私信我加入学习群&#xff01; 正文开始 前言一、问题描述二、原因分析三、解决方案总结 前言 最近在写个人项目的web端和浏览器插件&#xff0c;其中一个功能是base64和图片的转换。因为分成四个小功能&#xff0c;所以使用的iview的tabs来展示不同功能&#xff0c…

如何编写测试用例

总结 测试用例需求来源 文档 用户角度 编写测试用例步骤 分析需求 写测试点 对需求的拆分 辅助完成测试用例的编写 编写测试用例 编写测试用例原则 能看懂 能执行 测试结果状…

postman一直转圈圈,无法启动

解决 地址栏输入%appdata%进入此目录&#xff0c;删除%appdata%目录下的postman文件可以解决问题。

使用Neo4j和Langchain创建知识图谱

使用Neo4j和Langchain创建知识图谱 知识图谱是组织和整合信息的强大工具。通过使用实体作为节点和关系作为边缘&#xff0c;它们提供了一种系统的知识表示方法。这种有条理的表示有利于简化查询、分析和推理&#xff0c;使知识图在搜索引擎、推荐系统、自然语言处理和人工智能…