ConfigDataManager.lua 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. --[[
  2. 带缓存的表配置读取帮助函数
  3. local tableConfig = gettable("cfg_xxx")
  4. local tableConfig = ConfigDataManager.getList("cfg_xxx")
  5. 替代
  6. 这么实现的原因:gettable命令用于读取表数据,而且往往会返回大量的数据(多条记录或整个表)。根据压测监控发现,将java中数据传递到lua脚本空间中需要大量拷贝操作,很消耗CPU,因此在脚本中直接缓存了数据来提高性能
  7. 注:如有热更新表的操作,需要同步热更新脚本
  8. ]]
  9. ConfigDataManager = {}
  10. local configMap = {}
  11. local configItemMap = {}
  12. local tableValueMap = {}
  13. function ConfigDataManager.clear()
  14. configMap = {}
  15. configItemMap = {}
  16. tableValueMap = {}
  17. end
  18. ---读取整个表配置
  19. function ConfigDataManager.getList(tableName)
  20. local found = table.getValue(configMap, tableName)
  21. if found ~= nil then
  22. return found
  23. end
  24. local configList = gettable(tableName)
  25. if configList ~= nil then
  26. configMap[tableName] = configList
  27. return configList
  28. end
  29. return nil
  30. end
  31. ---读取单个表配置项
  32. function ConfigDataManager.getById(tableName, id)
  33. local configList = ConfigDataManager.getTable(tableName, "id", id)
  34. if configList ~= nil and table.count(configList) >= 1 then
  35. return configList[1]
  36. end
  37. return nil
  38. end
  39. ---和java的gettable一样,返回列表的第一行
  40. function ConfigDataManager.getTableFirst(tableName, ...)
  41. local configList = ConfigDataManager.getTable(tableName, ...)
  42. if configList ~= nil and table.count(configList) >= 1 then
  43. return configList[1]
  44. end
  45. return nil
  46. end
  47. ---和java的gettable一样,返回的是列表
  48. function ConfigDataManager.getTable(tableName, ...)
  49. local success, ret = xpcall(getTable0, debug.traceback, tableName, ...)
  50. gameDebug.assertTrue(success, "getTable error", ret, "参数 ", tableName, ...)
  51. return ret
  52. end
  53. ---和java的gettablevalue一样,返回的是单个值
  54. function ConfigDataManager.getTableValue(tableName, ...)
  55. local success, ret = xpcall(getTableValue0, debug.traceback, tableName, ...)
  56. gameDebug.assertTrue(success, "getTableValue error", ret, "参数 ", tableName, ...)
  57. return ret
  58. end
  59. ---和java的gettable一样,返回的是列表
  60. function getTable0(tableName, ...)
  61. local args = { ... }
  62. local _key = tableName
  63. for i, v in pairs(args) do
  64. _key = _key .. "#" .. v
  65. end
  66. local found = table.getValue(configItemMap, _key)
  67. if found ~= nil then
  68. return found
  69. end
  70. local configList = gettable(tableName, ...)
  71. if configList ~= nil and table.count(configList) >= 1 then
  72. configItemMap[_key] = configList
  73. return configList
  74. end
  75. return nil
  76. end
  77. ---和java的gettablevalue一样,返回的是单个值
  78. function getTableValue0(tableName, ...)
  79. local args = { ... }
  80. local _key = tableName
  81. for i, v in pairs(args) do
  82. _key = _key .. "#" .. v
  83. end
  84. local found = table.getValue(tableValueMap, _key)
  85. if found ~= nil then
  86. return found
  87. end
  88. local cfg = gettablevalue(tableName, ...)
  89. if cfg ~= nil then
  90. tableValueMap[_key] = cfg
  91. return cfg
  92. end
  93. return nil
  94. end