# 组件与接口使用优化

# 前言

MC的强大在于他的开放性,为开发者提供了大量系统功能和Api做支持,但很多功能如果使用不当,容易出现性能问题。这里会列出一些需要注意的系统功能的使用。

# 角色特效数量控制

# 意义

因为实际游戏中会存在多个角色同时显示在屏幕内的情况,所以如果是绑定在角色身上的特效需要更为注重性能问题,避免往角色身上挂接会发射大量粒子的粒子特效,或者挂接大量序列帧或者文本。

# 粒子特效使用太多

  • 错误写法: (自定义的翅膀,定义了每秒发射200到300个粒子,太多了,如果同屏有6个玩家,就是1200到1800个粒子,粒子的更新与渲染都有一定性能消耗)
    # 某个翅膀的定义 testWind.json:    
    {
    "particleeffect": {
        "emissionrate": {
            "max": "300.0",
            "min": "200.0"
        },
        ...(省略无关代码)
    }    
  • 正确写法: (以下几个方案可结合使用)
    1)方案1, 严格控制粒子数量在100左右
    # 某个翅膀的定义 testWind.json:    
    {
    "particleeffect": {
        "emissionrate": {
            "max": "100.0",
            "min": "80.0"
        },
        ...(省略无关代码)
    }

    2)方案2,分档定义多个翅膀,游戏内让玩家根据自己设备配置自行选择
    # 高配翅膀
    {
    "particleeffect": {
        "emissionrate": {
            "max": "300.0",
            "min": "280.0"
        },
        ...(省略无关代码)
    }
    # 中配翅膀
    {
    "particleeffect": {
        "emissionrate": {
            "max": "200.0",
            "min": "180.0"
        },
        ...(省略无关代码)
    }
    # 低配翅膀
    {
    "particleeffect": {
        "emissionrate": {
            "max": "100.0",
            "min": "80.0"
        },
        ...(省略无关代码)
    }
    3)方案3,提供显示隐藏特效切换按钮,提供显示隐藏其它玩家特效切换按钮,玩家觉得卡顿时可随时自行切换。

# 点对点的消息同步

# 意义

服务端消息通知客户端能点对点就不要广播,游戏中服务端经常需要下发消息给客户端,如果采用广播的话,全部客户端都会收到,只对某个玩家发的消息不应该用广播。

例子:游戏中有A,B,C三位玩家,服务端给A发消息:

  • 错误写法: (广播给所有人,其实其它人根本不需要接收这个消息,会浪费这多余的流量与性能)
    # 客户端:
    class MyClientSystem(ClientSystem):
        def __init__(self, namespace, systemName):
            ClientSystem.__init__(self, namespace, systemName)
            # 注册监听
            self.ListenForEvent(clientApi.GetEngineNamespace(), clientApi.GetEngineSystemName(), 'OnServerSay', self, self.OnServerSay)

        # 监听回调函数
        def OnServerSay(self, data):
            if data["playerId"] == clientApi.GetLocalPlayerId():
                print("server talk to me, content:", data["content"])

    # 服务端
    class UIDemoServerSystem(ServerSystem):   
        def talkToClient(self, playerId):
            # 广播方式
            self.BroadcastToAllClient("OnServerSay", {
                "playerId": playerId,
                "content": "hello!"
            })

        def func(self):
            self.talkToClient(playerAId)
  • 正确写法:
        # 客户端:
    class MyClientSystem(ClientSystem):
        def __init__(self, namespace, systemName):
            ClientSystem.__init__(self, namespace, systemName)
            # 注册监听
            self.ListenForEvent(clientApi.GetEngineNamespace(), clientApi.GetEngineSystemName(), 'OnServerSay', self, self.OnServerSay)

        # 监听回调函数
        def OnServerSay(self, data):
            print("server talk to me, content:", data["content"])

    # 服务端
    class UIDemoServerSystem(ServerSystem):   
        def talkToClient(self, playerId):
            # 点对点发送的方式
            self.NotifyToClient(playerId, "OnServerSay", {                
                "content": "hello!"
            })

        def func(self):
            self.talkToClient(playerAId)