인프런 커뮤니티 질문&답변

dpcks5959님의 프로필 이미지
dpcks5959

작성한 질문수

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

RecvBuffer

Clean함수의 else부분 질문 있습니다

작성

·

315

·

수정됨

0

_readPos = 0;

_writePos = DataSize;

 

이렇게 하셨는데 순서가 반대 아닌가요??

readPos가 2이고 writePos가 5였을 때 DataSize는 3

그런데 readPos를 먼저 0으로 하면 DataSize는 5로 변해

writePos는 3이 아닌 5로 초기화가 될것 같습니다

else부분은 남은 데이터가 있는 경우 readPos만큼 Array의 처음 주소를 앞 당기는거니까 초기화된 writePos의 기대값으론 기존 writePos - readPos 아닌가요??

readPos = 0;

이 부분이 먼저 나온 이유가 궁급합니다!

답변 3

1

1달정도 전의 질문이지만 답변 드립니다.

public void Clean()
{
    int dataSize = DataSize;
    if (DataSize == 0)
    {
        _readPos = 0;
        _writePos = 0;
    }
    else
    {
        rray.Copy(_buffer.Array, _buffer.Offset + _readPos, _buffer.Array, _buffer.Offset, dataSize);
        _readPos = 0;
        _writePos = dataSize;
    }
}

해당 구문에서 dataSize의 경우 Clean() 함수 내에서 먼저 선언해둔 지역변수 int dataSize = DataSize;의 dataSize 입니다.

따라서 이후 _readPos = 0;을 하면 DataSize의 경우 5가 되나, dataSize의 경우 이전에 설정해둔 3의 값 그대로 사용하고 있습니다. 따라서 둘의 순서는 상관 없습니다.

0

dpcks5959님의 프로필 이미지
dpcks5959
질문자

이해가 안된것 같아요

 

readPos를 먼저 앞으로 당겼기 때문에 DataSize의 값에 변동이 있어 writePos가 나중에 초기화 되면 예상되는 값이 안나올것 같습니다

 

writePos가 readPos 만큼 앞으로 당겨지려면

writePos가 먼저 초기화 되야하지 않나요??

0

안녕하세요 dpcks5959 님, 인프런 AI 인턴이에요.

제가 보기에는 코드에서 _readPos와 _writePos를 초기화하는 부분에서 순서가 조금 헷갈릴 수 있는 부분이 있습니다.

_clean 함수의 else 부분에서 _readPos를 0으로 초기화하는 것은 남은 데이터가 있는 경우, _readPos만큼 Array의 처음 주소를 앞으로 당기는 작업을 할 때 필요한 과정입니다. 따라서 _readPos는 0으로 초기화해야 합니다.

_writePos의 초기값은 DataSize로 설정된 것을 보아, 이미 데이터가 있을 경우에는 DataSize 만큼은 쓰여 있을 것으로 가정하는 것 같습니다. 그리고 남은 데이터를 앞으로 당길 때는 _readPos만큼을 앞으로 당기기 때문에 _writePos는 _readPos만큼 작아질 것입니다.

따라서, 코드에서의 초기화 순서는 맞는 순서입니다. _readPos를 먼저 0으로 초기화하는 이유는 앞으로 남은 데이터를 당기기 위해서입니다.

더 자세한 설명을 원하시면 코드의 전체 내용을 공유해주시면 감사하겠습니다. 이해에 도움이 되었는지 확인해보세요. 감사합니다!

dpcks5959님의 프로필 이미지
dpcks5959

작성한 질문수

질문하기