2017-10-31 1 views
-1

SDL2를 사용하여 텍스처를 렌더링하는 데 문제가 있습니다. 내 프로그램에는 화면 주위를 움직이는 많은 픽셀이 있지만 눈에 띄게 깜박입니다. 여기 내 코드입니다 :SDL2 렌더링 (깜박임)

Source.cpp 여기

frameStart = SDL_GetTicks(); 

    screen.update(); 

    // Makes the screen black 
    for (int x = 0; x < Screen::SCREEN_WIDTH; x++) 
    { 
     for (int y = 0; y < Screen::SCREEN_HEIGHT; y++) { 
      screen.setPixel(x, y, 0, 0, 0); 
     } 
    } 

    // Draw + Update people (Code should be separated and moved) 
    for (Person &p : people) { 
     if (p.isAlive == true) { 
      p.Update(p); 
      cout << p.x << ", " << p.y << endl; 
      screen.setPixel(p.x, p.y, 255, 0, 0); 
     } 
     else { 
      screen.setPixel(p.x, p.y, 0, 0, 0); 
     } 
    } 



    // Manage events 
    if (screen.processEvents() == false) { 
     break; 
    } 

    frameTime = SDL_GetTicks() - frameStart; 

    if (frameDelay > frameTime) { 
     SDL_Delay(frameDelay - frameTime); 
    } 
} 

Screen.update 포인트 :

void Screen::update() { 

    SDL_UpdateTexture(m_texture, NULL, m_buffer, SCREEN_WIDTH * sizeof(Uint32));  
    SDL_RenderCopy(m_renderer, m_texture, NULL, NULL); 
    SDL_RenderPresent(m_renderer); 
    SDL_RenderClear(m_renderer); 
} 

다음과 같이 내 렌더링과 질감 설정은 다음과 같습니다

m_renderer = SDL_CreateRenderer(m_window, -1, SDL_RENDERER_PRESENTVSYNC); 
    m_texture = SDL_CreateTexture(m_renderer, SDL_PIXELFORMAT_RGBA8888, 
     SDL_TEXTUREACCESS_STATIC, SCREEN_WIDTH, SCREEN_HEIGHT); 

I을 렌더러와 텍스처 모두를위한 플래그를 많이 사용했지만 깜박임을 멈추는 해결책을 찾지 못했습니다. 어떤 도움이라도 대단히 감사 할 것입니다. 수행해야 할

+0

'screen.setPixel' 코드는 무엇입니까? 왜 텍스쳐를'static'으로 설정했는지 모든 프레임에서 그것을 업데이트합니까? 어떤 종류의 깜박임? 결과로 생기는 프레임 속도는 무엇입니까? – keltar

답변

0

순서는 다음과 같습니다

  • 지우기
  • 반복을 기다립니다 현재 렌더링 렌더링합니다.

당신이하고있는 일은 기본적으로 렌더링과 명확한 방법입니다. 이 방법은 렌더링 픽셀에 대해

frameStart = SDL_GetTicks(); 

SDL_RenderClear(m_renderer); 

/* Do you rendering */ 

/*Manage your events*/ 


SDL_RenderPresent(m_renderer); 


frameTime = SDL_GetTicks() - frameStart; 

if (frameDelay > frameTime) { 
    SDL_Delay(frameDelay - frameTime); 
} 

또한 잘 작동 할 수 있도록하는 경우 텍스처를 삭제하면 는, 당신은 memset 함수 느릅 나무가 빠르다 사용해야합니다. 그러나 당신의 방법은 여전히 ​​작동합니다.

memset(pixels,0,h*pitch); 
+0

memset은'memset (픽셀, h * 피치, 0);'이어야합니다. – HolyBlackCat