- AudioManager PlayOneShot问题
- skynet配置表内存问题
1. AudioManager PlayOneShot问题
之前播放的音效,因为会同时播,所以使用的是PlayOneShot来播放,但是发现有些时候音效会播放不出来。不确定什么原因导致。
后面全部改成AudioSound的Play来播放,为了实现多个音效同时播放的需求,每个播放的音效都会有一个AudioSound来驱动播放,为了提高性能把AudioSound做了一个内存池。
另外Audio在游戏中会有多种类型,比如背景音乐,环境音,音效,语言,需要对Audio进行分层。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| /// <summary> /// 音频层级类型 /// </summary> public enum EAudioLayerType { /// <summary> /// 音乐 /// </summary> Music,
/// <summary> /// 环境 /// </summary> Ambient,
/// <summary> /// 语音 /// </summary> Voice,
/// <summary> /// 音效 /// </summary> Sound, }
|
每个层级类型需要实现一个层级接口。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
| internal abstract class AudioLayer { /// <summary> /// 层级类型 /// </summary> protected EAudioLayerType _layerType;
/// <summary> /// 承载的GameObject /// </summary> protected GameObject _gameObject;
/// <summary> /// 静音设置 /// </summary> public virtual bool Mute { get => PlayerPrefs.GetInt($"_Audio_{_layerType}_Mute") == 1; set => PlayerPrefs.SetInt($"_Audio_{_layerType}_Mute", value ? 1 : 0); }
/// <summary> /// 音量设置 /// </summary> public virtual float Volume { get => PlayerPrefs.GetFloat($"_Audio_{_layerType}_Volume", 1); set => PlayerPrefs.SetFloat($"_Audio_{_layerType}_Volume", value); }
public AudioLayer(EAudioLayerType layerType, GameObject parent) { _layerType = layerType;
_gameObject = new GameObject(layerType.ToString()); _gameObject.transform.SetParent(parent.transform); }
/// <summary> /// 播放音频 /// </summary> /// <param name="clip"></param> /// <param name="loop"></param> public abstract void Play(AudioClip clip, bool loop);
/// <summary> /// 过度方式播放音频 /// </summary> /// <param name="clip"></param> /// <param name="loop"></param> /// <param name="fadeOutTime">上一首淡出时间</param> /// <param name="fadeInTime">下一首淡入时间</param> public abstract void Play(AudioClip clip, bool loop, float fadeOutTime, float fadeInTime);
/// <summary> /// 停止播放音频 /// </summary> public abstract void Stop(); }
|
其中Music,Ambient,Voice因为都只能同时播放一个,所以这三种是一种层级实现。
另外一个音效因为需要支持同时播放,所以是另外一种层级实现。
2. skynet配置表内存问题
之前设计每个player对应一个service,因为skynet框架设计是每个service都是一个独立的lua虚拟机,所以在player中require的配置表都会占一份内存,导致每个player内存在7M左右,1台8G的内存也只能支持500~800人同时在线。
通过优化改成skynet的sharetable,将player的内存降到了2M,还是挺可观的。
其他
女儿稳定几天没有发烧之后,于周五早上出院,结果晚上又发烧了(心力憔悴),好在这次跟之前比不算严重,最高直到39,而且药效也比较久,整个人精神也还行,只是连续的折腾,搞得一家人都特别辛苦,心理上的压力也很大。