Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.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
Java 如何在c+中最有效地将像素阵列渲染到窗口+;?_Java_C++_Arrays_Sdl_Pixels - Fatal编程技术网

Java 如何在c+中最有效地将像素阵列渲染到窗口+;?

Java 如何在c+中最有效地将像素阵列渲染到窗口+;?,java,c++,arrays,sdl,pixels,Java,C++,Arrays,Sdl,Pixels,到目前为止,我一直在使用SDL2.0,将我的像素阵列复制到纹理中,然后在屏幕上渲染。 我的渲染方法如下所示: for (int i = 0; i < WIDTH*HEIGHT; i++){ pixels[i] = 0xFFFF0000; //pixel Format: AARRGGBB } SDL_UpdateTexture(sdlTexture, NULL, pixels, 800 * sizeof(Uint32)); SDL_R

到目前为止,我一直在使用SDL2.0,将我的像素阵列复制到纹理中,然后在屏幕上渲染。 我的渲染方法如下所示:

for (int i = 0; i < WIDTH*HEIGHT; i++){
        pixels[i] = 0xFFFF0000;
        //pixel Format: AARRGGBB
    }
    SDL_UpdateTexture(sdlTexture, NULL, pixels, 800 * sizeof(Uint32));

    SDL_RenderClear(renderer);
    SDL_RenderCopy(renderer, sdlTexture, NULL, NULL);
    SDL_RenderPresent(renderer);

首先,需要注意的是,测量如此短的时间并不总是可靠的,因此应该对这些值采取谨慎的态度。即使java和C++使用相同的系统计时器,也可能有不相关的差异。 关于代码,
SDL\u UpdateTexture
将向内部缓冲区发送一个副本,因此速度有点慢。您应该使用
SDL\u LockTexture
SDL\u UnlockTexture
。这将允许直接访问内部缓冲区

此外,在您的情况下,您不需要清除屏幕,因为您的纹理覆盖整个屏幕,因此会覆盖所有内容


如果只需要填充一行屏幕,可以使用汇编指令
rep stos
,这比循环快得多。使用VisualC++,可以使用 SysOSTD 发布UTI32的代码>代码> ReSTOS。这类似于
memset
,但适用于uint32(您也有带有
\uu stosw
的uint16版本,以及带有
\uu stosq
的uint64版本,仅限x64)。有相当于制作副本的
\uu movsd
,但是执行良好的
memcpy
可以更快。

您绘制了多少纹理?启用vsync后,2.000.000纳秒仍然小于一帧。我只初始化一个正在绘制的纹理。我现在发布的基本上是我的整个渲染函数,因为我现在只是用它来测试性能。首先,在C++中,你清除屏幕,但是在爪哇你不改变它。现在尝试它,但是它并不真正影响速度。感觉你正在测量C++的某种“调试”构建。
BufferStrategy bs = getBufferStrategy();
    if (bs == null){
        createBufferStrategy(3);
        return;
    }
    screen.clear()
    for (int i = 0; i < WIDTH*HEIGHT; i++){
        pixels[i] = 0xFF0000;
        //pixel Format: RRGGBB
    }
    Graphics2D g =  (Graphics2D) bs.getDrawGraphics();
    g.drawImage(displayImage,0,0,getWidth(),getHeight(),null);



    g.dispose();
    bs.show();
auto start = std::chrono::steady_clock::now();

//render function

auto end = std::chrono::steady_clock::now();
auto result = std::chrono::duration_cast<std::chrono::nanoseconds>(end - start).count();
std::cout << result << std::endl;
long start = System.nanoTime();

//render function

long end = System.nanoTime();
long result = end - start;
System.out.println(result);