Я заметил большую разницу в производительности между Java & JOGL и C # & Tao.OpenGL, когда обе загрузки PNG из хранилища в память и при загрузке этого BufferedImage (java) или Bitmap (C # - оба являются PNG на жестком диске) ' в 'OpenGL.
Эта разница довольно велика, поэтому я предположил, что делал что-то не так, однако, после долгих поисков и попыток использования различных методов загрузки, я не смог уменьшить эту разницу.
С Java я получаю изображение, загруженное за 248 мс и загруженное в OpenGL за 728 мс
То же самое на C # занимает 54 мс для загрузки изображения и 34 мс для загрузки / создания текстуры.
Вышеуказанное изображение представляет собой PNG-файл с прозрачностью размером 7200x255, используемый для двумерного анимированного спрайта. Я понимаю, что размер действительно довольно нелепый, и я собираюсь сократить спрайт, однако большая разница все еще существует (и сбивает с толку).
На стороне Java код выглядит так:
BufferedImage image = ImageIO.read(new File(fileName));
texture = TextureIO.newTexture(image, false);
texture.setTexParameteri(GL.GL_TEXTURE_MIN_FILTER, GL.GL_LINEAR);
texture.setTexParameteri(GL.GL_TEXTURE_MAG_FILTER, GL.GL_LINEAR);
Код C # использует:
Bitmap t = new Bitmap(fileName);
t.RotateFlip(RotateFlipType.RotateNoneFlipY);
Rectangle r = new Rectangle(0, 0, t.Width, t.Height);
BitmapData bd = t.LockBits(r, ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
Gl.glBindTexture(Gl.GL_TEXTURE_2D, tID);
Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGBA, t.Width, t.Height, 0, Gl.GL_BGRA, Gl.GL_UNSIGNED_BYTE, bd.Scan0);
Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_LINEAR);
Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_LINEAR);
t.UnlockBits(bd);
t.Dispose();
После довольно длительного тестирования я могу только прийти к выводу, что Java / JOGL здесь медленнее - чтение PNG может быть не таким быстрым или что я все еще делаю что-то не так.
Спасибо.
Edit2:
Я обнаружил, что создание нового BufferedImage с форматом TYPE_INT_ARGB_PRE уменьшает время загрузки текстуры OpenGL почти вдвое - это включает необходимость создания нового BufferedImage, получения из него Graphics2D и затем рендеринга ранее загруженного изображения в него.
Edit3: результаты тестов для 5 вариантов.
Я написал небольшой инструмент для тестирования, следующие результаты получены при загрузке набора из 33 png, большинство из них очень широкие, 5 раз.
testStart: ImageIO.read(file) -> TextureIO.newTexture(image)
result: avg = 10250ms, total = 51251
testStart: ImageIO.read(bis) -> TextureIO.newTexture(image)
result: avg = 10029ms, total = 50147
testStart: ImageIO.read(file) -> TextureIO.newTexture(argbImage)
result: avg = 5343ms, total = 26717
testStart: ImageIO.read(bis) -> TextureIO.newTexture(argbImage)
result: avg = 5534ms, total = 27673
testStart: TextureIO.newTexture(file)
result: avg = 10395ms, total = 51979
ImageIO.read (bis) относится к технике, описанной в ответе Джеймса Бранигана ниже.
argbImage относится к технике, описанной в моем предыдущем редактировании:
img = ImageIO.read(file);
argbImg = new BufferedImage(img.getWidth(), img.getHeight(), TYPE_INT_ARGB_PRE);
g = argbImg.createGraphics();
g.drawImage(img, 0, 0, null);
texture = TextureIO.newTexture(argbImg, false);
Буду признателен за любые другие методы загрузки (изображения из файла или изображения в OpenGL), я обновлю эти тесты.