cocos2d - x Mask 의 실현 및 최적화
6153 단어 cocos2d-x
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 해 야 돼.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Cocos Studio v3.x ListView에 PanelNode를 동적으로 추가해보기Cococs Studio에서 ListView를 설정한 BaseNode와 파트 부분이 되는 PasrtNode를 작성. ListView에 PasrtNode를 추가해 가고, 빨리 GridView적인 것을 만드는 비망록. ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.