2013-10-22 5 views
0

나는 cocos2dx 2.1.4를 사용하여 게임을 만들고 있습니다. FPS는 지속적으로 떨어지고 결코 회복되지 않습니다. 자세한 내용은 다음을 참조하십시오.Cocos2dx 2.1.4 게임, Continuos FPS가 떨어지며 결코 복구되지 않습니다

배경에 대한 배경 : - 일부 모양을 아래로 스크롤하는 게임, 각 모양의 일부 사각형 블록으로 구성되어 있습니다. 나는 7 종류의 블록이 있습니다. 스프라이트 시트에로드 된 모든이 스프라이트 시트의 블록을 사용하여 모양을 만듭니다. 레벨 파일은 이러한 모양으로 구성됩니다. 나는 한 화면에 동시에 두 개의 레벨을로드하고 화면을 벗어나서 스크롤을 원활하게합니다.

CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("56blackglow.plist"); 
_gameBatchNode1 = CCSpriteBatchNode::create("56blackglow.png", 200); 
_gameBatchNode1->retain(); 
this->addChild(_gameBatchNode1,kForeground); 

_gameBatchNode2= CCSpriteBatchNode::create("56blackglow.png", 200); 
    _gameBatchNode2->retain(); 
    this->addChild(_gameBatchNode2,kForeground); 

내가 직면하고 문제는 내가 게임 프레임 속도를 재생 계속으로 10까지 60 FPS에서 지속적으로 떨어질 것입니다 - : 같은 시간에 두 가지 수준의 로딩을 위해 나는 두 개의 서로 다른 CCSprite 게임 배치 노드를 사용 fps는 결코 회복하지 못하거나 회복 될 수도 있습니다. 20 분 동안 관찰했지만 기다릴 시간이 너무 많았습니다.

내 관측 : -

1

> 나는()는 최대 시간은 무승부로 보여줍니다 시간 프로파일을 사용하여 호출합니다. 또한 게임을 매우 빠르게하면 트랙의 피크 시간이 길어 지므로 더 많은 작업을 할 수있게 될 것입니다.하지만 일단 피크가 도달하면 Idle 게임을 종료하더라도 대략 높이 만 유지됩니다. 정상입니까? 현재 작업이 끝나면 나에게 그것은 정상 피크로 돌아 갔음에 틀림 없다.

2> 두 곳의 일괄 처리 노드를 사용하고 사용자 터치로 그 자식을 제거하면 속도가 느려질 수 있지만 그 다음에는 정상적으로 실행되어야하는 자식을 제거한 후 일어난다 고 생각하는 곳이 있습니다. 배치 노드에서 10 명의 자식을 즉시 제거하는 것이 좋습니다. 어떤 사람들은 매우 느린 과정을 말한다. 이 문제를 일으키는 지 확인하려면 다음을 수행하십시오. -

대신에 나는 아이들의 시야를 false로 설정합니다. 그러나 여전히 FPS는 떨어지고 결코 복구되지 않습니다.

의견을 보내주십시오.

답변

0

터치 할 때마다 레이어에 8 개의 새로운 스프라이트가 추가되고 터치 할 때마다 그 레이어가 추가됩니다. 그래서 시간이 지남에 따라 더 많은 일을하고 있습니다. 이

는 사실 내가 터치, 나는 모든 시간을하고 있던 방식에 8 개 장소에서 스프라이트를 교체하고 싶은 문제 : - 그것은이 스프라이트는 모든 터치로 추가 할 일으키는

_colorBottom1=CCSprite::createWithSpriteFrameName(png[0]); 
    this->addChild(_colorBottom1,kForeground); 
    _colorBottom1->setPosition(ccp((_colorPanelLeftPad)*_blockWidth,_blockWidth)); 

.

하지만이 있었다 (대신 다시 스프라이트를 만드는 질감을 교체)해야 -

CCSpriteFrame *frame1=CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(png0); 
_colorBottom1->setDisplayFrame(frame1); 
0

SpriteBatchNodes는 일반적으로 많은 요소를 효과적으로 그리기에 적합하지만 정적/비 동적 요소에 가장 적합하다고 생각합니다. 귀하의 경우에는 비록 화면 밖으로 이동하지만 여전히 살아있는 요소가 많은 경우 draw() 함수는 일부 검사를 수행해야하므로 성능을 높일 수 있습니다 (명시 적으로 isVisible(false);을 설정하더라도 여전히 확인해야 함) .

시간 기반 기능을 통해 화면 외부에 새로운 모양을 추가하고보기 외부에서 스크롤하면 단순히 배치 노드를 사용하지 않고 장면에서 제거하는 것이 더 좋을 것이라고 생각합니다.

+0

내가 오전, 그래서 난 CCSprite를 사용하여 블록을 추가 할 예정 :: 생성(). 또한 메모리 누수가 발생하면 FPS가 떨어 집니까? 두 사람 사이에 어떤 관계가 있습니까? – Eklavyaa

+0

배치 노드를 사용하는 전체 아이디어는 배치 노드 스크롤을 사용하여 모든 모양을 동시에 스크롤하는 것이 었습니다. 배치 노드를 사용하지 않으면 지루한 모양을 개별적으로 스크롤해야합니다. 그래서 배치 노드를 사용하여 많은 코드를 변경해야한다는 제안을 확인해야합니다. – Eklavyaa

+0

글쎄, 그것들을 별도의 CCLayer에 추가하고 이것을 스크롤 할 수 있습니다. 그러나 정확한 위치를 계산하여 요소를 생성하는 것은 지루할 것입니다. CCMoveTo/CCMoveBy 사용을 고려 했습니까? 또한 블록을 이동하기위한 자체 업데이트 기능을 작성하는 것은 그렇게 어려운 작업이 아닙니다. 또한 다른 FPS에 대해 동일한 경험을 제공 할 수있는 시간 제어 기능이 있습니다. – Losiowaty