Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么在所有像素的双for循环中使用SDL2和SDL_RenderCopy时性能会很差?_C++_Performance_Game Engine_Sdl 2_Raycasting - Fatal编程技术网

C++ 为什么在所有像素的双for循环中使用SDL2和SDL_RenderCopy时性能会很差?

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,

我正在用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, 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,其中as
SDL_Surface
将使用软件渲染(除非您从修改后的曲面的每一帧创建一个新纹理,该纹理无论如何都不那么有效)。在蒸汽模式下使用
SDL_纹理
,您可以访问像素,只需创建一次,并利用硬件加速和官方示例: