묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버
오브젝트 설계 #1 질문
34분 50초ObjectManager::Remove(Object* object)에서 auto it = std::remove(...);_objects.erase(it, _objects.end());대신에 _objects.erase(findIt); 를 해도 findIt 에는 object에 대한 iterator 값이 저장되어 있으니 erase함수만 사용해도 제거할 object를 vector에서 삭제할 수 있지 않을까 해서 질문드립니다
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
MemoryPool #3와 같은 방식으로 메모리 풀을 실무에서 쓰셨는지 궁금합니다
안녕하세요!마소 성님이 만들어준 SLIST_HEADER, SLIST_ENTRY, alligned_malloc..등을 이용한 메모리 풀 방식을 실무에서 사용한 적 있으실까요? 직접 사용은 안 하셨다면 사용된 프로젝트를 보신 적 있을지 궁금합니다!
-
미해결왕초보를 위한 네트워크 기초
유튜브 실시간 스트리밍에 대해 궁금한 점이 있습니다.
안녕하세요 강사님TCP와 UDP의 차이점에 대해 강의를 듣고 있는데, 유튜브 라이브 스트리밍처럼 실시간 영상을 시청하는 도중에 사용자가 원하는 이전 시점으로 돌아가서 그 부분부터 영상을 시청하거나 다시 라이브 시점으로 돌아와서 생중계로 제공되는 영상을 볼 수 있습니다. TCP와 UDP 통신 방법을 둘다 사용하는건가요?대략적인 동작 원리가 궁금합니다.
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Memory Pool #1에서 Memory 생성자에서 반복문 수정 사항!
다음처럼 하면 의도대로 동작합니다!int32 size = 0; // _poolTable이 4097 크기인 이유는 요구 사이즈가 1부터 시작해서 4096까지 가야 하므로 int32 table_index = 1; for (size = 32; size < 1024; size += 32) { MemoryPool* pool = new MemoryPool(size); _pools.push_back(pool); while (table_index <= size) { _pool_table[table_index] = pool; ++table_index; } } for (; size < 2048; size += 128) { MemoryPool* pool = new MemoryPool(size); _pools.push_back(pool); while (table_index <= size) { _pool_table[table_index] = pool; ++table_index; } } for (; size <= 4098; size += 256) { MemoryPool* pool = new MemoryPool(size); _pools.push_back(pool); while (table_index <= size) { _pool_table[table_index] = pool; ++table_index; } } 반복문의 조건문에서 등호(=)를 빼면 됩니다. 경계의 값은 다음 반복문에서 처리할 수 있으니까요. 마지막 반복문은 다음 반복문에서 처리할 게 없으므로 끝까지 가야 해서 등호를 살려놓습니다.예를 들어 두 번째 반복문에서, table_size는 이전 반복문에서 1024가 되고, 두 번째 반복문의 size는 1024부터 시작하니까 아귀가 딱딱 맞게 돼요. 경계값에 문제 없는 것도 확인했습니다. 약간 갸우뚱하셨던 분들은 참고하면 좋을 것 같습니다!
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
코드 구현한 부분에서 Disconnect()함수가 동시 실행되는 경우가 있나요?
여러 스레드에 의해 동시에 Disconnect()가 여러번 실행되는 걸 막으려고 Interlocked를 사용하여 처리한다고 하셨는데 현재 Session#1 강의 코드까지는 위와 같은 상황이 발생할 부분이 보이지 않는다고 생각하는데 맞을까요?
-
미해결AWS Certified Solutions Architect - Associate 자격증 준비하기
수강 연장 요청 부탁드립니다!
자격증 취득을 목표로 구매했는데 프로젝트를 시작하면서 학습이 미뤄지고 있는 상태입니다.올해까지는 프로젝트라 학습이 어려운데 가능한 길게 연장을 부탁드려도 될까요ㅠ
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
pending과 listen의 backlog와는 어떤 관계가 있는건가요?
Session #1강의 1분대에서 backlog라고 최대 대기 수를 두었기 때문에 동시다발적으로 pending이 false가 뜨는 경우가 현실적으로 없다라고 하셨는데 잘 이해가 안됩니다... ㅠㅠ
-
미해결자동차 SW - UDS 진단통신 정복하기
ClearDiagnosticInformation 관련하여
UDS 서비스 중에 ClearDiagnosticInformation 강의 부분엥서 질문이 있습니다.DTC 정보는 매우 중요한 정보라서 접근제어? 와 같은 부분이 반드시 필요할것 같은데요. (그냥 아무나 이 서비스날려서 DTC 날려버리면 안될것 같은데요) 본 강의에서는 따로 설명해주시진 않았지만,일반적으로 SecurityAccess 라든지SessionControl 통해서 특정 mode 로 진입을 해야 한다든지이러한 서비스가 선행된 후, ClearDiagnosticInformation 서비스가 동작되어야 하는 것이죠? 질문을 조금 확장해보면,UDS 서비스가 매우 다양한데, 각 서비스에 대해서 사전에 어떤 것이 선행되어야 한다는 것을 표준에서 정의하지는 않고,각 제조사별로 필요하면 SecurityAccess 라든지, Session Control 과 같은 sequence 를 추가하여 설계하는 방식으로 진행된다고 보면 될까요? 감사합니다.
-
미해결자동차 SW - UDS 진단통신 정복하기
Security Level 범위관련
안녕하세요. 진단통신에 대해 빠르게 파악이 필요한 상황인데, 본 강의가 너무 큰 도움이 됩니다. 유익한 강의 감사합니다.강의 듣고 있는데, Security Access 부분에서Security Access Level 이 1~63까지 있다고 설명해주셨는데, 1:43초에 보이는 슬라이드에서는 1~83 이라고 되어 있습니다.1~63이 맞는거죠?
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
PopLock 호출과 관련된 질문입니다.
특정 lock L1이 pop되는 상황이 있다고 할 때 L1으로의 순방향 간선 정보가 담긴 다른 Lock들의 history에 대해서는 별도로 L1값을 제거해야 할 필요는 없나요??
-
미해결[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버
동적배열 강의 듣는중 에러
c++ crt detected that the application wrote to memory after end of heap buffer이라는 오류가 뜹니다.이걸 무시하면 그대로 원하는 값은 나오기는 합니다. 근데 이걸 그냥 지나칠 수는 없어서 질문해봅니다.f11눌러가면서 에러나는 부분을 찾았는데reserve에 delete[] _buffer; 를 실행하니 오류가 났습니다. [Vector.h]#pragma once#include<assert.h>class Vector{using T = int;public:explicit Vector(){}~Vector(){if(_buffer)delete[] _buffer;}int size() { return _size; }int capacity() { return _capacity; }void push_back(const T& data){if (is_full()){int newCapacity = static_cast<int>(_capacity * 1.2f);if (_capacity == newCapacity)newCapacity++; reserve(newCapacity);}buffer[size] = data;_size++;}void reserve(int capacity){if (capacity <= _capacity)return;_capacity = capacity;T* newBuffer = new T(_capacity);for (int i = 0; i < _size; i++){newBuffer[i] = _buffer[i];}if (_buffer)delete[] _buffer;_buffer = newBuffer;} T& operator[](int index){assert(index >= 0 && index < _size);return _buffer[index];} int is_full() { return _size == _capacity; }int is_empty() { return _size == 0; }private:T* _buffer = nullptr;int _size = 0;int _capacity = 0;}; 해결방법이 있을까요?
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
난생 처음 보는 동작인데 visual studio2022 버그일려나요. 도저히 이유를 모르겠습니다.
Missile 클래스에서 WraithRef _target = nullptr; 코드를 넣어주면, GameServer.cpp에서 테스트할 때 MissileRef missile(new Missile()); 이 코드를 타고 들어가면 TSharedPtr(T* ptr) { Set(ptr); } 동작할 때 ptr에 nullptr이 들어옵니다.Missile 클래스에서 WraithRef _target = nullptr;을 하지 않고 Missile 클래스에서 WraithRef _target; 으로만 작성하면 정상 동작하고요.저와 같은 증상 겪는 분 없나요? vs 버전은 17.10.4 입니다.
-
해결됨[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버
SceneManager.cpp에서 구문오류가 발생했습니다.
안녕하세요 Rookiss님, 섹션11-3 Scene과SceneManager의 중간~32분 정도에서 작성중인 코드입니다. 이렇게 newScene에 DevScene()과 GameScene()을 넣는 부분에 형식지정자 없음과 구문 오류가 발생합니다... Scene클래스와 DevScene, GameScene 클래스 코드도 동영상을 몇번씩 돌려보면서 확인했는데 어디가 문제인지 잘 모르겠습니다... 혹시 어느 부분이 문제가 될지 확인 한 번 부탁드려도 될까요? 감사합니다!
-
미해결AWS Certified Solutions Architect - Associate 자격증 준비하기
수강 연장 부탁드려도 될까요
안녕하세요 초반에 잘 듣다가바쁘다보니 아직 준비를 못했습니다올해말까지는 준비가 어려울것 같은데만료 되기 전 까먹기 전에 수강 연장 요청 드리려고 합니다혹시 가능할까요?답변 부탁드립니다.감사합니다.
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
데드락 탐지에서 강의 극후반에 LLockStack 관련한 질문입니다!
안녕하세요.나중에 프로젝트 진행하실 땐 lock stack을 TLS로 관리해서 스레드마다 스레드 id가 관리되도록 하신다 말씀하셨습니다. 여기에서 생긴 궁금증입니다. 스레드 id가 부여될 때, 감소하지 않고 증가하는 nameToId().size()로 만들어지는 이상 모든 id가 고유할 거라고 생각합니다.id를 통해서 lockHistory에서 value(set객체)를 꺼냅니다. lockHistory는 TLS에서 관리되지 않는 전역 객체입니다(애초에 그러면 안 되겠죠. 전역적으로 사이클 여부를 탐지해야 하니까요!).스레드 id가 유일한 이상 lockStack을 TLS에서 관리하나 전역으로 관리하는 것이 차이가 없을 것 같은데, 강의 후반에 새로 영상을 추가하시어 '스레드마다 잡고 있는 락이 다르기 때문에 TLS로 관리해야 한다'고 말씀하신 이유가 궁금합니다!id가 전역적으로 1,2,3,4,5,6..이렇게 증가하거나 스레드 별 공간에서 {1,2..} {1,2...} {1,2...} 의 차이 정도로만 생각되어 어떤 본질적인 차이가 있는지 알고 싶습니다!p.s 수업에서 진행한 테스트 코드에서도 문제가 없었던 이유도 궁금증에 한몫을 했습니다.
-
해결됨CloudNet@와 함께하는 AWS 네트워킹 입문
강의가 오늘까지라
강의가 오늘까지라 열심히 남은 강의를 듣고있는데강의 선택을 해도 해당 강의가 진행이 안되는데 무슨 이유일까요?!뭔가 인프런 자체 문제일 거 같은데 ㅠㅠㅠ강의가 몇 개 안 남아서 다 들어야 하는데 어떡하나요ㅠㅠ
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Reader/Writer-Lock 강의 다 듣고 제가 제대로 이해한 게 맞는지 확인받고 싶습니다!
안녕하세요!어제, 강의도 다 안 듣고 질문을 드린 바보 같은 저를 질책하며 강의를 다 듣고 제가 이해한 게 맞는지 확인을 좀 받고 싶습니다!락 획득 정책을 말씀하실 때 살짝 이해가 안 가는 부분이 있었는데 동일 스레드일 때란 걸 알게 되고 나서는 이해에 큰 어려움이 없었습니다. 그래도 확인이 필요하다는 생각이 들었습니다! 각 항목을 번호로 구분해보겠습니다!동일 스레드일 때의 정책이란 게 락을 획득 후 실행될 때는 사실상 싱글 스레드인 것처럼 생각해도 되겠더라구요그렇다고 한다면 GameServer.cpp에서 테스트 코드 작성하실 때 ThreadWrite()일 때 TestPush(), TestPop()의 동작이 한 스레드에서 동작하는 건 당연히 문제가 안 되니까 W->W 혹은 W->R을 허용하는 게 이해가 됐습니다. 한 처리가 완료되고 나서 다른 처리로 넘어가니까요.그렇다면 같은 논리가 적용될 것 같은데 R->W은 왜 안 되느냐에 대해서도 생각해봤는데요. 논리적으로 접근했을 때, 하나의 함수 내에서 읽기 연산 중에 쓰기 연산을 하는 건 단일 책임 원칙에도 위반될 뿐더러 이상한 코드가 나오더라고요. 가령 테스트 코드로 작성하신 TestRead() 안에 TestPush() 혹은 TestPop()을 넣어버리면 안 되니까요. 또한 데드락이 생기지 않기 위해서는 락을 거는 순서가 중요한데, w->r을 허용한 이상 r->w를 허용하면 데드락이 생기기 딱 좋다.ReadLock에 대해서는, WriteLock을 잡고 있지 않은 다른 스레드는 ReadLock을 획득할 수 있다!ReadLock의 주석에 "아무도 소유하고 있지 않을 때"라고 되어 있어서, 조금 헷갈렸는데요. 코드를 보면 마스킹해서 read_count만 확인하는 걸 보고 역시 ReadLock은 WriteLock을 잡고 있지 않은 스레드도 잡을 수 있구나, 카운트 올리는 것만 경합하는 거구나, 로 이해했습니다.2년 전에 처음 강의를 들을 때 제대로 이해 안 하고 넘어갔다가 나중에 큰 화를 당했어서, 이번에는 확실히 이해하려고 하다 보니 코드에서 참 얻을 게 많다 느낍니다. 틀린 게 있으면 지적 부탁드립니다. 감사합니다!
-
미해결이득우의 언리얼 프로그래밍 Part3 - 네트웍 멀티플레이 프레임웍의 이해
타임라인함수를 이용한 캐릭터 강제이동
텔레포트를 구현할 때 네트워크 동기화 문제 때문에 CharacterMovementComponent를 확장하는 방식으로 구현해야 한다고 했는데 그러면 타임라인 함수를 사용하여 캐릭터를 특정 위치로 서서히 이동 시키는 기능도 CharacterMovementComponent를 확장하는 방식으로 만들어야 할까요?
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Reader/Writer 강의에서 마스킹 관련한 질문입니다!
안녕하세요!아직 끝까진 들은 건 아니지만 중간에 큰 의문점이 생겨서 질문드립니다.32형 변수에 상위 비트, 하위 비트를 사용하려면 | 연산을 이용해야 하지 않나요~?가령 상위 비트에 새로운 값을 쓰는 걸 의사 코드로 표현하면,int flag = _lockFlag.load();desired = (flag & 0x0000FFFF) | ((LThreadId << 16) & WRITE_THREAD_MASK);이렇게 하지 않고 다음 코드를 돌리면while (true) { for (int spin_count = 0; spin_count < MAX_SPIN_COUNT; ++spin_count) { uint32 expected = EMPTY_FLAG; if (_lock_flag.compare_exchange_strong(OUT expected, desired)) { ++_write_count; return; } } }write flag를 쓸 때마다 read flag가 날아가는 것 같아서요!
-
미해결BHPT - 호스트 기반 모의해킹 기초
닉네임?
모든 질문은 레드라쿤 디스코드 서버의 BHPT 질문게시판에 해주세요