Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.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++ SDL2纹理更新速度_C++_Opengl_Rendering_Sdl 2 - Fatal编程技术网

C++ SDL2纹理更新速度

C++ SDL2纹理更新速度,c++,opengl,rendering,sdl-2,C++,Opengl,Rendering,Sdl 2,我正在尝试为将来运行的软件渲染示例设置SDL2环境,所以我需要直接访问像素来绘制。下面是一些代码,它将1个红色像素绘制到纹理上,然后显示它所说的 #包括 #包括 屏幕宽度=1920; 屏幕高度=1080; SDL_窗口*gWindow; SDL_渲染器*gRenderer; SDL_纹理*gTexture; SDL_事件e; void*gPixels=NULL; int gPitch=屏幕宽度*4; bool-gExitFlag=false; Uint64启动; Uint64端; Uint64频

我正在尝试为将来运行的软件渲染示例设置SDL2环境,所以我需要直接访问像素来绘制。下面是一些代码,它将1个红色像素绘制到纹理上,然后显示它所说的

#包括
#包括
屏幕宽度=1920;
屏幕高度=1080;
SDL_窗口*gWindow;
SDL_渲染器*gRenderer;
SDL_纹理*gTexture;
SDL_事件e;
void*gPixels=NULL;
int gPitch=屏幕宽度*4;
bool-gExitFlag=false;
Uint64启动;
Uint64端;
Uint64频率;
双秒;
int main(int argc,char*args[]
{
SDL_Init(SDL_Init_视频);
gWindow=SDL_CreateWindow(“SDL教程”,SDL_WINDOWPOS_未定义,SDL_WINDOWPOS_未定义,屏幕宽度,屏幕高度,显示的SDL_窗口| SDL_WINDOW_OPENGL);
gRenderer=SDL_CreateRenderer(gWindow,-1,SDL_RENDERER_ACCELERATED);//| SDL_RENDERER_PRESENTVSYNC);vsync已关闭
gTexture=SDL_CreateTexture(gRenderer、SDL_PIXELFORMAT_RGBA888、SDL_TEXTUREACCESS_流媒体、屏幕宽度、屏幕高度);
而(!gExitFlag)
{
while(SDL_PollEvent(&e)!=0)
{
如果(e.type==SDL\u退出)
{
gExitFlag=true;
}
}
start=SDL_GetPerformanceCounter();
SDL_LockTexture(gTexture、NULL、gPixels和gPitch);
*((uint32_t*)gPixels)=0xff000ff;
SDL_UnlockTexture(gTexture);//在不同硬件上为20-100ms
end=SDL_GetPerformanceCounter();
freq=SDL_GetPerformanceFrequency();
SDL_渲染副本(grender、gTexture、NULL、NULL);
SDL_RenderPresent(gRenderer);
gPixels=NULL;
gPitch=0;
秒=(结束-开始)/静态(频率);
printf(“帧时间:%fms\n”,秒*1000.0);
}
SDL_(格温多);
SDL_(格伦德尔);
SDL_破坏纹理(gTexture);
SDL_退出();
返回0;
}

正如我在代码注释中提到的,SDL_UnlockTexture使用fullhd纹理可以达到100ms。(切换到SDL_UpdateTexture不会导致显著差异)我认为这对于实时渲染来说太多了。我是否做错了什么,或者我不应该使用所有纹理API(或任何其他GPU加速API,其中纹理必须每帧上载到GPU内存)来实时渲染整个帧?

当您想要处理原始像素数据时,您应该使用SDL的
SDL\U曲面而不是纹理。这是针对您的情况优化的不同SDL API,请参阅,不要忘记


原因是纹理存储在VRAM中,从VRAM读取的速度非常慢。表面存储在RAM中,在RAM中进行处理,并且只写入VRAM,速度非常快

C不是C++,不要使用错误的标签!这看起来像C,如果你编译成C++,就改变标签(但是不要添加!)。@奥拉夫SDL2是用C编写的,有C风格的API,我把它编译成C++。怎么了?标签是从其他类似于SLL2的问题复制的,具有类似的相似性。如果你编译为C++,那就是C++!如果工具包是用C编写的,这并不重要。否则您几乎总是需要添加C和汇编标记!注意C++编程的C风格是很差的练习。如果您使用C样式,请使用C!很抱歉,这个答案已经过时几年了,我会更新它-请参阅dup。实际上,这种方法仍然可以正常工作,SDL保留了这种意义上的向后兼容性。是否将像素数据分配为原始阵列或曲面并不重要。是的,您最终将使用SDL_UpdateTexture,并启用SDL_TEXTUREACCESS_流媒体,并且无论如何都会显示它,因此没有太大区别。
#include <SDL.h>
#include <stdio.h>

const int SCREEN_WIDTH = 1920;
const int SCREEN_HEIGHT = 1080;

SDL_Window* gWindow;
SDL_Renderer* gRenderer;
SDL_Texture* gTexture;
SDL_Event e;

void* gPixels = NULL;
int gPitch = SCREEN_WIDTH * 4;

bool gExitFlag = false;

Uint64 start;
Uint64 end;
Uint64 freq;
double seconds;

int main(int argc, char* args[])
{
    SDL_Init(SDL_INIT_VIDEO);
    gWindow = SDL_CreateWindow("SDL Tutorial", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN | SDL_WINDOW_OPENGL);
    gRenderer = SDL_CreateRenderer(gWindow, -1, SDL_RENDERER_ACCELERATED); // | SDL_RENDERER_PRESENTVSYNC); vsync is turned off
    gTexture = SDL_CreateTexture(gRenderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_STREAMING, SCREEN_WIDTH, SCREEN_HEIGHT);

    while (!gExitFlag)
    {
        while (SDL_PollEvent(&e) != 0)
        {
            if (e.type == SDL_QUIT)
            {
                gExitFlag = true;
            }
        }

        start = SDL_GetPerformanceCounter();

        SDL_LockTexture(gTexture, NULL, &gPixels, &gPitch);
        *((uint32_t*)gPixels) = 0xff000ff;
        SDL_UnlockTexture(gTexture); //20-100ms on different hardware

        end = SDL_GetPerformanceCounter();
        freq = SDL_GetPerformanceFrequency();

        SDL_RenderCopy(gRenderer, gTexture, NULL, NULL);
        SDL_RenderPresent(gRenderer);

        gPixels = NULL;
        gPitch = 0;

        seconds = (end - start) / static_cast<double>(freq);
        printf("Frame time: %fms\n", seconds * 1000.0);
    }

    SDL_DestroyWindow(gWindow);
    SDL_DestroyRenderer(gRenderer);
    SDL_DestroyTexture(gTexture);

    SDL_Quit();
    return 0;
}