태그 보관물: c#

c#

Farseer 2.x는 왜 임시가 아닌 회원으로 임시 저장합니까? (.그물) 있으며, 많은 임시 값 유형 을 클래스의

업데이트 :이 질문은 Farseer 2.x에 관한 것입니다. 최신 3.x는 이것을하지 않는 것 같습니다.

나는 현재 Farseer Physics Engine을 꽤 광범위하게 사용하고 있으며, 많은 임시 값 유형 을 클래스의 멤버 로 저장 하고 스택에 기대하지 않는 것으로 보입니다 .

다음은 Body클래스 의 예입니다 .

private Vector2 _worldPositionTemp = Vector2.Zero;

private Matrix _bodyMatrixTemp = Matrix.Identity;
private Matrix _rotationMatrixTemp = Matrix.Identity;
private Matrix _translationMatrixTemp = Matrix.Identity;

public void GetBodyMatrix(out Matrix bodyMatrix)
{
    Matrix.CreateTranslation(position.X, position.Y, 0, out _translationMatrixTemp);
    Matrix.CreateRotationZ(rotation, out _rotationMatrixTemp);
    Matrix.Multiply(ref _rotationMatrixTemp, ref _translationMatrixTemp, out bodyMatrix);
}

public Vector2 GetWorldPosition(Vector2 localPosition)
{
    GetBodyMatrix(out _bodyMatrixTemp);
    Vector2.Transform(ref localPosition, ref _bodyMatrixTemp, out _worldPositionTemp);
    return _worldPositionTemp;
}

수동 성능 최적화처럼 보입니다. 그러나 이것이 어떻게 성능을 향상시킬 수 있는지 보지 못합니까? (물건을 크게 만들어서 다칠 것이라고 생각되면).



답변

.NET에서 값 유형이 스택에 저장되어 할당 비용을 최소화하지만 초기화 비용을 제거하지는 않습니다.

이 경우 하나 또는 두 개의 임시 행렬을 사용하는 함수 집합이 있으므로 호출 당 16-32 부동 소수점이 초기화됩니다. 이것이 중요하지 않은 것처럼 보일 수 있지만, 방법이 자주 사용되는 경우 (예 : 프레임 당 수천 번), 전체 오버 헤드는 의미있는 영향을 줄 수 있습니다. 그러한 기술이 모든 그러한 방법에 걸쳐 체계적으로 사용된다면, 제거되는 오버 헤드가 상당 할 수있다.

이러한 기술을 사용하면 객체 별 수준에서 스레드 안전성을 제공하는 기능이 제거되지만 일반적으로 이러한 세부적인 수준으로 보장하는 것은 현명하지 않습니다.


답변

좋은 질문. 나는 꽤 예리한 C # / .NET 사람이며 약간의 성능 너트이며 다소 이상한 디자인 결정처럼 보입니다. 나에게 가장 먼저 나오는 것은이 코드가 스레드 안전하지 않다는 것입니다. 그것이 물리 시스템에서 문제인지는 모르겠지만 방법 범위 밖에서 임시 데이터를 저장하는 것은 종종 재난의 요리법입니다.

솔직히, 타사 프레임 워크에서 이러한 종류의 코드를 정기적으로 만나면 다른 프레임 워크를 찾으려고 노력할 것입니다.


답변

360의 GC는 기본적으로 고가의 GEN 2 콜렉션 만 수행하므로 임시 오브젝트와 같이 모든 프레임을 작성하고 제거하는 임시 변수는 전체 콜렉션이 실행되도록하여 성능이 매우 빠르게 저하됩니다.

나는 그들이 그 물건을 재사용하고 그것을 수집하지 않기 위해이 방법을했다고 의심합니다.


답변