До сих пор я использовал SDL 2.0, скопировал свой пиксельный массив в текстуру, которая затем отображается на экране. Мой метод визуализации выглядит следующим образом:Как визуализировать пиксельный массив наиболее эффективно для окна в C++?
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: (массив пикселей сохраняет пиксели «displayImage»)
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();
Удивительно я тогда увидел, что она занимает около 600,000 наносекунд, чтобы сделать это в Java и около 2.000.000 наносекунд, чтобы сделать это в C++.
Итак, мой вопрос в том, является ли более эффективный способ рисовать пиксельный массив, как я получил на экране с тех пор (я предполагаю) C++ должен отображать его быстрее, чем Java.
Кроме того, это, как я измерил время: C++:
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;
Java:
long start = System.nanoTime();
//render function
long end = System.nanoTime();
long result = end - start;
System.out.println(result);
Сколько текстур вы рисуете? С включенным vsync 2.000.000 наносекунд все еще меньше, чем один кадр. – Lanting
Я только инициализирую одну текстуру, на которой я рисую. Что я написал, это в основном моя функция рендеринга, так как я просто использую ее для проверки производительности прямо сейчас. –
Во-первых, на C++ вы очищаете экран, но в java вы этого не делаете. – ElderBug