मैं जावा & जॉगएल और सी # & ताओ.ओपेनजीएल के बीच एक बड़ा प्रदर्शन अंतर देख रहा हूं जब दोनों पीएनजी को भंडारण से स्मृति में लोड करते हैं, और लोड करते समय BufferedImage (जावा) या बिटमैप (सी # - दोनों हार्ड ड्राइव पर पीएनजी हैं) 'ओपनजीएल में'।ओपनजीएल प्रदर्शन मुद्दों में पीएनजी लोड हो रहा है - जावा और जॉगएल सी # और ताओ से अधिक धीमी है। ओपनजीएल
यह अंतर काफी बड़ा है, इसलिए मुझे लगता है कि मैं कुछ गलत कर रहा था, हालांकि बहुत सारी खोज और विभिन्न लोडिंग तकनीकों का प्रयास करने के बाद मैं इस अंतर को कम करने में असमर्थ रहा हूं।
जावा के साथ मुझे 248ms में लोड की गई एक छवि मिलती है और 728ms में ओपनजीएल में लोड किया जाता है, सी # पर छवि लोड करने के लिए 54ms लेता है, और 34 मिमी बनावट बनाते हैं।
उपरोक्त प्रश्न में छवि एक पीएनजी है जिसमें पारदर्शिता है, जिसका आकार 7200x255 है, जो 2 डी एनिमेटेड स्प्राइट के लिए उपयोग किया जाता है। मुझे एहसास है कि आकार वास्तव में काफी हास्यास्पद है और स्प्राइट काटने पर विचार कर रहा हूं, हालांकि बड़ा अंतर अभी भी वहां है (और भ्रमित)।
जावा तरफ कोड इस तरह दिखता है:
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);
सी # कोड का उपयोग करता है:
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();
के बाद काफी परीक्षण का एक बहुत मैं केवल इस निष्कर्ष पर आ सकता है कि जावा/JOGL यहां बस धीमा है - पीएनजी पढ़ने जितना तेज़ नहीं हो सकता है, या मैं अभी भी कुछ गलत कर रहा हूं।
धन्यवाद।
EDIT2:
मैं ने पाया है कि प्रारूप TYPE_INT_ARGB_PRE के साथ एक नया BufferedImage बनाने लगभग आधे से कम हो जाती है ओपन बनावट लोड समय - यह, नए BufferedImage बनाने के लिए होने से Graphics2D हो रही है और फिर पहले से भरी हुई प्रतिपादन शामिल इसके लिए छवि।
संपादित 3: 5 भिन्नताओं के लिए बेंचमार्क परिणाम। मैंने एक छोटा बेंचमार्किंग टूल लिखा है, निम्नलिखित परिणाम 33 पीएनजी के सेट को लोड करने से आते हैं, अधिकांश बहुत व्यापक हैं, 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 (बीआईएस) जेम्स ब्रैनिगन के उत्तर में वर्णित तकनीक को संदर्भित करता है। 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);
लोड हो रहा है के किसी भी अधिक तरीकों (या तो ओपन करने के लिए फ़ाइल से चित्र या छवियाँ) की सराहना की हैं, मैं इन मील के पत्थरों अद्यतन करेगा।
ताओ का उपयोग कर सी # में चलने वाला एक ही बेंचमार्क औसत 11031ms औसत 11031ms लेता है।जावा/जॉगएल के लिए मैंने पाया है कि सबसे तेज विधि से अभी भी 5 गुना तेज है। –