C++ 为什么在所有像素的双for循环中使用SDL2和SDL_RenderCopy时性能会很差?
我正在用SDL2编程一个光线投射游戏。 在绘制地板时,我需要调用SDL_RenderCopy pixelwise。这会导致一个瓶颈,使帧速率降至10 fps以下。 我正在寻找性能提升,但似乎找不到 以下是性能下降的大致概述:C++ 为什么在所有像素的双for循环中使用SDL2和SDL_RenderCopy时性能会很差?,c++,performance,game-engine,sdl-2,raycasting,C++,Performance,Game Engine,Sdl 2,Raycasting,我正在用SDL2编程一个光线投射游戏。 在绘制地板时,我需要调用SDL_RenderCopy pixelwise。这会导致一个瓶颈,使帧速率降至10 fps以下。 我正在寻找性能提升,但似乎找不到 以下是性能下降的大致概述: int main() { while(true) { for(x=0; x<800; x++) { for(y=0; y<600; y++) { SDL_Rect src = { 0,
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);
}
}
intmain(){
while(true){
对于(x=0;x您可能应该为此使用纹理流。基本上,您将创建类型为SDL\u TEXTUREACCESS\u streaming
的SDL\u TEXTUREACCESS\u streaming
的SDL\u纹理,然后在“锁定”纹理的每个帧中,更新所需的像素,然后再次“解锁”纹理。然后在单个SDL\u RenderCopy
中渲染纹理>打电话
- 懒洋洋的例子-
- 探索星系-
除此之外,一帧调用SDL\u RenderCopy
480000次总是会降低帧速率。您正在调用SDL\u RenderCopy()
在每个帧中,所以600*800=480 000次!性能下降是正常的。您可能需要进行分析,以准确确定瓶颈区域。似乎对于每个for循环,您都在创建数组并分配内存。对于每个外部for循环,您都在这样做600次。您是否有可能在以后重复使用同一个数组除此之外,不要创建新的数组。如果可以重用数组,这将确保CPU从同一内存位置获取数据,而不是在整个内存中查找数据。每个像素真的有单独的纹理吗?你真的不应该这样做。@Fsmv你认为为什么?他只有一个纹理-tx
他只是一次渲染一个像素,但不知道为什么。@Zammalad哦,你说得对,我的错。我想我没有仔细阅读他的代码,认为这是有人用1x1矩形调用RenderCopy 800*600次的唯一原因。但是,单独复制每个像素真的很奇怪。这是真的吗这些手动像素操作需要使用纹理?临时使用SDL_曲面
不是更快吗?此外,由于像素是“集成的”,因此不再需要调用SDL_渲染复制
当解锁纹理时,你知道吗?我不知道你的意思@TimmosWell“SDL_曲面对所有这些像素操作不是比SDL_纹理更有效吗?@Timmos我不这么认为,尽管我可能是错的。但是假设OP使用的是SDL2,它被标记为SDL_纹理
是硬件accelerated,其中asSDL_Surface
将使用软件渲染(除非您从修改后的曲面的每一帧创建一个新纹理,该纹理无论如何都不那么有效)。在蒸汽模式下使用SDL_纹理
,您可以访问像素,只需创建一次,并利用硬件加速和官方示例: