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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.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
SDL渲染太慢 我是C++和SDL的初学者,我正在慢慢地编写一些小游戏,遵循一些教程来学习一些概念。_C++_Sdl_Sdl 2 - Fatal编程技术网

SDL渲染太慢 我是C++和SDL的初学者,我正在慢慢地编写一些小游戏,遵循一些教程来学习一些概念。

SDL渲染太慢 我是C++和SDL的初学者,我正在慢慢地编写一些小游戏,遵循一些教程来学习一些概念。,c++,sdl,sdl-2,C++,Sdl,Sdl 2,不过,我遇到了一个问题:我的渲染似乎非常慢。 我已经使用PerformanceCounters计算了有无渲染函数的循环。没有它,我每帧得到0~2毫秒;当我添加渲染时,它会上升到每帧65毫秒 有人能告诉我我的渲染功能有什么问题吗 SDL_Texture *texture; ... // gets called by the main loop void render(int x_offset, int y_offset) { if (texture) { SDL_Destroy

不过,我遇到了一个问题:我的渲染似乎非常慢。 我已经使用PerformanceCounters计算了有无渲染函数的循环。没有它,我每帧得到0~2毫秒;当我添加渲染时,它会上升到每帧65毫秒

有人能告诉我我的渲染功能有什么问题吗

SDL_Texture *texture;

...

// gets called by the main loop
void render(int x_offset, int y_offset)
{
  if (texture)
  {
    SDL_DestroyTexture(texture);
  }

  texture = SDL_CreateTexture(renderer,
      SDL_PIXELFORMAT_ARGB8888,
      SDL_TEXTUREACCESS_STREAMING,
      texture_w,
      texture_h);

  if (SDL_LockTexture(texture, NULL, &pixel_memory, &pitch) < 0) {
    printf("Oops! %s\n", SDL_GetError());
  }

  Uint32 *pixel;
  Uint8 *row = (Uint8 *) pixel_memory;

  for (int j = 0; j < texture_h; ++j) {
    pixel = (Uint32 *)((Uint8 *) pixel_memory + j * pitch);
    for (int i = 0; i < texture_w; ++i) {

      Uint8 alpha = 255;
      Uint8 red = 172;
      Uint8 green = 0;
      Uint8 blue = 255;

     *pixel++ = ((alpha << 24) | (red << 16) | (green << 8) | (blue));

    }
  }
  SDL_UnlockTexture(texture);
} 
SDL_纹理*纹理;
...
//由主循环调用
无效渲染(整数x_偏移,整数y_偏移)
{
如果(纹理)
{
SDL_破坏纹理(纹理);
}
纹理=SDL_CreateTexture(渲染器,
SDL_像素格式_argb888,
SDL_纹理访问_流媒体,
纹理,
纹理;
如果(SDL_锁定纹理(纹理、空值和像素_内存和间距)<0){
printf(“Oops!%s\n”,SDL_GetError());
}
Uint32*像素;
Uint8*行=(Uint8*)像素_存储器;
对于(int j=0;j*pixel++=((alpha可能什么都没有。锁定纹理以直接访问像素的速度很慢。很可能,您可以在渲染功能中执行许多其他操作,而不会看到速度进一步降低


如果你想要更快的渲染,你需要更高级别的功能。

这可能会很慢,因为你每一帧都在破坏和创建纹理,锁定纹理/上传像素数据不是很快,但我怀疑这是这里的瓶颈。我强烈建议在进入主循环并重新使用之前分配纹理一次在渲染过程中,然后在程序退出之前销毁它。

SDL2基于硬件渲染。访问纹理,即使使用流标志,也不会很快,因为您使用GPU打乒乓球

<> P>而不是创建和销毁每一帧的纹理,你应该考虑在重新绘制之前简单地清理它。

另一个选择是使用表面。你用表面做你的东西,然后把它画成一个纹理。我不确定这会有多大的收益,但我认为这仍然比每帧破坏、创建、锁定和解锁纹理要好

看看你的代码,我知道这只是一个测试,尽管你可以尝试用SDL原语渲染纹理


<>最后,在测试过程中要记住,你的驱动程序可能会强制垂直同步,这可能导致假性能不佳。

也许你的编译标志被设置为-O0进行调试?为什么每次都创建和销毁纹理?是否会更好地重用它?我正在用C++ +……sdl2 config--cflags--libs
,所以,是的,-g在那里。我尝试删除-g,也删除了SDL_Destroy纹理,但没有更好的数字。我想就是这样。在这种情况下,看起来你正在循环通过一个新的纹理,将其逐像素设置为紫色;我打赌如果你做一个预先存在的缩放blit,你会获得巨大的加速将紫色纹理添加到新纹理上。(我不记得你在SDL中是如何做到这一点的。)至少,不要在渲染循环的每一次迭代中都这样做…在启动时做一次并保存纹理。我认为内部循环只是一个示例,而不是渲染循环中的实际代码。我倾向于接受这个答案并继续前进,但有一种想法真的让我感到困扰:这是在windows中完成的代码的“翻译”(凯西·穆拉托里(Casey Muratori)手工制作的《英雄系列》。他在windows上逐像素的绘制似乎对循环影响不大。(以下是整个“类”,以防有人感兴趣:)这就是我以前所做的。但我遇到了一个奇怪的错误:只有当我将SDL_INIT_GAMECONTROLLER添加到INIT函数时,增加窗口的高度会使写入纹理像素的操作出错-好像它没有正确扩展一样,我不确定。当我开始重新分配纹理时,情况发生了变化,就好像它正在调整我的大小一样t正确。我不确定是什么问题,但提交在这里,以防您或任何人想看到它=]哦,我明白了,是的,如果您正在调整窗口大小,并且此纹理应该覆盖整个屏幕,您需要重新创建它以匹配新的大小。但是,您应该仅在窗口大小更改时重新创建它,而不是每一帧。要执行此操作你可以观察一条消息,告诉你窗口已经调整大小,然后获得新的大小,并仅在需要时重新创建纹理。看起来你已经处理了这个事件,所以只需在那里重新分配纹理即可。