Почему я получаю плохую производительность с SDL2 и SDL_RenderCopy внутри двойного цикла for для всех пикселей?
Я программирую игру радиопередачи, используя SDL2. При рисовании пола мне нужно вызывать SDL_RenderCopy по пикселям. Это приводит к узкому месту, которое понижает частоту кадров ниже 10 кадров в секунду. Я ищу повышение производительности, но не могу найти некоторые.
Вот приблизительный обзор падения производительности:
int main() {
while(true) {
for(x=0; x<800; x++) {
for(y=0; y<600; y++) {
SDL_Rect src = { 0, 0, 1, 1 };
SDL_Rect dst = { x, y, 1, 1 };
SDL_RenderCopy(ren, tx, &src, &dst); // this drops the framerate below 10
}
}
SDL_RenderPresent(ren);
}
}
2 ответа
Вы, вероятно, должны использовать потоковую передачу текстур для этого. В основном вы создадите SDL_Texture
типа SDL_TEXTUREACCESS_STREAMING
а затем в каждом кадре вы "блокируете" текстуру, обновляете требуемые пиксели, а затем снова "разблокируете" текстуру. Текстура затем отображается в одном SDL_RenderCopy
вызов.
- Пример LazyFoo - http://lazyfoo.net/tutorials/SDL/42_texture_streaming/index.php
- Изучение галактики - http://slouken.blogspot.co.uk/2011/02/streaming-textures-with-sdl-13.html
Кроме этого призвания SDL_RenderCopy
480 000 раз кадр всегда убивает вашу частоту кадров.
Ты звонишь SDL_RenderCopy()
в каждом кадре так 600 * 800 = 480 000 раз! Это нормально для снижения производительности.