在《游戏编程精粹1》里的1.10处讲解了位数组的应用,原文意把位操作变为类似数组的形式,从而更加直观。
(注意C#中已经内置这种数据结构,叫做BitArray)
不过我联想到是否可以设计一个位锁的概念。
我遇到过这样一个问题,游戏中有一些模块的参数必须在所有使用者都结束后才可以被释放。
例如时间系统的暂停,当你在进行某些特殊任务时需要调用时间暂停,而在这个特殊任务的过程中播放了过场动画也会调用暂停。
所以当他们都结束使用了,暂停这个参数才会变为false。
类似的情况还有AI的开启和关闭等等。
下面是支持32个使用者的位锁代码:
using System.Collections; using System.Collections.Generic; using UnityEngine; namespace Hont { public class BitLock { const int LOCKED_MAX_VALUE = 32; int mBitSlot; public bool IsLocked { get { return mBitSlot != 0; } } public BitLock() { } public bool IsUnassignLock(int handle) { return (mBitSlot & handle) == 0; } /// <summary> /// 分配一个锁,并返回锁的句柄。如果返回-1则返回失败。 /// </summary> public int AssignLock() { for (int i = 1; i <= LOCKED_MAX_VALUE; i++) { if ((mBitSlot & 1 << i) == 0) { mBitSlot |= 1 << i; return i; } } return -1; } /// <summary> /// 通过句柄放回一个锁。 /// </summary> public void UnassignLock(int handle) { mBitSlot = mBitSlot & (~(1 << handle)); } } }