2014-03-05 7 views
1

예제 게임 엔진 서버에서 게임 세계는 World 개체로 나타낼 수 있습니다. 게임은 여러 게임 세계를 가질 수 있으며 세계에있는 플레이어는 그 세계에서 유닛의 위치 데이터 만 수신하면됩니다. C에서 자동으로 업데이트되는 일대 다 양방향 관계를 갖는 방법

class World 
{ 
    public List<Unit> Units { get; set; } 
} 

그러나 코드 조각은 유닛이 쉽게에 무엇 세계 찾아 볼 수 있어야합니다, 그래서 단위 개체 자체는 세계 기준을 추적합니다.

class Unit 
{ 
    public World World { get; set; } 
} 

이 조회에 작동하지만, 빨리 프로그래머가 진행 객체 사이의 관계를 인식하지 않을 때 데이터를 변경, 그래서 WorldUnits을 변경하면 읽기 전용하고 Unit에 다음 코드를 가지고 문제가된다 .

public virtual World World 
{ 
    get { return _world; } 
    set 
    { 
     // Unit must always be in a world 
     Contract.Requires<ArgumentNullException>(value != null); 

     // If already this, don't do anything 
     if (value == _world) return; 

     var oldWorld = _world; 
     _world = value; 

     if(oldWorld != null) oldWorld.UpdateUnitEntry(this); 
     _world.UpdateUnitEntry(this); 
    } 
} 

이 방법이 효과적이지만 더 좋은 방법이 있다고 생각합니다. 특히 같은 방식으로 연결해야 할 물건을 더 추가 할 때 (WorldStructurePlayer) 많은 반복 기능이 제공됩니다. 수동으로이 일대 다 관계를 성취하는 더 좋은 방법이 있습니까? 양면 업데이트?

+0

[codereview.se] 어쩌면? – user1306322

답변

0

C++와 같은 언어에서 이러한 정교한 참조 관리 및 GC가 없기 때문에 이와 같은 순환 참조가 문제가됩니다 (예 : SharedPtr). 예를 들어. 게임 상태의 직렬화.

이렇게하면 일반적인 문제에 접근하는 더 좋은 방법이 있다고 생각합니다. 예. 유닛이 실제로 자신의 세계를 알아야합니까? 어쩌면 당신은 당신이 그것을 필요로한다고 생각하게 만든 코드를 보았을 것입니다. 아마도 더 이상 필요하지 않게 변경할 수 있습니다.

그래서 엔티티 관리 시스템을 구현하고 추상적 인 ID 또는 핸들로 게임 엔티티 만 참조하면됩니다. 객체가 뒤에서 행동하기 전에 ID/핸들을 해석하지만 엔티티에 다른 엔티티에 대한 참조를 저장하지 마십시오. 게임의 상태를 직렬화하고 싶다면 크게 도움이 될 것입니다.

그렇지 않은 경우 :

무엇을하고있는 것이 엄하게 잘못한 것이 아닙니다. 그것이 작동하고 너무 많은 고통이 아니라면, 그냥 그렇게하십시오.