2014-04-28 10 views
2

SKShapeNode를 사용하여 산과 같은 오브젝트를 만듭니다. 나는SKShapeNode가 너무 많은 메모리를 소비하고 애니메이션 속도가 느려짐 -Spritekit iOS

SKShapeNode *shapenode = [[SKShapeNode alloc] init]; 

CGMutablePathRef path = CGPathCreateMutable(); 
CGPathMoveToPoint(path, NULL, 0, 0); 
...... 
for (int i = 0; i < [refData count];i++) { 


    CGPathAddLineToPoint(path, NULL, ((float)i/[refData count])*screenWidthBoundry,  [[refData objectAtIndex:i] doubleValue]); 
} 


CGPathAddLineToPoint(path, NULL, screenWidthBoundry, 0); 
CGPathAddLineToPoint(path, NULL, 0, 0); 

shapenode.path = path; 
shapenode.antialiased = YES; 
shapenode.fillColor = [SKColor colorWithRed:17.0/255.0 green:108.0/255.0 blue:125.0/255.0 alpha:1.0]; 
//shapenode.strokeColor = [UIColor clearColor]; 

shapenode.lineWidth = 1.0f; 

shapenode.physicsBody = [SKPhysicsBody bodyWithEdgeChainFromPath:path]; 

shapenode.physicsBody.affectedByGravity = NO; 
shapenode.physicsBody.categoryBitMask = CollisionTypeMountain; 
shapenode.physicsBody.collisionBitMask = 0; 
shapenode.physicsBody.contactTestBitMask = CollisionTypeBird; 

CGPathRelease(path); 
return shapenode; 

내 문제는 SkShapeNode이 (아직도 60 FPS를 iPad에서 원활하게 실행하고 아이폰 5 만) 아이폰 4에 애니메이션을 둔화와 메모리를 많이 소모되는 내 경로에 포인트를주고 CGMutablePathRef를 사용합니다. skshapnode 객체를 캐시하여 애니메이션을 원활하게 실행할 수 있습니까? 어떤 도움을 주셔서 감사합니다!

+0

모양 노드는 무엇입니까? – sangony

+0

@sangony 임의의 모양 .. 대략 200 포인트를 사용합니다. 노드처럼 산을 그립니다. –

+2

자주 노드를 다시 만들면 어떤 노드에 있든 느려질 것입니다. SKShapeNode의 경우 특히 일괄 적으로 그려지지 않으며 디버깅 목적으로 존재하며 실제 게임 비주얼을 생성하지는 않습니다. 애플이 문서를 더 분명하게 보이기를 바란다. 마지막으로 iPhone 4는 차세대 iPhone 4S에 비해 훨씬 느린 장치입니다. 셰이더 성능은 단일 코어 만있는 CPU 성능뿐만 아니라 상당히 느립니다. 요즘 많은 게임에서 iPhone 4에서 게임을 원활하게 실행하는 것은 어려운 일입니다. – LearnCocos2D

답변

7

너무 많은 CPU 리소스를 소비하고 프레임 속도를 죽이는 SKShapeNodes와 동일한 문제가 발생했습니다. SKTexture를 만들려면 SKView의 textureFromNode: 메서드를 사용하십시오. 이제 뷰가 ​​생성 한 SKTexture로 SKSpriteNode를 생성하십시오. 이렇게하면 성능 문제가 해결됩니다.

Create an SKTexture from an SKShapeNode

+0

늦게 답변을 드려 죄송합니다. 고마워. –

1

표시된 코드를 기반으로 프로그램에서 진행되고있는 상황을 말하기는 어렵습니다. 위의 방법을 기반으로 많은 스프라이트를 생성하면 메모리와 성능에 문제가 발생할 것입니다.

Fireworks, Photoshop 등과 같은 외부 이미지 편집기를 사용하여 프로그램에 필요한 모든 모양과 이미지를 만들고이를 텍스처 아트라스에 배치하는 것을 고려하십시오. 아틀라스를 사용하면 성능이 크게 향상되고 메모리 사용량이 감소합니다.

Apple's Sprite Kit Programming Guide이 문제의 특정 언급한다 :

각 텍스처는 별도의 다음 객체, 스프라이트 키트로 취급하고 그래픽 하드웨어 렌더링하기 위해 더 열심히 일해야한다 장면을-및 게임의 성능이 저하 할 수

합니다. 특히 Sprite Kit는 텍스처 당 적어도 하나의 드로잉 패스를 만들어야합니다. 여러 그리기 과정을 피하기 위해 Sprite Kit는 텍스처 아트 레이어를 사용하여 관련 이미지를 수집합니다. 함께 수집해야하는 애셋을 지정하면 Xcode는 자동으로 텍스처 맵을 작성합니다. 그런 다음 게임이 텍스처 맵을로드하면 스프라이트 키트는 아트라스 내부의 모든 이미지를 단일 텍스처 인 것처럼 관리합니다. SKTexture 객체를 계속 사용하여 아틀라스에 포함 된 요소에 액세스합니다.