设置角色对象可见性

本文介绍如何使用Unity3D中的MeshRenderer组件控制游戏模型的可见性,提供了具体的代码实现,包括对SkinnedMeshRenderer和MeshRenderer的处理,前者用于处理角色的骨骼蒙皮动画,后者用于处理角色的其他Mesh对象。

可见性通过MeshRenderer的Enable字段控制,参考代码如下:

if(charObj != null)
{
  foreach(SkinnedMeshRenderer smr in charObj.GetComponentsInChildren(typeof(SkinnedMeshRenderer)))
  {
    smr.enabled = false;
  }
  foreach(MeshRenderer smr in charObj.GetComponentsInChildren(typeof(MeshRenderer)))
  {
    smr.enabled = false;
  }
}

上面的测试代码用于设置U3D中人物模型的可见性,其中分别处理了SkinnedMeshRenderer和MeshRenderer,前者表示处理骨骼蒙皮动画,也就是角色身上的皮肤,后者用来处理角色手持的武器之类的Mesh对象。

### Java 中 `volatile` 和 `synchronized` 的可见性原理及区别 #### 1. 可见性原理 在 Java 的多线程环境中,每个线程都有自己的工作内存,而变量存储在主内存中。当线程读取变量时,会优先从自己的工作内存中读取;如果工作内存中不存在该变量,则通过 Load 操作从主内存加载。因此,如果没有适当的同步机制,一个线程对变量的修改可能无法及时被其他线程看到。 - **`volatile` 的可见性原理** 当一个变量被声明为 `volatile` 时,它会强制要求每次读取该变量时都必须从主内存中获取最新值,而不是使用线程本地的工作内存中的副本[^3]。这意味着,一旦某个线程修改了 `volatile` 变量的值,其他线程能够立即看到这个变化。此外,`volatile` 还禁止指令重排,确保程序执行顺序与代码书写顺序一致[^1]。 - **`synchronized` 的可见性原理** `synchronized` 关键字通过加锁机制来保证可见性。当一个线程进入 `synchronized` 代码块或方法时,它会锁定该对象,并将该对象的工作内存刷新到主内存中。当线程退出 `synchronized` 块时,它会将本地工作内存中的变量值写回到主内存中[^5]。这种机制确保了线程之间的可见性,即一个线程对共享变量的修改能够被其他线程感知。 #### 2. 区别 尽管 `volatile` 和 `synchronized` 都能保证可见性,但它们在实现细节和适用场景上存在显著差异: - **轻量级 vs 重量级** `volatile` 是一种轻量级的同步机制,不需要加锁,也不会阻塞线程。相比之下,`synchronized` 是一种重量级的同步机制,它通过加锁来确保互斥访问,可能会导致性能开销[^4]。 - **功能范围** `volatile` 仅能保证变量的可见性和有序性,无法保证操作的原子性。例如,对于复合操作(如 `i++`),即使变量是 `volatile` 的,仍然可能出现竞态条件[^4]。而 `synchronized` 不仅能保证可见性,还能确保操作的原子性[^2]。 - **适用场景** - 如果只需要保证单个变量的可见性,且不涉及复杂的复合操作,可以使用 `volatile`。 - 如果需要对多个变量或代码块进行同步访问,或者需要保证原子性,则应使用 `synchronized`。 #### 示例代码 以下是一个简单的示例,展示了如何使用 `volatile` 和 `synchronized` 来保证可见性: ```java // 使用 volatile 保证可见性 public class VolatileExample { private volatile boolean isRunning = true; public void stop() { isRunning = false; } public void doWork() { while (isRunning) { // 执行任务 } } } // 使用 synchronized 保证可见性 public class SynchronizedExample { private boolean isRunning = true; public synchronized void stop() { isRunning = false; } public void doWork() { while (isRunning) { // 执行任务 } } } ``` #### 总结 `volatile` 和 `synchronized` 在 Java 并发编程中扮演着重要角色。`volatile` 提供了轻量级的可见性和有序性保证,适用于简单的场景;而 `synchronized` 提供了更全面的同步机制,适用于复杂的并发控制需求。开发者应根据具体场景选择合适的关键字,有时还需要结合两者以达到最佳效果[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值