강의

멘토링

로드맵

Inflearn brand logo image

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

차동훈님의 프로필 이미지
차동훈

작성한 질문수

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

Serialization #2

DummyClient.PlayerInfoReq.Write()의 동작 원리 중 질문이 있습니다.

작성

·

408

0

SendBufferHelper를 통해 Open만 해줬을 뿐인데

어떻게 s가 ThreadLocalStorage에 있는 SendBuffer의 _buffer 값에 접근을 할 수 있는지 궁금합니다.

다시 말해 s는 분명 구조체 타입이고,

TryWriteBytes로 s에 패킷 데이터를 밀어 넣어준 다음에

SendBufferHelper.Close를 했는데,

어떻게 s의 정보가 ThreadLocalStorage에 있는 SendBuffer의 _buffer에도 남아 있는지 궁금합니다.

디버깅을 찍어보니깐 SendBuffer.Close()가 호출이 될 때,

새롭게 생성한 ArraySegment의 인자로 들어가는 _buffer 값이 s의 값이더라구요.

패킷의 데이터를 실제로 넣은 곳은 s인데 어떻게 ThreadLocalStorage에 있는 SendBuffer의 _buffer 값에도 영향을 주는 것인지..

ArraySegment가 class 타입이면 SendBufferHelper.Open으로 생성한 ArraySegment 를 참조해서 가능하겠거니

이해가 되겠는데 struct 타입이라 도저히 이해가 되지 않아요..ㅠ

어떤 마법과도 같은 일이 있었는지 알려주시면 감사하겠습니다 :D

답변 1

1

Rookiss님의 프로필 이미지
Rookiss
지식공유자

https://www.inflearn.com/questions/69958

비슷한 질문이 있었는데 위 그림을 보시면 이해가 쉬울 것 같습니다.

차동훈님의 프로필 이미지
차동훈
질문자

ArraySegment는 구조체이지만 ArraySegment 안에 있는 Array는 배열 타입이기 때문에 원본 Array, 즉 SendBuffer._buffer의 값을 참조하고 있다고 이해하면 될까요?

Rookiss님의 프로필 이미지
Rookiss
지식공유자

네 그렇습니다. 영역을 '찝어주는' 개념이죠

차동훈님의 프로필 이미지
차동훈
질문자

아..! 감사합니다!! 구조체라는 함정에 빠져서 정작 Array가 배열 타입이라는 것을 생각 못했었네요!! 거듭 감사합니다!😁

차동훈님의 프로필 이미지
차동훈

작성한 질문수

질문하기