2009-07-20 2 views
2

나는 KVO/KVC의 거대한 팬이되었습니다. 내 MVC 아키텍처를 깨끗하게 유지하는 방법을 좋아합니다. 그러나 3D 렌더링 응용 프로그램의 내부 렌더링 루프에서 KVO를 사용할 때 거대한 성능에 큰 타격을 입지는 않습니다. 관찰중인 각 개체 (잠재적으로 수백 가지)에 대해 메시지가 초당 60 회 발생하는 곳을 디자인하고 있습니다.코코아 터치 프로그래밍. 내부 루프의 KVO/KVC는 매우 느립니다. 어떻게 속도를 올릴 수 있습니까?

KVO의 속도를 높이기위한 요령은 무엇입니까? 특히, 나는 스칼라 값 (object가 아닌)을 관찰하고 있습니다. 아마도 wrapping/unwrapping이 나를 죽일 것입니다. 나는 또한 설정하고 관찰을 찢어 버리고있다.

[foo addObserver:bar forKeyPath:@"fooKey" options:0 context:NULL]; 
[foo removeObserver:bar forKeyPath:@"fooKey"]; 

내부 루프 안에. 아마 나는 그것에 대한 타격을 취하고있다.

저는 정말로, KVO가 제공하는 커다란 유연성을 유지하고 싶습니다. 손을 빌려줄 수있는 속도가 괴롭습니까?

건배, 더그

+0

KVO/KVC로 인한 성능 저하가 어떻게 발생했는지 어떻게 알 수 있습니까? 대답은 눈부신 예,하지만 가끔은 사람들이 성능 병목 현상에 대한 가정을 가져 가면 미안 해요 ... – zoul

+0

나는 종교적으로 윤곽을 나타냅니다. KVO로 크롤링에 시달렸을 때 내 마음이 가라 앉았다. 그렇지. – dugla

답변

4

목표 - C의 메시지 발송 등의 기능을 조정하고있다 꽤 빨리 그들이 제공하지만, 그들은 여전히 ​​전산 작업을 위해 조정 C의 잠재력을 접근하지 않는 것에 대해 :

NSNumber *a = [NSNumber numberWithIntegerValue:(b.integerValue + c.integerValue)]; 

는보다 훨씬 느립니다 :

NSInteger a = b + c; 

아무도 실제로 것을 잘 (그 이유 오브젝티브 C에서 객체에 수학을하지 않습니다 구문은 끔찍합니다).

Objective-C의 강력한 힘은 값 비싼 비트를 버리고 필요할 때 순수한 C를 사용할 수있는 멋진 표현형 메시지 기반 개체 시스템을 사용한다는 것입니다. KVO는 값 비싼 비트 중 하나입니다. 나는 KVO를 좋아한다, 나는 그것을 항상 사용한다. 특히 계산 된 객체가 많은 경우에는 계산이 비쌉니다.

내부 루프는 반복적으로 실행되는 코드의 작은 비트입니다. 반복되는 작업이 반복됩니다. 필요한 경우 OOP 기능을 제거해야하는 곳, 메모리를 할당하지 않아야하는 곳, 메서드 호출을 정적 인라인 함수로 대체해야하는 곳입니다. 렌더링 루프에서 허용되는 성능을 어떻게 든 관리 할 수 ​​있다고하더라도 값 비싼 알림 및 디스패치 로직을 모두 가지고있는 경우보다 성능이 훨씬 떨어집니다. 당신의 객체에 수동 KVO 자동에서

  1. 스위치 :

    당신이 정말로 그것을 여기 KVO와 함께 계속하려고 시도하는 경우

    당신이 만들려고 수있는 몇 가지 일들이 빨리 갈 수 있습니다. 이렇게하면 가짜 알림을 줄일 수 있습니다.
  2. 전체 업데이트 : 일정 시간 동안 중간 값이 중요하지 않고 다음 애니메이션 프레임처럼 일정 시간 동안 연기 할 수 있으면 변경 사항을 게시하고 변경 사항이 게시되어야하고 관련 타이머가 끝날 때까지 기다리십시오. 짧은 기간 동안 만나는 중간 업데이트를 피할 수 있습니다. 또한 여러 객체간에 관련 변경 사항을 집계하기 위해 일종의 프록시를 사용할 수도 있습니다.
  3. 관찰 가능한 속성 병합 : 변경 될 수있는 한 유형의 개체에 많은 수의 속성이있는 경우 단일 "hasChanges"속성을 관찰하고 관찰자가 속성을 쿼리하는 것이 더 나을 수 있습니다.
+0

Louis, KVO를 포기하지 않으려면 멋진 깨끗한 MVC 아키텍처를 유지해야합니다. 내 모델에서 일어나는 행동을 관찰하고 있습니다. 다음은 전형적인 예입니다. 스크린 주위를 감싸고있는 여러 스프라이트로 사운드 효과를 매우 세분화 된 수준으로 연관시키고 싶습니다. 저는 KVO 메시징을 사용하여 완전히 분리 된 사운드 라이브러리에 사운드를로드하고 싶습니다. 스피드 패널티는 나에게 덜 이상적인 스프라이트 엔진으로 사운드를 끌어 들이게 할 것이다. – dugla

+0

당신이 정말로 할 수있는 일이 있다면, 당신이 할 수있는 일이 있습니다. 나는 그것들을 게시물에 추가했지만 모델과보기 사이의 휴식 시간에는 약간의 영향을 줄 수 있습니다. –

+0

루이를 도와 줘서 고마워. 건배. – dugla

관련 문제