2014-10-06 1 views
0

작은 문제를 해결하고 사람들의 의견에 감사드립니다.
저는 C++ 파티클 시뮬레이션 라이브러리를위한 Unity 용 C# 플러그인을 만들고 있습니다. 최종 사용자가 데이터에 쉽게 액세스 할 수 있도록 시스템의 모든 입자를 나타내는 방법을 원합니다. 현재는 각 입자는 .. 그래서 같은 구조체에 의해C# 유연한 데이터 구조를 찾고 있습니다.

public struct Particle 
{ 
    public Vector3 Position; 
    public Color _Color; 
    public float Age; 
    public float Weight; 
    public Vector3 Velocity; 
    public int UserData 
} 

내가 함께 가지고있는 문제를 표현이 있지만 대부분의 경우는 시뮬레이션에서 구조체에서 사용할 수있는 정보를 모두 검색 귀찮게하지 않는다는 것입니다 . 예를 들어 성능 향상을 위해 각 프레임의 위치와 색상 정보 만 검색 할 수 있습니다. 이 경우 내 구조체는 초기화되지 않은 필드가 많이있을 것이고, 필요 이상으로 많은 메모리를 사용하게 될 것입니다. (1000 비트는 btw가됩니다) 필드의 조합이 다른 상황에서 사용될 수 있으므로 클래스 hieratchy를 사용할 수 없습니다. 내가 생각할 않았다
한 가지 방법은이 ..

public struct Particle 
{ 
    public Dictionary<string,object> Data; 
} 

들을 이런 식으로 뭔가를 보이는 만들기 ..

Particle parttest = new Particle{Data = new Dictionary<string,object>()}; 
parttest.Data.Add("Position",(object)Vector3.one); 
parttest.Data.Add("Weight",(object)1.8745f); 

그들을 읽을 때 해당 클래스에 다시 캐스팅. 그래서 입자, 색상, 무게 및 위치 데이터가 포함 된 입자 만 가질 수 있습니다. 당신은 어떻게 생각하니?

+0

적어도 유형 클래스로 만듭니다. –

+0

클래스, 하위 클래스, 인터페이스 등을 사용하여 "구조"를 더 작은 세그먼트로 나눕니다. –

+1

실제로 메모리가 부족합니까 아니면 조기에 최적화하고 있습니까? 권투는 두 번째 접근 방식에 문제가 될 것이라고 말하고 싶습니다. – juharr

답변

1

나는 두 가지 방법을 구상 할 수

a) 귀하가 "필드의 모든 조합을 사용할 수 있습니다로"당신이 클래스를 사용할 수 없다고 말한다. 그러나 구성 (상속과 반대)이 작업을 수행합니다. 즉, 입자에 DisplayBehavior, MovementBehavior 등이있을 수 있습니다. 이러한 동작에는 실제 속성이 들어 있습니다. 이게 당신 문제에 맞을까요?

b) 하나 또는 두 개의 특정 속성 값 검색이 빠르지 만 파티클의 모든 속성 열거 속도가 느릴 경우 (수 마이크로 초), 적절한 해결책은 속성 저장소를 사용하는 것입니다. 각 속성에 대해 모든 입자의 값을 보유하는 하나의 구조가 있습니다. 기본적으로 평면 배열이나 사전에 (입자 ID, 속성 값) 정보를 저장합니다. 이것은 예를 들어 WPF에서 사용되는 솔루션이며 이는 캐시 효율성과 메모리에 정통합니다.

한편이 유형을 제거하고 파티클 식별자 (코드를 더 명확하게 만들기위한 ParticleID 열거 형) 만 저장하는 등 Particle 구조에는 아무 것도 저장하지 않아도됩니다. 또는이 유형을 유지하고 전역 속성 저장소를 조작 할 속성을 추가 할 수 있습니다.

PS : 구조체에 대한 참고 사항 : 올바르게 이해하고 있습니까? 대부분의 경우 큰 구조체를 사용하는 것은 많은 메모리 복사본을 포함하기 때문에 좋지 않습니다. 이 세금이 지불되지 않는 유일한 경우는 해당 주소로 구조체에 액세스 할 수있는 경우입니다 (예 : 배열의 인덱스를 통해 조작 할 때) (particles [index] .Position = ...).

+0

B 소리가 좋다.나는 그것이 올바르게 이해하고 있다면 A가 조금 너무 정교하다고 생각한다. (나는 행동을 읽을 것이다.) PS btw에 감사드립니다. 나는 그들이 그것들을 처리하는 클래스의 일부로서 큰 배열에 저장되기 때문에 나는 그 점에서 괜찮다고 생각한다. –

관련 문제