2011-03-16 3 views
1

여기에 문제가 있습니다. 내 게임에서 내 Gui 용 TextBox를 만들었습니다.이 열을 행에 최적화하는 알고리즘 및 그 반대로 알고리즘

단어의 크기가 조정되기 때문에 크기를 조정할 때마다 텍스트 문자열에서 어떤 색인이 캐럿인지 알아 내야합니다. 그런 다음 크기 조정 후 해당 행 열로 변환해야합니다. . 내 프로파일 러에 따르면 가장 느린 부분은 다음 유니 코드 문자를 구할 때입니다.

int AguiTextBox::indexFromColumnRow(int column, int row, bool includeUnwantedChars) const 
    { 
     size_t rowLen = 0; 

     int retIndex = -1; 
     int bytesSkipped = 0; 
     int curCharLen = 0; 
     std::string curChar; 

     std::string::const_iterator it = getText().begin(); 
     std::string::const_iterator end = getText().end(); 


     //decrement column so that the lowest is -1 
     column--; 
     if(textRows.size() == 0 || (column == -1 && row == 0)) 
     { 
      //not in the text 
      return -1; 
     } 
0.01s  for(size_t i = 0; i < textRows.size(); ++i) 
     { 
      //get length of row 
0.00s   rowLen = _unicodeFunctions.getUtf8StringLength(textRows[i]); 

      //handle -1th case 

      //get next character 
      do 
      { 
0.00s    curCharLen = _unicodeFunctions.bringToNextUnichar(it,end); 
0.01s    curChar = getText().substr(bytesSkipped,curCharLen); 
       bytesSkipped += curCharLen; 
       if(includeUnwantedChars) 
        retIndex++; 
      } while (curChar[0] >= 0 && curChar[0] < ' ' && curChar != "\n"); 

      if(!includeUnwantedChars) 
      retIndex++; 

      //only increase for newlines 
0.00s   if(curChar != "\n") 
      { 
       bytesSkipped -= curCharLen; 
       retIndex--; 
       it -= curCharLen; 
      } 

      if((int)i == row && column == -1) 
      { 
       return retIndex; 
      } 


0.06s   for(size_t j = 0; j < rowLen; ++j) 
      { 
       //get next character 
       do 
       { 
0.10s     curCharLen = _unicodeFunctions.bringToNextUnichar(it,end); 
0.91s     curChar = getText().substr(bytesSkipped,curCharLen); 
0.03s     bytesSkipped += curCharLen; 

0.03s     if(includeUnwantedChars) 
         retIndex++; 

0.11s    } while (curChar[0] >= 0 && curChar[0] < ' ' && curChar != "\n"); 

0.06s    if(!includeUnwantedChars) 
0.00s     retIndex++; 

0.02s    if((int)i == row && (int)j == column) 
       { 
        return retIndex; 
       } 
      } 
     } 

     return retIndex; 
    } 

어떻게 최적화 할 수 있습니까?

감사

@Erik는 문자의 덱에 대해 무엇을 의미합니까?

답변

1

당신은 함께 문자열을 추출하고 있습니다 :

curChar = getText().substr(bytesSkipped,curCharLen); 

그러나 당신은 첫 번째 요소를 사용합니다. 필요한 문자열 인 char을 간단히 추출하여 문자열 생성/복사를 피할 수 있습니다.

일반적으로 알고리즘 최적화에서 std::string 대신에 deque 문자 개체를 만드는 데 필요한 리소스를 지출합니다. 이렇게하면 모든 문자를 직접 색인화 할 수 있으므로 동일한 utf-8 시퀀스를 계속해서 스캔하고 구문 분석 할 필요가 없습니다.

+0

dequeue 아이디어에 대해 자세히 알고 싶습니까? – jmasterx

+0

@Milo : 나머지 코드에 따라 다릅니다. 800 바이트로 평가되는 1000 바이트 문자열이있는 경우 현재 크기를 조정하는 동안 바이트를 여러 번 문자로 파싱하고 있습니다. 사용자가 입력 한 내용 만 구문 분석하고 예를 들어 계속 유지하는 시스템을 만듭니다. * utf8 바이트 * 및 * 문자 *의 병렬 배열을 사용하면 반복되는 구문 분석을 피할 수 있습니다. – Erik