我正在尝试创建基于网格的广告资源,到目前为止,除了一件事情之外,一切进展顺利。
广告资源包含由Grids
构建的Cells
,Grids
可以包含自定义尺寸(例如5x3,3x3)。每个Cell
始终为1x1,可以保留Items
,其大小可以不同(例如Grids
)。
我使用HandleCursor
函数处理库存中的交互,我在每一帧都运行该功能,以检查用户是否突出显示项目/单元格或移动内容。
正如你在下面的代码中看到的那样,我正在使用很多这样做,我想知道我是否可以以某种方式对其进行优化,因此在CPU上并不是很难(现在突出显示一个网格/ item使我的库存脚本创建了0.27-0.31ms的开销。
除了检查每个Rect
的{{1}}是否包含光标之外,还有其他更好的选择吗?
很抱歉,如果这是一个错误的地方,可以提出这类问题。
我的代码:
Cell
突出显示所有网格中的所有单元格:
void HandleHighlighting()
{
HandleHighlightingCells();
HandleHighlightingItems();
HandleHighlightingPickedItem();
}
突出显示广告资源中的项目:
void HandleHighlightingCells()
{
for (int i = 0; i < Grids.Count; i++)
{
InventoryGrid grid = Grids[i];
if (grid.GetRect().Contains(Input.mousePosition))
{
for (int x = 0; x < grid.width; x++)
{
for (int y = 0; y < grid.height; y++)
{
InventoryCell cell = grid.cells[x, y];
if (cell.GetRect().Contains(Input.mousePosition))
{
if (highlightedCell && highlightedCell != cell)
{
highlightedCell.Highlight(EItemHighlightMode.NONE);
}
highlightedCell = cell;
highlightedCell.Highlight(EItemHighlightMode.BASE);
}
else
{
if (cell == highlightedCell)
{
highlightedCell = null;
}
cell.Highlight(EItemHighlightMode.NONE);
}
}
}
}
else
{
for (int x = 0; x < grid.width; x++)
{
for (int y = 0; y < grid.height; y++)
{
InventoryCell cell = grid.cells[x, y];
if (highlightedCell && highlightedCell != cell)
{
if (highlightedCell.grid == grid)
{
highlightedCell = null;
}
}
cell.Highlight(EItemHighlightMode.NONE);
}
}
}
}
}
突出显示挑选的项目:
void HandleHighlightingItems()
{
if (highlightedCell && highlightedCell.heldItem)
{
InventoryItem item = highlightedCell.heldItem;
if (highlightedItem && highlightedItem != item)
{
for (int i = 0; i < highlightedItem.occupiedCells.Length; i++)
{
highlightedItem.occupiedCells[i].Highlight(EItemHighlightMode.NONE);
}
}
highlightedItem = item;
for (int i = 0; i < item.occupiedCells.Length; i++)
{
item.occupiedCells[i].Highlight(EItemHighlightMode.BASE);
}
}
else
{
if (highlightedItem)
{
for (int i = 0; i < highlightedItem.occupiedCells.Length; i++)
{
highlightedItem.occupiedCells[i].Highlight(EItemHighlightMode.NONE);
}
highlightedItem = null;
}
}
}
答案 0 :(得分:0)
在t3chb0t和来自codereview.stackexchange.com的juvian的帮助下,我设法将开销从~0.31ms减少到<0.08ms。
实际上我最终只更改了突出显示所有单元格的功能。
我将此作为答案发布,以便在其他人遇到类似问题时可见。
void HandleHighlightingCells()
{
Vector2 mousePos = Input.mousePosition;
bool anyHighlighted = false;
for (int i = 0; i < Grids.Count; i++)
{
InventoryGrid grid = Grids[i];
if (grid.GetRect().Contains(mousePos))
{
Vector2 uiPos = Vector2.zero;
RectTransformUtility.ScreenPointToLocalPointInRectangle(grid.cellsRoot.GetComponent<RectTransform>(), Input.mousePosition, GameManager.singleton.inventoryCanvas.worldCamera, out uiPos);
//64 is the constant size of a cell
int cellX = Mathf.FloorToInt(uiPos.x / 64);
int cellY = Mathf.FloorToInt(-uiPos.y / 64);
if(cellX < grid.width && cellY < grid.height)
{
cellX = Mathf.Clamp(cellX, 0, grid.width - 1);
cellY = Mathf.Clamp(cellY, 0, grid.height - 1);
InventoryCell cell = grid.cells[cellX, cellY];
if (highlightedCell && highlightedCell != cell)
{
highlightedCell.Highlight(EItemHighlightMode.NONE);
}
highlightedCell = cell;
highlightedCell.Highlight(EItemHighlightMode.BASE);
anyHighlighted = true;
}
}
}
if(!anyHighlighted)
{
if(highlightedCell)
{
highlightedCell.Highlight(EItemHighlightMode.NONE);
highlightedCell = null;
}
}
}