2013-07-25 5 views
0

그래서 특정 색상의 화면에있는 모든 픽셀의 위치를 ​​찾으려고합니다.CCRenderTexture에서 픽셀의 색상을 가져옵니다.

다음 코드는 작동하지만 매우 느립니다. 왜냐하면 모든 픽셀 좌표를 반복해야하기 때문입니다.

다음 코드를 개선하여 더욱 효율적으로 만들 수있는 방법이 있습니까?

// Detect the position of all red points in the sprite 
    UInt8 data[4]; 

    CCRenderTexture* renderTexture = [[CCRenderTexture alloc] initWithWidth: mySprite.boundingBox.size.width * CC_CONTENT_SCALE_FACTOR() 
                    height: mySprite.boundingBox.size.height * CC_CONTENT_SCALE_FACTOR() 
                   pixelFormat:kCCTexture2DPixelFormat_RGBA8888]; 
    [renderTexture begin]; 
    [mySprite draw]; 

    for (int x = 0; x < 960; x++) 
    { 
     for (int y = 0; y < 640; y++) 
     {     
      ccColor4B *buffer = malloc(sizeof(ccColor4B)); 
      glReadPixels(x, y, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, buffer); 
      ccColor4B color = buffer[0]; 

      if (color.r == 133 && color.g == 215 && color.b == 44) 
      { 
       NSLog(@"Found the red point at x: %d y: %d", x, y); 
      } 
     } 
    } 

    [renderTexture end]; 
    [renderTexture release]; 
+0

프레임 버퍼에서 픽셀을 읽는 속도가 느립니다. 특히 픽셀 단위로 수행하는 경우 속도가 느립니다. 렌더링 텍스쳐의 텍스쳐 메모리를 가져 와서 glReadPixel을 사용하지 않고 반복합니다. 그 속도는 훨씬 빨라야합니다! – LearnCocos2D

+0

@ LearnCocos2D 안녕 친구! 나는 어떻게 그것에 대해 갈 것인가? 공유 할 수있는 예가 있습니까? 그럼 당신의 응답을 올바르게 표시 할 수 있습니다 :) – Sneaksta

+0

실수로, CCTexture2D 메모리 버퍼를 유지하지 않습니다, 그것은 모두 GL 메모리 어쨌든. – LearnCocos2D

답변

0

매번 버퍼를 malloc하지 마십시오. 동일한 버퍼를 다시 사용하십시오. malloc이 느립니다! Apple의 Memory Usage Documentation을 살펴보십시오.

더 빨리 수행 할 수있는 알고리즘을 모르지만이 방법이 도움이 될 수 있습니다.

+0

좋습니다. 좋은 지적입니다. 같은 버퍼의 재사용을 구현하려면 어떻게해야합니까? – Sneaksta

+0

반복을 시작하기 전에 malloc을 한 번 수행하십시오. – Wilson

+1

방금 ​​시도했지만 더 빨리 반복하지 않는 것 같습니다. :( – Sneaksta

1

한 번에 하나의 픽셀 이상을 읽을 수 있습니다. OpenGL을 빠르게 만드는 방법은 모든 작업을 가능한 한 적은 작업으로 압축하는 것입니다. 이는 두 가지 방식 (GPU 읽기 및 쓰기) 모두에서 작동합니다.

한 번의 호출로 전체 텍스처를 읽고 결과 배열에서 빨간색 픽셀을 찾습니다. 아래.

또한

일반적으로 말하는 것은 (내부에 X로, 외부에 Y [행]) -loops위한 순서를 반전 수단을 행함으로써 비트 맵 행을 통과하는 것이 좋다 그 양해
// Detect the position of all red points in the sprite 
ccColor4B *buffer = new ccColor4B[ 960 * 640 ]; 

CCRenderTexture* renderTexture = [[CCRenderTexture alloc] initWithWidth: mySprite.boundingBox.size.width * CC_CONTENT_SCALE_FACTOR() 
                   height: mySprite.boundingBox.size.height * CC_CONTENT_SCALE_FACTOR() 
                  pixelFormat:kCCTexture2DPixelFormat_RGBA8888]; 
[renderTexture begin]; 
[mySprite draw]; 

glReadPixels(0, 0, 940, 640, GL_RGBA, GL_UNSIGNED_BYTE, buffer); 

[renderTexture end]; 
[renderTexture release]; 

int i = 0; 
for (int y = 0; y < 640; y++) 
{ 
    for (int x = 0; x < 960; x++) 
    {        
     ccColor4B color = buffer[i];//the index is equal to y * 940 + x 
     ++i; 
     if (color.r == 133 && color.g == 215 && color.b == 44) 
     { 
      NSLog(@"Found the red point at x: %d y: %d", x, y); 
     } 
    } 
} 
delete[] buffer; 
관련 문제