72. 2023-08-06周总结

  1. AudioManager PlayOneShot问题
  2. 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,而且药效也比较久,整个人精神也还行,只是连续的折腾,搞得一家人都特别辛苦,心理上的压力也很大。