Java 如何在c+中最有效地将像素阵列渲染到窗口+;?
到目前为止,我一直在使用SDL2.0,将我的像素阵列复制到纹理中,然后在屏幕上渲染。 我的渲染方法如下所示: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
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++,可以使用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);