优化基于网格的广告资源

时间:2017-12-12 11:17:43

标签: c# unity3d optimization unity5 inventory

我正在尝试创建基于网格的广告资源,到目前为止,除了一件事情之外,一切进展顺利。

广告资源包含由Grids构建的CellsGrids可以包含自定义尺寸(例如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;
                }
            }
        }

1 个答案:

答案 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;
        }
    }
}