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

dpcks5959님의 프로필 이미지

작성한 질문수

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

RecvBuffer

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

23.11.01 06:21 작성

·

285

·

수정됨

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

엘비엠님의 프로필 이미지

2024. 01. 02. 15:16

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
질문자

2023. 11. 04. 04:09

이해가 안된것 같아요

 

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

 

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

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

0

인프런 AI 인턴님의 프로필 이미지

2023. 11. 03. 06:26

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

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

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

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

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

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