execution(**..iservice.*(..))报错_texture streaming开着的时候的报错问题

文章主要探讨了Unity的Texture streaming在打包运行时的报错问题。在development版本打包运行时,可能出现async upload texture xxx failed..cant find xxxx的报错,原因是texture streaming在miplevel变化时找不到对应AB数据。而release版本虽可能无报错,但物体miplevel无法切换。

(声明:本文章所有用到的图片和源码,只为了学习和研究用途,未经我同意,不得进行转载或者其他用途,推荐大家购买Unity正版源码

Unity的Texture streaming,相信很多的同学都会开,为啥,省内存显存呗。但是在打包运行的时候,大家如果是development版本,就可能会看到有报错,类似async upload texture xxx

failed..cant find xxxx(具体的没去翻了,大致这样,反正碰到的人一眼就能看到)。为什么会报这个错呢?其实很多时候,大家可能一般的加载习惯都是如此,加载AB, load asset,

Instantiate 一个,然后可能没事情,就会Unload这个AB(或者自己做管理,做弱引用来释放)。

但是,texture streaming在实现过程中,它在miplevel要进行变化的时候(摄像机距离发生了变化),因为它streaming的意思,就是用到的时候去读取数据,所以它就会根据加载的时候的信息,去找它所在的那个AB去找它要的数据,然后它发现,Persistantmanager里面已经

没这个AB了,所以在底层它就返回了一个空的结构上去,上层发现是个空的,就会报这个错误出来。

但是如果是release版本,可能你看不到这个错误,但是其实就是,你这个物体的miplevel没法被切换,它就会始终用着那个mipmap在显示,不管远近。

大致是这么个意思。

在Spring AOP中,AspectJ切点表达式用于定义哪些方法需要被拦截并应用切面逻辑。这两个表达式 `execution(* com.po..*.*service.impl.*.*(..))` 和 `execution(* com.po..*service.impl.*.*(..))` 都试图匹配 `com.po` 包及其子包下的某些类和方法,但它们之间存在细微差别。 ### 表达式分析 #### 1. `execution(* com.po..*.*service.impl.*.*(..))` 这个表达式的含义是: - `execution(...)`:表示匹配任何方法执行。 - `*`:返回类型可以是任意类型。 - `com.po`:指定根包为 `com.po`。 - `..*`:表示匹配 `com.po` 包下的所有子包(包括多层嵌套的子包)。 - `.*service.impl.`:表示在这些子包中查找名称以 `.service.impl.` 结尾的包中的类。 - `*`:表示匹配该包中的所有类。 - `*`:表示匹配该类中的所有方法。 - `(..)`:表示方法参数可以是任意数量和类型的参数。 因此,这个表达式会匹配 `com.po` 包及其所有子包中,位于 `.service.impl.` 包下的所有类的所有方法。例如,它可以匹配 `com.po.user.service.impl.UserService` 类中的所有方法 [^2]。 #### 2. `execution(* com.po..*service.impl.*.*(..))` 这个表达式的含义是: - `execution(...)`:表示匹配任何方法执行。 - `*`:返回类型可以是任意类型。 - `com.po`:指定根包为 `com.po`。 - `..*service.impl.`:表示匹配 `com.po` 包下所有子包中名称以 `*service.impl.` 结尾的包中的类。这里的 `*` 是一个通配符,表示前面的部分可以有任意字符,只要最终形成 `*service.impl.` 的结构即可。 - `*`:表示匹配该包中的所有类。 - `*`:表示匹配该类中的所有方法。 - `(..)`:表示方法参数可以是任意数量和类型的参数。 因此,这个表达式会匹配 `com.po` 包及其所有子包中,名称以 `*service.impl.` 结尾的包中的所有类的所有方法。例如,它可以匹配 `com.po.order.service.impl.OrderService` 类中的所有方法 [^2]。 ### 区别总结 - **第一种表达式** `execution(* com.po..*.*service.impl.*.*(..))` 更加具体,它要求包名必须以 `.service.impl.` 结尾,并且该包必须存在于 `com.po` 包及其子包中。这种写法更倾向于匹配那些明确命名为 `.service.impl.` 的包中的类和方法。 - **第二种表达式** `execution(* com.po..*service.impl.*.*(..))` 更加灵活,它允许包名以任意字符头,只要最终形成 `*service.impl.` 的结构即可。这意味着它可以匹配更多种类的包名,如 `orderservice.impl`、`userservice.impl` 等等 [^2]。 ### 示例代码 假设有一个项目结构如下: ``` com └── po ├── user │ └── service │ └── impl │ └── UserService.java └── order └── service └── impl └── OrderService.java ``` 对于上述结构,第一个表达式将匹配 `UserService` 和 `OrderService` 类中的所有方法,而第二个表达式同样也会匹配这两个类中的所有方法。但如果存在另一个类 `com.po.payment.service.impl.PaymentService`,那么两个表达式都会匹配到它 [^2]。 ### 相关问题 1. 如何在Spring AOP中定义多个切点? 2. Spring AOP与AspectJ的区别是什么? 3. 如何在Spring AOP中使用注解来定义切点? 4. 如何在Spring Boot中配置AOP? 5. 如何调试Spring AOP中的切点匹配问题
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值