Ho passato un po 'di tempo a esaminare le funzionalità di accelerazione hardware di Java e sono ancora un po' confuso poiché nessuno dei siti che ho trovato online ha risposto direttamente e chiaramente ad alcune delle domande che ho. Quindi ecco le domande che ho per l'accelerazione hardware in Java:Accelerazione hardware Java
1) In Eclipse versione 3.6.0, con l'aggiornamento Java più recente per Mac OS X (1.6u10 penso), l'accelerazione hardware è abilitata di default? Ho letto da qualche parte che
someCanvas.getGraphicsConfiguration().getBufferCapabilities().isPageFlipping()
si suppone per dare un'indicazione di se o non l'accelerazione hardware è attivata, e miei rapporti di programma indietro vero quando questo viene eseguito sul mio esempio Tela principale per disegnare a. Se la mia accelerazione hardware non è abilitata ora, o per impostazione predefinita, cosa dovrei fare per abilitarlo?
2) Ho visto un paio di articoli qua e là sulla differenza tra un BufferedImage e VolatileImage, dicendo principalmente che VolatileImage è l'immagine accelerata dall'hardware e viene memorizzata in VRAM per operazioni di copia-da veloce. Tuttavia, ho anche trovato alcuni casi in cui si dice che BufferedImage sia anch'esso accelerato dall'hardware. L'hardware BufferedImage è accelerato anche nel mio ambiente? Quale sarebbe il vantaggio dell'utilizzo di VolatileImage se entrambi i tipi sono hardware accelerati? Il mio principale presupposto per il vantaggio di avere un VolatileImage nel caso in cui entrambi abbiano accelerazione è che VolatileImage è in grado di rilevare quando la sua VRAM è stata scaricata. Ma se BufferedImage supporta ora anche l'accelerazione, non avrebbe lo stesso tipo di rilevamento integrato, appena nascosto dall'utente, nel caso in cui la memoria venga scaricata?
3) C'è qualche vantaggio di utilizzare
someGraphicsConfiguration.getCompatibleImage/getCompatibleVolatileImage()
al contrario di
ImageIO.read()
In un tutorial ho letto per alcuni concetti generali sulla configurazione della finestra di rendering correttamente (tutorial) usa il metodo getCompatibleImage, che credo restituisca una BufferedImage, per ottenere le immagini "accelerate dall'hardware" per il disegno veloce, che si lega alla domanda 2 se è accelerata dall'hardware.
4) Questa è una minore accelerazione hardware, ma è qualcosa di cui sono stato curioso: devo ordinare quali elementi grafici vengono disegnati? So che quando si usa OpenGL tramite C/C++ è meglio assicurarsi che lo stesso grafico sia disegnato in tutti i punti in cui deve essere disegnato contemporaneamente per ridurre il numero di volte che la trama corrente deve essere cambiata. Da quello che ho letto, sembra che Java si prenderà cura di questo per me e si assicurerà che le cose vengano disegnate nel modo migliore, ma, ancora una volta, nulla ha mai detto chiaramente nulla del genere.
5) Quali classi AWT/Swing supportano l'accelerazione hardware e quali dovrebbero essere utilizzate? Attualmente sto usando una classe che estende JFrame per creare una finestra e aggiungendo una tela ad essa da cui creo una BufferStrategy. Questa è una buona pratica o c'è qualche altro modo in cui dovrei implementarla?
Grazie mille per il vostro tempo e spero di aver fornito chiare domande e informazioni sufficienti per rispondere alle mie numerose domande.
C'è qualche ragione particolare per cui la maggior parte/tutti gli esempi usano una JFrame per memorizzare la tela? Da quello che ho capito, Swing è piuttosto terribile. Perché non dovresti usare una cornice? Ho un codice che fa proprio questo, e sembra che non sia più difficile creare un JFrame. Inoltre, come viene abilitata l'accelerazione hardware se non è predefinita? – Freezerburn
@FreezerBurn Non so perché molti esempi usano JFrame vs Frame. Immagino che sia fatto con un JFrame perché è quello che è più comunemente conosciuto. Questa è solo una speculazione ma, direi che il rendering manuale in Java con solo un contenitore di primo livello (JFrame, Frame, ecc.) E una tela, c'è poca differenza tra quale si sceglie. Per attivare l'accelerazione del rendering passare questo arg (-Dsun.java2d.opengl = true) all'avvio del programma Java all'avvio del programma o impostarlo prima di utilizzare qualsiasi libreria di rendering. (System.setProperty ("sun.java2d.opengl", "true");) È un parametro facoltativo. – Zixradoom
JFrame è Swing dove Frame/Canvas è AWT. Swing è la nuova libreria di componenti e AWT è la vecchia libreria deprecata. Swing utilizza componenti leggeri dove AWT è componenti nativi. JFrame ha preferito i componenti AWT precedenti. – chubbsondubs