게시글
질문&답변
(오류정정요청) Awake 설명
설명하시면서 약간 말씀이 꼬인 것 같은데 오브젝트 비활성화가 아니라 스크립트 비활성화를 했을 때 Start()는 호출되지 않지만 Awake()는 호출됩니다.
- 6
- 2
- 635
질문&답변
switch문과 딕셔너리 효율 질문입니다.
링크에 나와있는 설명 중에 switch-case가 if-else if로 해석된다고 되어 있는데 실제로는 완전히 다릅니다. switch-case는 점프 테이블을 만들거나 다른 최적화 방법 등을 통해 해당 case문으로 한 번에 갑니다. 그리고 그 최적화가 컴파일 단계에서 수행되기 때문에 빠릅니다. if문은 true를 만날 때까지 모든 조건을 다 검사해야 돼요. 컴파일 최적화도 어렵고요.case가 그렇게 많지 않으면 Dictionary를 안 써도 되겠지만 계속 기능이 확장될 여지가 있을 때는 유지보수성과 가독성을 생각해 Dictionary가 더 나은 선택이라고 생각합니다.
- 1
- 2
- 504
질문&답변
SendBuffer 마지막부분 이해가 안됩니다.
C++은 IOCP를 통해 직접 다 구현해야 하니까 멀티스레드인 부분이 확실하게 인지가 되는데 C#은 내부적으로 이뤄지고 개발자는 추상적으로만 접근하는 부분 때문에 오히려 불명확한 것들이 생기는 것 같아요. 제가 전부 답변드리긴 어렵지만 질문에만 제가 아는 선에서 간단하게 답변을 해볼게요.ThreadLocal로 해서 SendBuffer를 사용하기 때문에 각 스레드가 고유로 가지고 있는 건 맞습니다. 유념해야 할 부분은 하나의 Session 객체에 접근하는 스레드가 여러 스레드라는 사실입니다. 실제로 송신 동작을 하는 건 하나의 스레드이지만, 그동안 송신 큐에 다른 스레드들이 데이터를 집어넣을 수 있죠. 사실 이 부분은 socket.SendAsync(sendEvent); 동작이 순서대로 호출될 수 있게 제대로 설계가 되어 있을 때 의미가 있을 것 같네요.Session에서 sendQueue에 데이터를 집어넣을 때 여러 스레드가 자신만의 TLS에 저장된 데이터를 넣으니까, sendQueue에 넣고 나면 여러 스레드에서 접근하는 데이터가 됩니다. 그러나 데이터의 조작 부분은 최초에 Send()를 호출하기 전에 일어나고 송신 과정에서는 읽기 동작만 하기 때문에 별도로 락을 거는 부분이 필요없다고 강사님이 말씀하신 것 같습니다.
- 0
- 2
- 492
질문&답변
SendBuffer 새로 sendbuffer 할당해주는 문제
저도 이 부분 의아했는데 C++에서는 상상도 할 수 없는 일(?)이라서 더 그랬던 것 같아요. 강사님 말씀처럼 어딘가에서 참조되고 있다면(SendQueue에 있다거나 비동기 송신 동작 중) GC가 해당 메모리를 해제하지 않겠군요. 새삼 편하네요..!
- 0
- 2
- 440
질문&답변
질문 있습니다
워딩만 놓고 보면 조금 헷갈릴 수 있는데 제 생각은 이렇습니다. 서버의 리스너 소켓은 보통 하나를 두고 클라이언트의 접속을 받습니다. 그러니까 멤버 변수로 들고 있어도 되죠. 오히려 멤버 변수로 가지고 있는 게 편하죠.Connector는 조금 다릅니다. 이를 이용해서 서버에 연결을 할 건데, 테스트 환경에서 클라이언트는 아주 많을 수 있습니다. 그 클라이언트 하나하나의 소켓을 멤버 변수로 가지고 있을 필요가 없는 결정적인 이유는 세션 팩토리를 통해 생성한 세션 객체에서 유지하는 걸로 충분하기 때문입니다.
- 0
- 2
- 265
질문&답변
실행 에러..
SocketAsyncEventArgs 객체에 RemoteEndPoint를 초기화 안 해준 것 같네요. 접속하려는 목적지 주소가 없으면 ConnectAsync가 정상 동작할 수가 없겠죠!
- 0
- 2
- 262
질문&답변
캐스팅 질문 드려요.
타입스크립트에도 같은 문법이 있는데 C#, 타입스크립트 모두 MS에서 추진한 거다 보니까 이런 공통점이 있네요.
- 3
- 5
- 278
질문&답변
펙토리 함수가 꼭 필요한건가요? 그냥 세션으로 받으면 안되요?
socket을 멤버 변수로 두지 않는 이유와 같은 이유도 있을 것 같습니다.Connector를 세션 수 만큼 만드는 게 아니기 때문에 socket을 멤버 변수로 따로 두지 않고 이벤트 객체의 UserToken에 담아서 전달했던 것처럼, SessionFactory라는 Callable 객체를 넘겨서 필요할 때 생성하는 방식인 것이죠.일종의 매니저 성격이므로 하나의 세션을 멤버 변수로 가지고 있을 이유가 없어 보입니다!
- 0
- 2
- 500
질문&답변
Send처럼 동시다발적으로 Recv가 발생할 경우 생기는 문제점에 대해 궁금합니다
수신 데이터는 스트림 형식으로 들어오기 때문에 송신자가 송신 함수를 몇 번 호출했는지 알 수 없어요. 송신 함수를 10번 호출해서 보냈는데 수신할 때는 한 번에 받을 수도 있습니다.TCP에서 데이터를 스트림 형식으로 들어오니까요. 그래서 나중에는 이 데이터 경계를 구분하기 위해 헤더를 사용하게 될 거에요.
- 0
- 2
- 90
질문&답변
inputManager 질문 있습니다
1번 질문은 저도 궁금한데 답변이 없네요.
- 0
- 2
- 258