전체 글
-
Json카테고리 없음 2025. 5. 26. 11:34
빠르고 가벼운 JSON 파서: RapidJSONJSON Schema 기반 C++ 코드 자동 생성: Python + Jinja2으로 전체 구조와 예제를 제공하겠습니다.✅ 목표RapidJSON만 사용하여 가볍고 빠른 JSON 파싱JSON Schema 기반 Python 코드 생성기로 C++ 구조체 자동 생성from_json() / to_json() 대신 RapidJSON의 DOM API 사용🧩 1. JSON Schema 예시📁 schema/character.schema.json{ "title": "Character", "type": "object", "properties": { "id": { "type": "integer" }, "name": { "type": "string" }, "..
-
Boost.Asio 기반의 Zero-Copy 패킷 수신기카테고리 없음 2025. 5. 22. 08:33
Boost.Asio 기반의 Zero-Copy 패킷 수신기에 다음 기능들을 통합하여 완성된 구조를 제시하겠습니다:FlatBuffers의 Union 타입을 활용한 메시지 구조Opcode 기반의 메시지 디스패처인증 및 보안 구조 통합(위키백과)📦 1. FlatBuffers 스키마 정의 (packet.fbs)namespace game;table ChatMessage { userId: int; message: string;}table LoginRequest { username: string; password: string;}table AuthToken { token: string;}union MessageUnion { ChatMessage, LoginRequest, AuthToken }table Env..
-
🔧 Boost.Asio 패킷 수신 최적화: 시스템 콜 최소화 구현카테고리 없음 2025. 5. 22. 07:41
📌 배경 설명MMORPG 또는 실시간 게임 서버에서는 수많은 네트워크 패킷을 수신하게 됩니다. 일반적인 방식으로는 아래처럼 헤더 → 바디 순서로 읽으며, 각각의 async_read()는 시스템 콜을 발생시킵니다.async_read(socket, buffer(header_buf), ...); // 시스템 콜 1async_read(socket, buffer(body_buf), ...); // 시스템 콜 2이 방식은 낮은 처리 효율, 높은 CPU 오버헤드를 유발할 수 있습니다.✅ 최적화 전략시스템 콜 1회: socket.async_read_some()으로 한꺼번에 수신애플리케이션 레벨에서 파싱: 받은 데이터를 버퍼에 저장하고, 내부에서 헤더/바디 구분버퍼 구조: boost::asio::streambu..
-
폭발 처리카테고리 없음 2025. 5. 13. 10:14
Unity의 물리 엔진을 사용하지 않고도 폭발에 의한 유닛 튕겨나감을 공식으로 직접 구현할 수 있습니다.✅ 핵심 아이디어폭발 중심점에서 유닛까지의 방향 벡터 계산거리 기반으로 힘의 세기를 감소해당 방향으로 속도(또는 위치)를 직접 갱신🔧 예제 코드 (Rigidbody 없이 구현)using UnityEngine;public class ExplosionNoPhysics : MonoBehaviour{ public float radius = 5f; public float explosionForce = 10f; public AnimationCurve forceOverDistance; // 거리별 힘 조절용 커브 (선택) public void Explode() { // 범위..
-
jump skill카테고리 없음 2025. 5. 12. 17:06
디아블로2의 바바리안 점프 스킬처럼 특정 위치로 빠르게 점프하는 캐릭터 이동을 유니티에서 구현할 때, tween을 사용할 수는 있지만 몇 가지 사항을 고려해서 선택하는 것이 좋습니다.✅ Tween 사용 (예: DOTween)장점:간편하게 위치 보간 가능 (DOMove, DOLocalMove, etc.).커브 기반의 이펙트나 easing 설정이 쉬움.코드가 짧고 직관적임.단점:물리 연동이 약함 (리짓바디와 충돌처리가 자연스럽지 않음).경로가 단순 보간이라서 호를 그리는 점프 구현은 직접 커브를 만들어야 함.중간에 다른 객체와 충돌 시 즉시 대응하기 어려움.사용 예:transform.DOMove(targetPosition, 1.0f).SetEase(Ease.OutQuad);호를 그리려면 Y축을 위로 상승 후..
-
mmorpg 레벨 벨런스카테고리 없음 2025. 4. 25. 17:51
TL;DR: MMORPG 캐릭터 레벨 밸런스를 하기 위해선 “시간당 경험치 곡선”, “보상 차별화”, “레이어드 성장 구간 설계” 세 축을 기준으로 단계적으로 분석해야 함. 먼저 당신 게임의 “총 플레이 시간 목표”와 “한 세션당 평균 플레이 시간” 정보를 주세요.✅ STEP 1. 레벨 밸런싱의 절대 기준: 시간MMORPG에서 캐릭터 레벨 설계는 곧 "시간 경제" 설계야. 모든 레벨은 결국 플레이 시간이라는 통화로 구매되는 콘텐츠야. 따라서 첫 단계는 아래 두 정보를 파악하는 거야:목표 최고 레벨 (예: 60, 80, 100)이 최고레벨까지 도달하는 예상 총 플레이 시간1일 평균 유저 세션 시간 (예: 20분, 1시간)이걸 알아야만 시간당 경험치 곡선을 만들 수 있어. 예를 들어, 목표가 "만렙까지 10..
-
GridManager카테고리 없음 2025. 4. 22. 13:47
맵의 크기와 유닛 밀도에 따라 동적으로 자료구조를 선택하는 방식은 성능과 메모리 사용을 모두 최적화할 수 있는 실용적인 설계입니다.✅ 크기에 따라 자료구조 선택하는 전략📏 기본 원칙맵 크기 & 밀도 추천 자료 구조작고 밀도 높음 (예: 전투 지역, 던전)std::vector> (2D 배열)큼 + 희소함 (예: 필드 맵, 오픈 월드)std::unordered_map, Cell> (희소 그리드)중간 크기 & 일정 밀도std::vector + 인덱스 계산 (y * width + x)🤖 자동 선택 예제 (C++ 스타일 설계)class GridManager {public: GridManager(int width, int height, bool sparse) : m_width(width), m..
-
GridManager카테고리 없음 2025. 4. 18. 16:26
// ----------------------------------------// Entity 클래스 (기본)// ----------------------------------------class Entity {public: int id; float x, y; enum class Type { Player, Monster } type; int gridX = -1; int gridY = -1; Entity(int id, float x, float y, Type type) : id(id), x(x), y(y), type(type) {}};// ----------------------------------------// GridManager 확장 (시야 체크, 타입별..