添加一个表格组件,原理上贴近现代表格系统,理论上可以应对超大型表格以及离散数据集合。

This commit is contained in:
2026-06-26 19:14:48 +08:00
parent 55ace8d02b
commit 61bb0b012e
78 changed files with 4409 additions and 57 deletions
@@ -0,0 +1,38 @@
using System.Runtime.CompilerServices;
using XericLibrary.Runtime.MacroLibrary;
namespace XericUI.XTable.Mapping
{
/// <summary>
/// 块映射工具——将块坐标与 Z 曲线索引进行相互转换。
/// 内部调用 <see cref="MacroCurveMapping"/> 的 Morton Code 编码/解码方法。
/// Z 曲线索引避免纯横向排列产生的空缺问题,提升空间局部性。
/// </summary>
public static class XTableBlockMapping
{
/// <summary>
/// 块坐标 → Z 曲线索引 (Morton Code)
/// </summary>
/// <param name="blockRow">块行号 (非负)</param>
/// <param name="blockCol">块列号 (非负)</param>
/// <returns>64 位 Z 曲线索引,用作块字典的 key</returns>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static ulong BlockCoordToZIndex(int blockRow, int blockCol)
{
return MacroCurveMapping.ZOrderEncode(blockCol, blockRow);
}
/// <summary>
/// Z 曲线索引 → 块坐标
/// </summary>
/// <param name="zIndex">Z 曲线索引</param>
/// <param name="blockRow">解码后的块行号</param>
/// <param name="blockCol">解码后的块列号</param>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void ZIndexToBlockCoord(ulong zIndex, out int blockRow, out int blockCol)
{
MacroCurveMapping.ZOrderDecode(zIndex, out blockCol, out blockRow);
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 6d2cad58624b7724fb43fdeca3aa2b50
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,79 @@
#if ENABLE_BURST
using Unity.Burst;
#endif
using System.Runtime.CompilerServices;
namespace XericUI.XTable.Mapping
{
/// <summary>
/// 表格坐标计算工具——提供单元格坐标 ↔ 块坐标 的转换方法。
/// 所有方法支持 Burst 编译加速。
/// </summary>
#if ENABLE_BURST
[BurstCompile]
#endif
public static class XTableCoordinateUtility
{
/// <summary>
/// 将全局单元格坐标 (row, col) 转换为 块坐标 + 块内局部坐标。
/// blockRow = row / blockSizeY, blockCol = col / blockSizeX
/// localRow = row % blockSizeY, localCol = col % blockSizeX
/// </summary>
#if ENABLE_BURST
[BurstCompile]
#endif
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void CellToBlockCoordinate(
int row, int col, int blockSizeX, int blockSizeY,
out int blockRow, out int blockCol,
out int localRow, out int localCol)
{
blockRow = row / blockSizeY;
blockCol = col / blockSizeX;
localRow = row % blockSizeY;
localCol = col % blockSizeX;
}
/// <summary>
/// 计算块内的线性索引。
/// index = localRow * blockSizeX + localCol
/// </summary>
#if ENABLE_BURST
[BurstCompile]
#endif
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static int LocalCellIndex(int localRow, int localCol, int blockSizeX)
{
return localRow * blockSizeX + localCol;
}
/// <summary>
/// 从块内线性索引反算局部行列坐标。
/// </summary>
#if ENABLE_BURST
[BurstCompile]
#endif
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void LocalCellFromIndex(int index, int blockSizeX,
out int localRow, out int localCol)
{
localRow = index / blockSizeX;
localCol = index % blockSizeX;
}
/// <summary>
/// 从全局行列坐标直接计算块内线性索引。
/// </summary>
#if ENABLE_BURST
[BurstCompile]
#endif
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static int GlobalCellToLocalIndex(int row, int col, int blockSizeX, int blockSizeY)
{
int localRow = row % blockSizeY;
int localCol = col % blockSizeX;
return localRow * blockSizeX + localCol;
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 45c10335c21cdf342816fd78d61cec09
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: