cocos2d - x Mask 의 실현 및 최적화

6153 단어 cocos2d-x
다음으로 이동: http://blog.ch-wind.com/cocos2d-x%E4%B8%ADmask%E7%9A%84%E5%AE%9E%E7%8E%B0%E5%8F%8A%E4%BC%98%E5%8C%96/
cocos2d - x 안의 Mask 에 대해 광 점 이나 시야 통제 등 기능 과 유사 한 사 고 를 하 는 것 은 최초 로 외국어 에서 보 았 다.가 져 와 서 사용 해 보 니 효과 가 좋 더 라 고요. 그래서 바로 프로그램 에 넣 었 어 요.그러나 실제 운용 할 때 그 운행 효율 이 그리 이상 적 이지 않다 는 것 을 발견 했다. 특히 pc 플랫폼 을 목표 로 할 때 배치 가 다 르 기 때문에 프레임 률 이 현저히 떨어진다.코드 를 분석 한 결과 Mask 의 기능 은 CCRenderTexture 가 동적 으로 무늬 를 생 성하 고 대상 층 에 덮어 쓰 는 것 을 사용 한 것 으로 나 타 났 다.매번 그림 을 그 릴 때마다 이 무늬 는 다시 생 성 되 기 때문에 매우 효율 적 인 낭 비 를 초래 했다.또한 CCRenderTexture 는 FBO 를 사용 한 것 같 아서 일부 오래된 그래 픽 카드 에서 큰 프레임 률 을 잃 어 버 릴 수 있 습 니 다.
그래서 이 를 개조 하기 시 작 했 습 니 다. 사실 순환 할 때마다 무늬 를 다시 만 드 는 이 유 는 mask 자체 의 위치 가 계속 업데이트 되 기 때 문 입 니 다.sprite + glblencfunc 를 단독으로 사용 하여 해결 하려 면 순 서 를 그 리 는 관계 로 좋 은 동적 마스크 솔 루 션 을 찾기 가 쉽 지 않 습 니 다.물론 4 배 정도 되 는 마스크 그림 을 준비 하 는 것 은 가능 하지만 효율 도 낮 아 예비 방안 으로 남 길 수 밖 에 없다.
최종 적 으로 선택 한 솔 루 션 은 clippingnode 를 사용 하 는 것 입 니 다. clippingnode 는 템 플 릿 테스트 를 통 해 이 루어 집 니 다. 이것 은 gl 의 기본 기능 으로 하드웨어 에 큰 수요 가 없 을 것 입 니 다.CCColorlayer 를 클 리 핑 콘 텐 츠 로 하여 먼저 템 플 릿 테스트 를 한 다음 마스크 로 된 sprite 를 중첩 하면 됩 니 다.
csb_st = CCSpriteBatchNode::create("Images/circle.png");
 
cp_board = CCClippingNode::create();
cp_board->setContentSize(visibleSize);
cp_board->setPosition(CCPointZero);
cp_board->setAnchorPoint(CCPointZero);
cp_board->setStencil(csb_st);
cp_board->setInverted(true);
 
//////////////////////////////////////////////////////////////////////////
 
CCLayerColor* clc = CCLayerColor::create(ccc4BFromccc4F(m_renderColor),visibleSize.width,visibleSize.height);
clc->setAnchorPoint(CCPointZero);
clc->setPosition(CCPointZero);
cp_board->addChild(clc);    //content
cn_borad->addChild(cp_board,m_iLaDep+1);
 
CC_BREAK_IF(!f_refresh_circles());

sprite 는 전설의 고전 지도 로 blend 를 가 렸 으 면 좋 겠 어 요.
ccBlendFunc cbf = {GL_DST_COLOR, GL_ZERO};
 
cns_blocks = CCSpriteBatchNode::create("Images/circle.png");
cns_blocks->setBlendFunc(cbf);
cp_board->addChild(cns_blocks);
 
////////////////////////////////////////////////////////////////////////////
m_AkaruCircle = CCSprite::create("Images/circle.png");
m_AkaruCircle->setBlendFunc(cbf);
m_AkaruCircle->setPosition(ccp(200,200));
m_AkaruCircle->setScale(4);
m_Board->addChild(m_AkaruCircle,m_iLaDep);

그럼 에 도 불구 하고 GLZERO 의 blend 결 과 는 (0, 0, 0, 0) 이 므 로 올 블랙 의 불투명 커버 를 하지 않 았 다 면 정 성 스 럽 게 커버 사진 을 준비 하 더 라 도 다소 위 화 감 이 있 었 을 것 이 고, 이런 상황 이 발생 해 다른 측면 에서 수정 할 수 없 었 다 면 rendertexture 를 사용 해 야 했다.rendertexture 의 효율 적 인 요소 로 인해 우 리 는 그 부담 을 최대한 줄 여야 합 니 다. sprite 만 처리 해 야 합 니 다. 가 려 진 배경 색 을 동적 으로 바 꾸 지 않 는 한 sprite 를 다시 만 들 지 않 습 니 다.
ccBlendFunc cbf = {GL_ZERO, GL_ONE_MINUS_SRC_ALPHA};
 
CCSprite* t_sp = CCSprite::create("Images/circle.png");
t_sp->setPosition(CCPointZero);
t_sp->setAnchorPoint(CCPointZero);
t_sp->setBlendFunc(cbf);
 
CCSize vs = t_sp->getContentSize();
CCRenderTexture* t_crt = CCRenderTexture::create(vs.width, vs.height);
t_crt->beginWithClear(m_renderColor.r, m_renderColor.g, m_renderColor.b, m_renderColor.a);
 
t_sp->visit();
 
t_crt->end();
 
m_AkaruCircle = CCSprite::createWithTexture(t_crt->getSprite()->getTexture());
//m_AkaruCircle->autorelease();
m_AkaruCircle->setScale(4);
m_Board->addChild(m_AkaruCircle,m_iLaDep);

이렇게 되면 Mask 의 전체적인 효율 은 한 번 의 템 플 릿 테스트 에 두 번 의 spritebachnode 를 그 리 는 것 으로 CCRenderTexture 를 자주 사용 하 는 대체 방안 으로 사용 할 수 있 습 니 다.코드 는 다음 과 같 습 니 다. 현재 코드 구조의 관계 로 테스트 하려 면 spotlight 류 가 계승 되 어야 합 니 다. 그리고 적당 한 곳 에서 f 를 호출 해 야 합 니 다.init 해 야 돼.

좋은 웹페이지 즐겨찾기