开启Allow unsafe code的影响

算法灵珀客
• 阅读 2235

1)开启Allow unsafe code的影响
​2)Unity线性空间下,PhotoShop制作半透明图片,制作带外发光、内发光的图层如何正确导出
3)Unity中实现完善的暂停机制
4)RenderPipelineManager.DoRenderLoop_Internal的堆内存优化
5)Unity 2020版本中ARBackgroundRenderer和ARRenderMode的相应替代类


这是第223篇UWA技术知识分享的推送。今天我们继续为大家精选了若干和开发、优化相关的问题,建议阅读时间10分钟,认真读完必有收获。

UWA 问答社区:answer.uwa4d.com
UWA QQ群2:793972859(原群已满员)

Script

Q:最近项目引进几个插件,以及学习别人的插件,代码中用到了unsafe关键字,需要再project settings中勾选Allow unsafe code,之前知道一点是不勾选最好,但是勾选以后到底哪里不好也忘了,也没有勾选之后上线来验证,所以问问大家,是否应该勾选,以及勾选之后有何影响?

A:勾了没什么实际上的坏处,只是由于.net当初设计的时候是不鼓励使用unsafe代码的,所以在编译器默认设置这个门槛,鼓励大家尽可能使用安全的代码(也就是不要直接操作原生内存地址)。

但是,很多高性能的C#代码为了最大限度地高效访问内存,不可避免要用unsafe,只要保证unsafe代码被限制在较小的范围并严格测试保证不会出内存访问错误,对整个工程来说就不是大问题。

感谢招文勇@UWA问答社区提供了回答


Texture

Q:大家好,因为项目是PBR项目,所以Unity使用线性空间,现在在制作UI的时候,带透明通道的图片,混合时候就会出错。

我们前后试了几种方法:
1. 改PhotoShop的工作空间为线性的,定义Gamma为1.0:
开启Allow unsafe code的影响
2. 单独改用灰度系数混合RGB颜色:1.00,这样大部分情况下,Unity中效果PhotoShop中效果就是一致的:
开启Allow unsafe code的影响
3. 改Unity渲染管线。

以上方法都有一些局限和问题。

1. 普通不透明图层有些渐变效果无法绘制,因为线性空间下的暗部颜色精度不够;
2. PhotoShop制作带外发光、内发光的图层合并之后会错误:
开启Allow unsafe code的影响

开启Allow unsafe code的影响
3. 因为用的还是内置Forward管线,影响太大,低端机效率低下,暂不考虑。
我们最终采用的是第二种,美术还是在Gamma工作空间作图,只是图层混合采样。

最后想问下大家,针对线性空间下的半透明图层如何导出?
或者有没有什么办法能处理这种外发光、内发光图层问题?

A1:目前公司项目都采用Linear方式,美术直接修改PhotoShop设置,出图过后,在Unity中测试,能与原图是一个色彩,之前也尝试过其他办法,如Shader修正,但是都有一定的问题,目前采用的这种方案,暂未发现问题。

开启Allow unsafe code的影响

感谢范超@UWA问答社区提供了回答

A2:用下图的配置,在PhotoShop CC 2019里试了下,只要不合并图层,直接导出png,再放到Unity中就没有问题。另外如问题中的例子,只要从下向上合并图层(带着背景),最终结果就没问题。可能是PhotoShop的Bug。

开启Allow unsafe code的影响

就我和美术了解的情况,他们很少合并图层。一般导出就是把不需要的图层隐藏了。所以这种情况应该是可以避免的。

感谢张首峰@UWA问答社区提供了回答


Script

Q:目前使用TimeScale=0来暂停游戏,但是在UI上不想让特效和动画暂停,而在某些战斗场景,只希望暂停一部分逻辑。如果把TimeScale=0,就要处理ParticleSystem、TrailRenderer、Spine动画等组件,特别是TrailRenderer和Spine都需要修改源码。如果不用TimeScale=0, 是不是就要在框架层就处理好各模块的更新逻辑?

A1:常规的做法确实就如你说的,不用TimeScale=0,各个地方去实现暂停,然后统一管理。

感谢邓永健@UWA问答社区提供了回答

A2:可参考这篇文章:《Unity Chronos - Time Control 时间控制器》

感谢黄程@UWA问答社区提供了回答


Mono

Q:项目采用了URP,用UWA进行了初步测试,发现RenderPipelineManager.DoRenderLoop_Internal分配了很多堆内存,这个函数是URP中的内置函数吗?应该如何定位问题进行优化?

开启Allow unsafe code的影响

A:这个函数是内置用于SRP的总函数,不过分配堆内存的很有可能是题主自己写的C#函数。从图中来看,目前堆内存分配的太多了,建议通过GOT(Online)中的Mono模式来进行测试,就可以看到其具体的堆内存分配情况了。通过“倒序”查看方式,可以直接查看分配的最低级子函数,如下图所示。

开启Allow unsafe code的影响

开启Allow unsafe code的影响

以上回答由UWA提供


Editor

Q:请问下,以下这两个类现在有替代类吗?是怎么规划处理的?
UnityEngine.XR.ARBackgroundRenderer
UnityEngine.XR.ARRenderMode

以上这两个类经测试:
Unity版本:2020.1.4f1c1,找不到;
Unity版本:2019.4.7f1,找得到。

我又试了下当前最新的Untiy 2020.2.0b6版本这两个类也没有。
看了些资料,Unity 2020版本后,这两个类应该就被删除了。

A:Unity新版本将很多功能都是以Package的方式导入,关于AR从PackageManager中导入AR Foundation包,ChangeLog中有提到ARBackgroundRenderer已经在某个版本重命名为ARCameraBackground,AR/VR开发可能需要熟悉一下相关的Package,如下图:

开启Allow unsafe code的影响

感谢羽飞@UWA问答社区提供了回答

封面图来源于网络


今天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题也许都只是冰山一角,我们早已在UWA问答网站上准备了更多的技术话题等你一起来探索和分享。欢迎热爱进步的你加入,也许你的方法恰能解别人的燃眉之急;而他山之“石”,也能攻你之“玉”。

官方技术QQ群:793972859(原群已满员)

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
4年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
4年前
C# Aspose.Cells导出xlsx格式Excel,打开文件报“Excel 已完成文件级验证和修复。此工作簿的某些部分可能已被修复或丢弃”
报错信息:最近打开下载的Excel,会报如下错误。(xls格式不受影响)!(https://oscimg.oschina.net/oscnet/2b6f0c8d7f97368d095d9f0c96bcb36d410.png)!(https://oscimg.oschina.net/oscnet/fe1a8000d00cec3c
Stella981 Stella981
4年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
4年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
4年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
4年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Python进阶者 Python进阶者
2年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这