From bb284affe6541fa85c492ce9af26b4ee35805aab Mon Sep 17 00:00:00 2001 From: hch <305670599@qq.com> Date: 星期二, 12 三月 2019 14:25:07 +0800 Subject: [PATCH] 6328 【后端】优化代码eval -- 玩家缓存数据提取常用字段 等级和最后一次发送时间 --- ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerGeTui.py | 39 ++++++++---- ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerViewCache.py | 17 +++-- ServerPython/CoreServerGroup/GameServer/Script/IPY_PlayerViewCache.py | 8 ++ ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFriend.py | 3 ServerPython/CoreServerGroup/GameServer/Script/ChMapToGamePyPack.py | 11 +++ ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChMapToGamePyPack.py | 11 +++ ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCacheTube.py | 2 Tool/数据库/ChangeAccount/Collections/DataServerPlayerData.py | 61 ++++++++++++++------ 8 files changed, 104 insertions(+), 48 deletions(-) diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChMapToGamePyPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChMapToGamePyPack.py index 7e666f7..741718a 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/ChMapToGamePyPack.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/ChMapToGamePyPack.py @@ -672,6 +672,7 @@ PlusDataSize = 0 #(DWORD PlusDataSize) PlusData = "" #(String PlusData)//扩展记录 IsLogouting = 0 #(BYTE IsLogouting)//本次是否为下线同步 + OffTime = 0 #(DWORD OffTime)// 下线时间戳 data = None def __init__(self): @@ -692,6 +693,7 @@ self.PlusDataSize,_pos = CommFunc.ReadDWORD(_lpData, _pos) self.PlusData,_pos = CommFunc.ReadString(_lpData, _pos,self.PlusDataSize) self.IsLogouting,_pos = CommFunc.ReadBYTE(_lpData, _pos) + self.OffTime,_pos = CommFunc.ReadDWORD(_lpData, _pos) return _pos def Clear(self): @@ -708,6 +710,7 @@ self.PlusDataSize = 0 self.PlusData = "" self.IsLogouting = 0 + self.OffTime = 0 return def GetLength(self): @@ -722,6 +725,7 @@ length += 4 length += len(self.PlusData) length += 1 + length += 4 return length @@ -737,6 +741,7 @@ data = CommFunc.WriteDWORD(data, self.PlusDataSize) data = CommFunc.WriteString(data, self.PlusDataSize, self.PlusData) data = CommFunc.WriteBYTE(data, self.IsLogouting) + data = CommFunc.WriteDWORD(data, self.OffTime) return data def OutputString(self): @@ -750,7 +755,8 @@ ItemData:%s, PlusDataSize:%d, PlusData:%s, - IsLogouting:%d + IsLogouting:%d, + OffTime:%d '''\ %( self.Head.OutputString(), @@ -762,7 +768,8 @@ self.ItemData, self.PlusDataSize, self.PlusData, - self.IsLogouting + self.IsLogouting, + self.OffTime ) return DumpString diff --git a/ServerPython/CoreServerGroup/GameServer/Script/IPY_PlayerViewCache.py b/ServerPython/CoreServerGroup/GameServer/Script/IPY_PlayerViewCache.py index c62a0c1..aa30a6a 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/IPY_PlayerViewCache.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/IPY_PlayerViewCache.py @@ -233,8 +233,12 @@ def Clear(self): return _IPY_PlayerViewCache.IPY_PlayerViewCache_Clear(self) def GetPlayerID(self): return _IPY_PlayerViewCache.IPY_PlayerViewCache_GetPlayerID(self) def SetPlayerID(self, *args): return _IPY_PlayerViewCache.IPY_PlayerViewCache_SetPlayerID(self, *args) - def GetUpdateTime(self): return _IPY_PlayerViewCache.IPY_PlayerViewCache_GetUpdateTime(self) - def SetUpdateTime(self, *args): return _IPY_PlayerViewCache.IPY_PlayerViewCache_SetUpdateTime(self, *args) + def GetPlayerLV(self): return _IPY_PlayerViewCache.IPY_PlayerViewCache_GetPlayerLV(self) + def SetPlayerLV(self, *args): return _IPY_PlayerViewCache.IPY_PlayerViewCache_SetPlayerLV(self, *args) + def GetOffTime(self): return _IPY_PlayerViewCache.IPY_PlayerViewCache_GetOffTime(self) + def SetOffTime(self, *args): return _IPY_PlayerViewCache.IPY_PlayerViewCache_SetOffTime(self, *args) + def GetGeTuiID(self): return _IPY_PlayerViewCache.IPY_PlayerViewCache_GetGeTuiID(self) + def SetGeTuiID(self, *args): return _IPY_PlayerViewCache.IPY_PlayerViewCache_SetGeTuiID(self, *args) def SetPropData(self, *args): return _IPY_PlayerViewCache.IPY_PlayerViewCache_SetPropData(self, *args) def GetPropData(self): return _IPY_PlayerViewCache.IPY_PlayerViewCache_GetPropData(self) def SetItemData(self, *args): return _IPY_PlayerViewCache.IPY_PlayerViewCache_SetItemData(self, *args) diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFriend.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFriend.py index ef6881f..4070bbf 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFriend.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFriend.py @@ -81,8 +81,7 @@ #玩家的数据没有缓存过 PlayerControl.NotifyCode(curPlayer, 'Friend_OffLine') return - cacheDict = eval(curCache.GetPropData()) - tagLV = cacheDict["LV"] + tagLV = curCache.GetPlayerLV() else: tagLV = tagPlayer.GetLV() diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerGeTui.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerGeTui.py index 8f3468d..be9c0d5 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerGeTui.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerGeTui.py @@ -86,14 +86,6 @@ # 检查是否可以个推,geTuiType小于0的代表默认可推,无VIP限制 def CheckCanGeTui(playerCache, geTuiType=-1): - if not playerCache.get("GeTuiClientID", ""): - return False - - # 离线超过24小时不再推送,目前极光推送的特点是推送ID同机器不同包都是同一个ID - if not playerCache.get("Time", 0): - return False - if time.time() - playerCache.get("Time", 0) > 24*60*60: - return False if not playerCache.get("VIPLV", 0): if geTuiType < 0: @@ -263,6 +255,16 @@ return True return True +# 个推基础判定 +def CanGeTuiByCache(curCache): + if not curCache.GetGeTuiID(): + return False + + # 离线超过24小时不再推送,目前极光推送的特点是推送ID同机器不同包都是同一个ID + if time.time() - curCache.GetOffTime() > 24*60*60: + return False + return True + def BossAttentionGeTui(bossData, bossID): if bossData.GetMapID() == ChConfig.Def_FBMapID_SealDemon: # 非VIP玩家 封魔坛个推 @@ -281,17 +283,24 @@ curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID) if curPlayer and not PlayerControl.GetIsTJG(curPlayer): continue - + + # 离线玩家 + curCache = PlayerViewCache.ViewCacheMgr.FindCache(playerID) + if not curCache: + continue + + if not CanGeTuiByCache(curCache): + #无推送资格,减少检索和eval + continue + recordDict = eval(bossAttentionData.RecordData) if recordDict.get(bossID, 0) in [0, 9]: #0-默认未关注, 1-主动关注, 2-自动关注, 9-主动取消关注 continue - curCache = PlayerViewCache.ViewCacheMgr.FindCache(playerID) - if not curCache: - continue + cacheDict = eval(curCache.GetPropData()) if not CheckCanGeTui(cacheDict, geTuiType): - # 过滤个推 + # 个推逻辑检查 continue if not CheckBossGeTuiCnt(playerID, bossID, geTuiType, cacheDict): @@ -327,6 +336,10 @@ if not curCache: return + if not CanGeTuiByCache(curCache): + #无推送资格,基础判定 + return + cacheDict = eval(curCache.GetPropData()) if not CheckCanGeTui(cacheDict, Def_Onoff_Chat): # 过滤个推 diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerViewCache.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerViewCache.py index ae14d3b..959c0e7 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerViewCache.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerViewCache.py @@ -55,11 +55,13 @@ ##更新缓存数据 # @param PlayerID, PropData, ItemData, PlusData, isSaveDB # @return None -def UpdatePlayerCache(PlayerID, PropData, ItemData, PlusData, isSaveDB=False): +def UpdatePlayerCache(PlayerID, PropData, ItemData, PlusData, isSaveDB=False, packData=None): curCache = ViewCacheMgr.FindCache(PlayerID) if not curCache: curCache = ViewCacheMgr.AddNewCache(PlayerID) - curCache.SetUpdateTime(GameWorld.GetCurrentDataTimeStr()) + if packData: + curCache.SetPlayerLV(packData.PlayerLV) + curCache.SetOffTime(packData.OffTime) GameWorld.DebugLog('ViewCache### UpdatePlayerCache PlayerID %s, \ @@ -106,13 +108,15 @@ ##玩家下线缓存数据 # @param PlayerID, PlayerLV, PropData, ItemData, PlusData # @return None -def OnPlayerLogout(PlayerID, PlayerLV, PropData, ItemData, PlusData): +def OnPlayerLogout(curPackData): + PlayerID = curPackData.PlayerID + PlayerLV = curPackData.PlayerLV #不需要保存离线数据的,直接删除缓存数据 if not IsNeedSaveLogoutPlayer(PlayerID, PlayerLV): ViewCacheMgr.DeleteCache(PlayerID) return #更新数据,并设置需要保存数据库 - UpdatePlayerCache(PlayerID, PropData, ItemData, PlusData, True) + UpdatePlayerCache(PlayerID, curPackData.PropData, curPackData.ItemData, curPackData.PlusData, True, packData=curPackData) return ## 根据规则判定是否需要继续保存离线玩家数据 @@ -179,12 +183,11 @@ PlayerID = curPackData.PlayerID PlayerLV = curPackData.PlayerLV if curPackData.IsLogouting: - OnPlayerLogout(PlayerID, PlayerLV, \ - curPackData.PropData, curPackData.ItemData, curPackData.PlusData) + OnPlayerLogout(curPackData) else: # 此处保存设置为True是为安全防范,比如突然断电,宕机等情况 导致误以为不保存,故等级可设置高一点 UpdatePlayerCache(PlayerID, curPackData.PropData, \ - curPackData.ItemData, curPackData.PlusData, True if PlayerLV > 150 else False) + curPackData.ItemData, curPackData.PlusData, True if PlayerLV > 150 else False, packData=curPackData) GameWorld.DebugLog('ViewCache### OnMGUpdatePlayerCache out') return diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChMapToGamePyPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChMapToGamePyPack.py index 7e666f7..741718a 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChMapToGamePyPack.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChMapToGamePyPack.py @@ -672,6 +672,7 @@ PlusDataSize = 0 #(DWORD PlusDataSize) PlusData = "" #(String PlusData)//扩展记录 IsLogouting = 0 #(BYTE IsLogouting)//本次是否为下线同步 + OffTime = 0 #(DWORD OffTime)// 下线时间戳 data = None def __init__(self): @@ -692,6 +693,7 @@ self.PlusDataSize,_pos = CommFunc.ReadDWORD(_lpData, _pos) self.PlusData,_pos = CommFunc.ReadString(_lpData, _pos,self.PlusDataSize) self.IsLogouting,_pos = CommFunc.ReadBYTE(_lpData, _pos) + self.OffTime,_pos = CommFunc.ReadDWORD(_lpData, _pos) return _pos def Clear(self): @@ -708,6 +710,7 @@ self.PlusDataSize = 0 self.PlusData = "" self.IsLogouting = 0 + self.OffTime = 0 return def GetLength(self): @@ -722,6 +725,7 @@ length += 4 length += len(self.PlusData) length += 1 + length += 4 return length @@ -737,6 +741,7 @@ data = CommFunc.WriteDWORD(data, self.PlusDataSize) data = CommFunc.WriteString(data, self.PlusDataSize, self.PlusData) data = CommFunc.WriteBYTE(data, self.IsLogouting) + data = CommFunc.WriteDWORD(data, self.OffTime) return data def OutputString(self): @@ -750,7 +755,8 @@ ItemData:%s, PlusDataSize:%d, PlusData:%s, - IsLogouting:%d + IsLogouting:%d, + OffTime:%d '''\ %( self.Head.OutputString(), @@ -762,7 +768,8 @@ self.ItemData, self.PlusDataSize, self.PlusData, - self.IsLogouting + self.IsLogouting, + self.OffTime ) return DumpString diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCacheTube.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCacheTube.py index 9384eae..fbe96b7 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCacheTube.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCacheTube.py @@ -73,6 +73,7 @@ sendPack.PlusData = curPlayerPlusData sendPack.PlusDataSize = len(curPlayerPlusData) sendPack.IsLogouting = IsLogouting #通知本次同步是否下线前保存 + sendPack.OffTime = int(time.time()) # 最后一次发送即当做离线时间 NetPackCommon.SendPyPackToGameServer(sendPack) GameWorld.DebugLog('ViewCache### UpdateGameServerPlayerCache out') return @@ -106,7 +107,6 @@ curPlayerPropDict[ChConfig.Def_PDict_GeTuiSet] = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GeTuiSet) curPlayerPropDict[ChConfig.Def_PDict_NoGeTuiTime] = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_NoGeTuiTime) curPlayerPropDict['GeTuiClientID'] = curPlayer.GetAccountData().GetGeTuiClientID() - curPlayerPropDict['Time'] = int(time.time()) # 最后一次发送即当做离线时间 # 各类功能 BOSS次数, BOSS相关对应B.Boss信息.xlsx的CntMark # 封魔坛剩余次数 diff --git "a/Tool/\346\225\260\346\215\256\345\272\223/ChangeAccount/Collections/DataServerPlayerData.py" "b/Tool/\346\225\260\346\215\256\345\272\223/ChangeAccount/Collections/DataServerPlayerData.py" index 4ee595f..549e0c8 100644 --- "a/Tool/\346\225\260\346\215\256\345\272\223/ChangeAccount/Collections/DataServerPlayerData.py" +++ "b/Tool/\346\225\260\346\215\256\345\272\223/ChangeAccount/Collections/DataServerPlayerData.py" @@ -18854,13 +18854,15 @@ else: self.GUID = Str[:40] - #玩家数据查看缓存表#tagPlayerViewCache class tagPlayerViewCache(Structure): _pack_ = 1 _fields_ = [ ('PlayerID', ctypes.c_ulong), - ('UpdateTime', ctypes.c_char * 30), + ('GeTuiIDSize', ctypes.c_ubyte), + ('GeTuiID', ctypes.c_char_p), + ('LV', ctypes.c_ushort), + ('OffTime', ctypes.c_ulong), ('PropDataSize', ctypes.c_ulong), ('PropData', ctypes.c_char_p), ('ItemDataSize', ctypes.c_ulong), @@ -18876,7 +18878,10 @@ def clear(self): self.PlayerID = 0 - self.UpdateTime = '' + self.GeTuiIDSize = 0 + self.GeTuiID = '' + self.LV = 0 + self.OffTime = 0 self.PropDataSize = 0 self.PropData = '' self.ItemDataSize = 0 @@ -18894,7 +18899,11 @@ mylog.error(msg) self.clear() self.PlayerID, pos = CommFunc.ReadDWORD(buf, pos) - self.UpdateTime, pos = CommFunc.ReadString(buf, pos, 30) + self.GeTuiIDSize, pos = CommFunc.ReadBYTE(buf, pos) + tmp, pos = CommFunc.ReadString(buf, pos, self.GeTuiIDSize) + self.GeTuiID = ctypes.c_char_p(tmp) + self.LV, pos = CommFunc.ReadWORD(buf, pos) + self.OffTime, pos = CommFunc.ReadDWORD(buf, pos) self.PropDataSize, pos = CommFunc.ReadDWORD(buf, pos) tmp, pos = CommFunc.ReadString(buf, pos, self.PropDataSize) self.PropData = ctypes.c_char_p(tmp) @@ -18909,7 +18918,10 @@ def getBuffer(self): buf = '' buf = CommFunc.WriteDWORD(buf, self.PlayerID) - buf = CommFunc.WriteString(buf, sizeof(ctypes.c_char) * 30, self.UpdateTime) + buf = CommFunc.WriteBYTE(buf, self.GeTuiIDSize) + buf = CommFunc.WriteString(buf, self.GeTuiIDSize, self.GeTuiID) + buf = CommFunc.WriteWORD(buf, self.LV) + buf = CommFunc.WriteDWORD(buf, self.OffTime) buf = CommFunc.WriteDWORD(buf, self.PropDataSize) buf = CommFunc.WriteString(buf, self.PropDataSize, self.PropData) buf = CommFunc.WriteDWORD(buf, self.ItemDataSize) @@ -18921,7 +18933,10 @@ def getLength(self): length = 0 length += sizeof(ctypes.c_ulong) - length += sizeof(ctypes.c_char) * 30 + length += sizeof(ctypes.c_ubyte) + length += self.GeTuiIDSize + length += sizeof(ctypes.c_ushort) + length += sizeof(ctypes.c_ulong) length += sizeof(ctypes.c_ulong) length += self.PropDataSize length += sizeof(ctypes.c_ulong) @@ -18934,7 +18949,10 @@ '''组织存储记录''' rec = {} rec[u'PlayerID'] = self.PlayerID - rec[u'UpdateTime'] = fix_incomingText(self.UpdateTime) + rec[u'GeTuiIDSize'] = self.GeTuiIDSize + rec[u'GeTuiID'] = fix_incomingText(self.GeTuiID) + rec[u'LV'] = self.LV + rec[u'OffTime'] = self.OffTime rec[u'PropDataSize'] = self.PropDataSize rec[u'PropData'] = fix_incomingText(self.PropData) rec[u'ItemDataSize'] = self.ItemDataSize @@ -18946,7 +18964,10 @@ def readRecord(self, rec): '''由于MongoDB读出来是unicode,所有字符串需要进行转换''' self.PlayerID = rec.get(u'PlayerID', 0) - self.UpdateTime = fix_outgoingText(rec.get(u'UpdateTime', u'')) + self.GeTuiIDSize = rec.get(u'GeTuiIDSize', 0) + self.GeTuiID = fix_outgoingText(rec.get(u'GeTuiID', u'')) + self.LV = rec.get(u'LV', 0) + self.OffTime = rec.get(u'OffTime', 0) self.PropDataSize = rec.get(u'PropDataSize', 0) self.PropData = fix_outgoingText(rec.get(u'PropData', u'')) self.ItemDataSize = rec.get(u'ItemDataSize', 0) @@ -19057,7 +19078,10 @@ def outputString(self): output = '''//玩家数据查看缓存表#tagPlayerViewCache: PlayerID = %s, - UpdateTime = %s, + GeTuiIDSize = %s, + GeTuiID = %s, + LV = %s, + OffTime = %s, PropDataSize = %s, PropData = %s, ItemDataSize = %s, @@ -19067,7 +19091,10 @@ ADOResult = %s, '''%( self.PlayerID, - self.UpdateTime, + self.GeTuiIDSize, + self.GeTuiID, + self.LV, + self.OffTime, self.PropDataSize, self.PropData, self.ItemDataSize, @@ -19079,9 +19106,12 @@ return output def dumpString(self): - output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%( + output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%( self.PlayerID, - self.UpdateTime, + self.GeTuiIDSize, + self.GeTuiID, + self.LV, + self.OffTime, self.PropDataSize, self.PropData, self.ItemDataSize, @@ -19091,13 +19121,6 @@ ) return output - #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错 - def SetUpdateTime(self,Str): - if len(Str)<=30: - self.UpdateTime = Str - else: - self.UpdateTime = Str[:30] - #玩家好友表#tagDBPyPlayerFriend -- Gitblit v1.8.0