2017-12-12 14 views
0

격자 기반 인벤토리를 만들려고 노력 중이며 지금까지 한 가지를 제외하고는 모든 것이 잘 진행되고 있습니다.격자 기반 인벤토리 최적화

인벤토리는 으로 구성되고 Grids은 사용자 정의 크기 (예 : 5x3, 3x3)를 가질 수 있습니다. Cell은 항상 1x1이며 다른 크기 (예 : Grids) 일 수있는 Items을 보유 할 수 있습니다.

HandleCursor 함수를 사용하여 인벤토리에서 상호 작용을 처리하고 있는데, 사용자가 항목/셀 또는 물건을 움직여서 강조 표시하는지 확인하기 위해 모든 프레임을 실행하는 기능입니다.

아래의 코드에서 볼 수 있듯이 나는 그것을 수행하기 위해 많은 것을 사용하고 있습니다. 어떻게 든 최적화 할 수 있다면 궁금합니다. 그래서 CPU에서 어렵지 않습니다. (바로 지금 그리드를 강조 표시합니다.)/항목은 내 인벤토리 스크립트 0.27-0.31ms의 오버 헤드를 만들 수 있습니다.

CellRect 내 커서를 포함하는 경우 검사보다 더 나은 대안이 있습니까?

는이 종류를 물어 잘못된 장소 인 경우

죄송합니다 질문 수 :

내 코드 :

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

강조 포착 항목 :

 void HandleHighlightingPickedItem() 
     { 
      if (pickedItem) 
      { 
       if (highlightedCell) 
       { 
        InventoryGrid grid = highlightedCell.grid; 
        InventoryCell[] cellsToHighlight = new InventoryCell[pickedItem.width * pickedItem.height]; 
        InventoryItem firstItem = null; 

        bool valid = true; 

        int index = 0; 
        for (int x = 0; x < pickedItem.width; x++) 
        { 
         for (int y = 0; y < pickedItem.height; y++) 
         { 
          if (highlightedCell.x + x < grid.width && highlightedCell.y + y < grid.height) 
          { 
           InventoryCell cell = grid.cells[highlightedCell.x + x, highlightedCell.y + y]; 
           cellsToHighlight[index] = cell; 

           if (highlightedItem) 
           { 
            if (cell.heldItem != highlightedItem) 
            { 
             if (cell.heldItem) 
             { 
              valid = false; 
             } 
            } 
           } 
           else 
           { 
            if (cell.heldItem) 
            { 
             if (!firstItem) 
             { 
              firstItem = cell.heldItem; 
             } 
             else 
             { 
              if (cell.heldItem != firstItem) 
              { 
               valid = false; 
              } 
             } 
            } 
           } 
          } 
          else 
          { 
           valid = false; 
          } 

          index++; 
         } 
        } 

        for (int i = 0; i < cellsToHighlight.Length; i++) 
        { 
         if (cellsToHighlight[i]) 
         { 
          if (valid) 
          { 
           cellsToHighlight[i].Highlight(EItemHighlightMode.VALID); 
          } 
          else 
          { 
           cellsToHighlight[i].Highlight(EItemHighlightMode.INVALID); 
          } 
         } 
        } 
       } 
      } 
     } 
+0

Theres는 '코드 리뷰 사이트 : https://codereview.stackexchange.com/ – Adelin

+0

@Adelin 내가 그것을 바로 이곳입니다 있는지 확실하지 않습니다하지만 난 거기 – Fiffe

+1

을 게시합니다, 감사합니다. 도움말 센터를 확인하십시오. 받아 들일 수없는 제목의 사례를 보았을 수도 있습니다. [...] : [if 문을 단순화합니다. (너무 많은 질문에 적용됩니다.] (https : // codereview. stackexchange.com/help/how-to-ask)* – Adelin

답변

0
t3chb0t의 도움으로

및 코레 본에서 유래 한 소년 .stackexchange.com 오버 헤드를 ~ 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; 
     } 
    } 
}