Files
Main/Assets/Code/Logic/_Required/Lua/CfgBinaryData.cs

174 lines
6.6 KiB
C#
Raw Normal View History

2025-01-25 04:38:09 +08:00
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using Thousandto.Code.Center;
using UnityEngine;
using XLua;
public static class CfgBinaryData
{
private static int _xluaPtrSize = -1;
private static int _xluaTvalueSize = -1;
private static Dictionary<string, LuaTable> _compressTables = new Dictionary<string, LuaTable>(400);
private static Dictionary<string, LuaTable> _columnTables = new Dictionary<string, LuaTable>(400);
private static Dictionary<string, int> _keyCounts = new Dictionary<string, int>(400);
private static Dictionary<string, int> _compressCols = new Dictionary<string, int>(400);
private static Dictionary<string, Dictionary<string, int>> _nameIndexs = new Dictionary<string, Dictionary<string, int>>(400);
public static bool GetBaseDataValues(string name, out int keyCount, out int indexFactor, out IntPtr compressData, out IntPtr columnShiftAndList, out int compressMaxColumn, out Dictionary<string, int> nameIndexs)
{
compressData = IntPtr.Zero;
columnShiftAndList = IntPtr.Zero;
keyCount = 0;
compressMaxColumn = 0;
nameIndexs = null;
if (_xluaPtrSize < 0)
{
_xluaPtrSize = XLua.LuaDLL.Lua.xlua_getptrsize(IntPtr.Zero);
}
if (_xluaTvalueSize < 0)
{
_xluaTvalueSize = XLua.LuaDLL.Lua.xlua_gettvaluesize(IntPtr.Zero);
}
indexFactor = _xluaTvalueSize / sizeof(int);
try
{
if (!_keyCounts.TryGetValue(name, out keyCount))
{
var tableName = string.Format("DataConfig.Data{0}.Count", name);
keyCount = GameCenter.LuaSystem.GetGlobalInPath<int>(tableName);
_keyCounts.Add(name, keyCount);
}
if (!_compressCols.TryGetValue(name, out compressMaxColumn))
{
var tableName = string.Format("DataConfig.Data{0}._CompressMaxColumn_", name);
compressMaxColumn = GameCenter.LuaSystem.GetGlobalInPath<int>(tableName);
_compressCols.Add(name, compressMaxColumn);
}
if(!_nameIndexs.TryGetValue(name, out nameIndexs))
{
var tableName = string.Format("DataConfig.Data{0}._ColumnNameIndexs_", name);
nameIndexs = GameCenter.LuaSystem.GetGlobalInPath<Dictionary<string, int>>(tableName);
_nameIndexs.Add(name, nameIndexs);
}
if ((_xluaPtrSize == 4 || _xluaPtrSize == 8) && _xluaTvalueSize > 0 && _xluaTvalueSize % sizeof(int) == 0)
{
//获取配置table
LuaTable table = null;
if (!_compressTables.TryGetValue(name, out table))
{
var tableName = string.Format("DataConfig.Data{0}._CompressData_", name);
table = GameCenter.LuaSystem.GetGlobalInPath<LuaTable>(tableName);
_compressTables.Add(name, table);
}
LuaTable table2 = null;
if (!_columnTables.TryGetValue(name, out table2))
{
var tableName = string.Format("DataConfig.Data{0}._ColumnShiftAndList_", name);
table2 = GameCenter.LuaSystem.GetGlobalInPath<LuaTable>(tableName);
_columnTables.Add(name, table2);
}
if (table != null && table2 != null)
{
unsafe
{
//读取数据指针
var ptr = (byte*)table.GetPtr().ToPointer();
//第16位为数据地址
var arrayPtr = *(long*)(ptr + _xluaPtrSize + 8);
compressData = new IntPtr((void*)arrayPtr);
//读取数据指针
ptr = (byte*)table2.GetPtr().ToPointer();
//第16位为数据地址
arrayPtr = *(long*)(ptr + _xluaPtrSize + 8);
columnShiftAndList = new IntPtr((void*)arrayPtr);
}
}
else
{
return false;
}
return true;
}
return true;
}
catch (Exception)
{
UnityEngine.Debug.LogErrorFormat("配置表 {0} 加载报错", name);
return false;
}
}
public static bool GetDataValues(string name, out IntPtr compressData)
{
compressData = IntPtr.Zero;
if (_xluaPtrSize < 0)
{
_xluaPtrSize = XLua.LuaDLL.Lua.xlua_getptrsize(IntPtr.Zero);
}
if (_xluaTvalueSize < 0)
{
_xluaTvalueSize = XLua.LuaDLL.Lua.xlua_gettvaluesize(IntPtr.Zero);
}
try
{
if ((_xluaPtrSize == 4 || _xluaPtrSize == 8) && _xluaTvalueSize > 0 && _xluaTvalueSize % sizeof(int) == 0)
{
//获取配置table
LuaTable table = null;
if (!_compressTables.TryGetValue(name, out table))
{
var tableName = string.Format("DataConfig.Data{0}._CompressData_", name);
table = GameCenter.LuaSystem.GetGlobalInPath<LuaTable>(tableName);
_compressTables.Add(name, table);
}
if (table != null)
{
unsafe
{
//读取数据指针
var ptr = (byte*)table.GetPtr().ToPointer();
//第16位为数据地址
var arrayPtr = *(long*)(ptr + _xluaPtrSize + 8);
compressData = new IntPtr((void*)arrayPtr);
}
}
else
{
return false;
}
return true;
}
return true;
}
catch (Exception)
{
UnityEngine.Debug.LogErrorFormat("配置表 {0} 加载报错", name);
return false;
}
}
//清除单个缓存
public static void Remove(string name)
{
_compressTables.Remove(name);
_columnTables.Remove(name);
_keyCounts.Remove(name);
_compressCols.Remove(name);
_nameIndexs.Remove(name);
}
//清除所有缓存
public static void RemoveAll()
{
_compressTables.Clear();
_columnTables.Clear();
_keyCounts.Clear();
_compressCols.Clear();
_nameIndexs.Clear();
}
}