Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Antigravity A1: drone futuristico per riprese a 360° in 8K con qualche lacuna da colmare
Antigravity A1: drone futuristico per riprese a 360° in 8K con qualche lacuna da colmare
Abbiamo messo alla prova il drone Antigravity A1 capace di riprese in 8K a 360° che permette un reframe in post-produzione ad eliche ferme. Il concetto è molto valido, permette al pilota di concentrarsi sul volo e le manovre in tutta sicurezza e decidere con tutta tranquillità come gestire le riprese. La qualità dei video, tuttavia, ha bisogno di uno step in più per essere competitiva
Sony Alpha 7 V, anteprima e novità della nuova 30fps, che tende la mano anche ai creator
Sony Alpha 7 V, anteprima e novità della nuova 30fps, che tende la mano anche ai creator
Dopo oltre 4 anni si rinnova la serie Sony Alpha 7 con la quinta generazione, che porta in dote veramente tante novità a partire dai 30fps e dal nuovo sensore partially stacked da 33Mpixel. L'abbiamo provata per un breve periodo, ecco come è andata dopo averla messa alle strette.
realme GT 8 Pro Dream Edition: prestazioni da flagship e anima racing da F1
realme GT 8 Pro Dream Edition: prestazioni da flagship e anima racing da F1
realme e Aston Martin Aramco F1 Team si sono (ri)unite dando alla vita un flagship con chip Snapdragon 8 Elite Gen 5 e design esclusivo ispirato alle monoposto di Formula 1. La Dream Edition introduce la nuova colorazione Lime Essence abbinata al tradizionale Aston Martin Racing Green, decorazioni intercambiabili personalizzate e una confezione a tema F1, intorno a uno smartphone dall'ottima dotazione tecnica con batteria da 7000mAh ricaricabile a 120W e isola fotografica intercambiabile
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 24-08-2007, 19:54   #1
redcloud
Bannato
 
L'Avatar di redcloud
 
Iscritto dal: Feb 2003
Città: Anche Chuck Norris usa Debian e Gnome
Messaggi: 1270
[JAVA] custom JTable cellRender lento: come velocizzare?

Ho la necessità di cambiare dei colori all'interno di una cella di una JTable. Seguendo qualche thread ho capito che bisogna estendere la classe DefaultTableCellRenderer. Ne ho creata una mia e ho sovrascritto il metodo getTableCellRendererComponent...

Codice:
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
	Border border;

	super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
		
	if(true) {
               //QUALCOSA DI NON COMPLESSO CHE MODIFICA BORDER
	}
	this.setBorder(border);
		
	super.setVerticalAlignment(SwingConstants.TOP);
		
	return this;
}
e poi questo renderer lo uso così

Codice:
table.getColumnModel().getColumn(z).setCellRenderer(new TableColorRenderer());
Funziona egregiamente, peccato però che mi rallenta in modo spropositato la visualizzazione della tabella. Utilizzando il renderer di default, la tabella viene visualizzata in un attimo, con il mio renderer invece i tempi triplicano, quadruplicano! Ho provato a lasciare vuoto il metodo getTableCellRendererComponent

Codice:
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
	super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
		
	return this;
}
ma i tempi sono gli stessi! Vorrei capire se ciò è dovuto a qualche mio errore fatto in questo tipo di costrutto oppure non è questo il modo di creare un renderer custom. Molte grazie!
redcloud è offline   Rispondi citando il messaggio o parte di esso
Old 24-08-2007, 20:09   #2
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
Io non mi sono mai messo a bestemmiare con i cell renderer qdi mi sa che devi aspettare il buon vecchio ( ) PGI...
Però puoi provare ad attivare la pipeline directx e vedere se hai qualke miglioramento...
l'opzione che devi passare alla VM è la seguente:
-Dsun.java2d.d3d=true
però non mi ricordo se è stata introdotta in java 6 o era presenta anche nella 5
vabbè.. prova lo stesso che tanto ci metti 3 secondi netti
__________________
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso
Old 24-08-2007, 20:24   #3
redcloud
Bannato
 
L'Avatar di redcloud
 
Iscritto dal: Feb 2003
Città: Anche Chuck Norris usa Debian e Gnome
Messaggi: 1270
Quote:
Originariamente inviato da ^TiGeRShArK^ Guarda i messaggi
Io non mi sono mai messo a bestemmiare con i cell renderer qdi mi sa che devi aspettare il buon vecchio ( ) PGI...
Però puoi provare ad attivare la pipeline directx e vedere se hai qualke miglioramento...
l'opzione che devi passare alla VM è la seguente:
-Dsun.java2d.d3d=true
però non mi ricordo se è stata introdotta in java 6 o era presenta anche nella 5
vabbè.. prova lo stesso che tanto ci metti 3 secondi netti
Grazie ma non c'entra questo (purtroppo!). Ho trovato questo articolo interessante ma non ho ancora capito come risolvere.

http://java.sun.com/docs/books/perfo...Models.fm.html
redcloud è offline   Rispondi citando il messaggio o parte di esso
Old 24-08-2007, 21:04   #4
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Quell'articolo tratta dell'ovvio.

La cosa bizzarra nel tuo codice è:

super.getTableCell eccetera
return this;

dovrebbe essere:

return super.getTableCellRendererComponent(eccetera)

Ma se questo è la causa del problema mi taglio i baffi. La classe è tutta lì?
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 25-08-2007, 01:06   #5
redcloud
Bannato
 
L'Avatar di redcloud
 
Iscritto dal: Feb 2003
Città: Anche Chuck Norris usa Debian e Gnome
Messaggi: 1270
Quote:
Originariamente inviato da PGI-Bis Guarda i messaggi
Quell'articolo tratta dell'ovvio.

La cosa bizzarra nel tuo codice è:

super.getTableCell eccetera
return this;

dovrebbe essere:

return super.getTableCellRendererComponent(eccetera)

Ma se questo è la causa del problema mi taglio i baffi. La classe è tutta lì?
Si è tutta lì, quello è l'unico metodo sovraccaricato. Anche io credevo di dover fare return super.getTable.... ma così facendo le modifiche non hanno effetto e in più, le performance sono improponibili ugualmente! Insomma, basta sovraccaricare quel metodo e le performance degradano paurosamente... mi tocca andare a vedere com'è il sorgente del default renderer?
redcloud è offline   Rispondi citando il messaggio o parte di esso
Old 25-08-2007, 01:11   #6
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Hai provato a "lascia scorrere" l'applicazione? Forse devi solo aspettare che il JIT la mastichi per bene.

Il fatto è che un semplice overload non può essere causa di per sè di un aggravio percepibile. E Swing è tutto Java, non ci sono "punti magici" o che altro. Magari è un bug di Swing o è la scheda video. Hai i driver aggiornati?
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 25-08-2007, 01:21   #7
redcloud
Bannato
 
L'Avatar di redcloud
 
Iscritto dal: Feb 2003
Città: Anche Chuck Norris usa Debian e Gnome
Messaggi: 1270
Ho provato a sovraccaricare il metodo così:

Codice:
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
      return super.getTableCellRendererComponent(table, value,
                                                 isSelected,
                                                 hasFocus,
                                                 row, column);
}
4 secondi per visualizzare la JTable! Se invece lascio il default renderer, impiega meno di mezzo secondo...


Con questo codice invece i tempi sono gli stessi del renderer di default
Codice:
public class FastStringRenderer extends DefaultTableCellRenderer {

   Component stubRenderer = new NothingComponent();

   public Component getTableCellRendererComponent(JTable table,
                                                  Object value,
                                                  boolean isSelected,
                                                  boolean hasFocus,
                                                  int row, 
                                                  int column) {

      return super.getTableCellRendererComponent(table, value,
                                                 isSelected,
                                                 hasFocus,
                                                 row, column);
   }

   class NothingComponent extends JComponent {
      public void paint(Graphics g) {
         // Do Nothing
      }
   }
}
preso da http://java.sun.com/docs/books/perfo...m.html#1009068

Ultima modifica di redcloud : 25-08-2007 alle 01:33.
redcloud è offline   Rispondi citando il messaggio o parte di esso
Old 25-08-2007, 01:29   #8
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Porta il tuo PC dall'esorcista perchè quelle due cose sono fisicamente identiche.

Anche tu estendi DefaultTableCellRenderer, no?
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 25-08-2007, 01:31   #9
redcloud
Bannato
 
L'Avatar di redcloud
 
Iscritto dal: Feb 2003
Città: Anche Chuck Norris usa Debian e Gnome
Messaggi: 1270
Scusa ho modificato il codice. Ora il senso dovrebbe essere giusto.

Codice:
public class FastStringRenderer extends DefaultTableCellRenderer {

   Component stubRenderer = new NothingComponent();

   public Component getTableCellRendererComponent(JTable table,
                                                  Object value,
                                                  boolean isSelected,
                                                  boolean hasFocus,
                                                  int row, 
                                                  int column) {

      return stubRenderer;
   }

   class NothingComponent extends JComponent {
      public void paint(Graphics g) {
         // Do Nothing
      }
   }
}
Quote:
Originariamente inviato da PGI-Bis Guarda i messaggi
Anche tu estendi DefaultTableCellRenderer, no?
Si certo.

Ultima modifica di redcloud : 25-08-2007 alle 01:43.
redcloud è offline   Rispondi citando il messaggio o parte di esso
Old 25-08-2007, 01:48   #10
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Calma e gesso. Ma tu fai una comparazione della rapidità tra una tabella vuota e una con tutti i disegnini o tra due tabelle uguali?

Lo chiedo perchè la rapidità del renderer standard sta tutta nel fatto che il renderer standard... non fa un cacchio. Disegna una stringa, bella forza, così son buoni tutti. E' chiaro che più disegni e più è "pesante" l'esecuzione rispetto alla versione che quei disegni non li fa.

Detto questo, il limite di carico è piuttosto alto, nel senso che, per com'è fatto il meccanismo, puoi sbizzarrirti artisticamente. Esattamente il tuo renderer com'è fatto?
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 25-08-2007, 02:02   #11
redcloud
Bannato
 
L'Avatar di redcloud
 
Iscritto dal: Feb 2003
Città: Anche Chuck Norris usa Debian e Gnome
Messaggi: 1270
E' proprio questo il punto! Se alla JTable lascio il DefaultTableCellRenderer, i tempi sono veloci. Se invece assegno il mio renderer, per visualizzare una stessa tabella (cioè gli stessi dati, i colori ovviamente il renderer di default non li gestisce, e si tratta solo di mettere un bordo sul 2% delle 30000 celle totali) impega 4 secondi.

Il renderer sovraccaricato più efficiente possibile è questo (credo, è stato ideato per rendere ancora più efficiente quello di default)
Codice:
public class FastStringRenderer extends DefaultTableCellRenderer {

   Component stubRenderer = new NothingComponent();

   public Component getTableCellRendererComponent(JTable table,
                                                  Object value,
                                                  boolean isSelected,
                                                  boolean hasFocus,
                                                  int row, 
                                                  int column) {

      if ( ((String)value).length() == 0 && 
           !isSelected && !has-Focus) {
         return stubRenderer;
      }

      return super.getTableCellRendererComponent(table, value,
                                                 isSelected,
                                                 hasFocus,
                                                 row, column);
   }

   class NothingComponent extends JComponent {
      public void paint(Graphics g) {
         // Do Nothing
      }
   }
}
Questo è il sorgente di DefaultTableCellRenderer
Codice:
public Component getTableCellRendererComponent(JTable table, Object value,
                          boolean isSelected, boolean hasFocus, int row, int column) {

	if (isSelected) {
	   super.setForeground(table.getSelectionForeground());
	   super.setBackground(table.getSelectionBackground());
	}
	else {
	    super.setForeground((unselectedForeground != null) ? unselectedForeground 
	                                                       : table.getForeground());
	    super.setBackground((unselectedBackground != null) ? unselectedBackground 
	                                                       : table.getBackground());
	}
	
	setFont(table.getFont());

	if (hasFocus) {
            Border border = null;
            if (isSelected) {
                border = UIManager.getBorder("Table.focusSelectedCellHighlightBorder");
            }
            if (border == null) {
                border = UIManager.getBorder("Table.focusCellHighlightBorder");
            }
            setBorder(border);

	    if (!isSelected && table.isCellEditable(row, column)) {
                Color col;
                col = UIManager.getColor("Table.focusCellForeground");
                if (col != null) {
                    super.setForeground(col);
                }
                col = UIManager.getColor("Table.focusCellBackground");
                if (col != null) {
                    super.setBackground(col);
                }
	    }
	} else {
            setBorder(getNoFocusBorder());
	}

        setValue(value); 

	return this;
    }

Se uso quello di default, problemi non ce ne sono. Se uso quello efficiente impiega 4 secondi contro pochi decimi! Quindi l'errore non è nel codice del renderer. Forse sbaglio a settare il renderer? Io lo setto così:

Codice:
JTable table = new JTable();

table.getColumnModel().getColumn(0).setCellRenderer(new FastStringRenderer());
redcloud è offline   Rispondi citando il messaggio o parte di esso
Old 25-08-2007, 02:27   #12
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Lascia stare quello che scrivono gli altri, anche se lo scrivono su Sun. Su Sun hanno scritto di quelle pacchianate che non hai idea. Non so se ricordi la bufala "Java è un mix di passaggio per riferimento e per valore", be' era scritta sul sito di Sun e su un manuale rilasciato da Sun.

Tu cosa hai scritto. Com'è fatta la tua classe, per intero con annessi e connessi. Funziona? Benissimo, sei al 99% del risultato. Forse all'interno di quella classe c'è un calcolo che sembra innocuo ma ripetuto su mila celle genera un ritardo apprezzabile. Si può precomputare il risultato? Vediamo la classe. Non avere alcun timore, io ho studiato legge per cui sono l'essere informaticamente meno autorevole a cui si possa pensare. Tutto posso fare tranne criticare il codice altrui.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 25-08-2007, 02:35   #13
redcloud
Bannato
 
L'Avatar di redcloud
 
Iscritto dal: Feb 2003
Città: Anche Chuck Norris usa Debian e Gnome
Messaggi: 1270
Porca trota! Il problema è nell'assegnazione del renderer. Non mi ero accorto che lo facevo per ogni riga della tabella! Invece bisogna farlo una sola volta per ogni colonna, indipendentemente dal numero di righe! Che pirlaz! Grazie per il supporto morale notturno ++Birra per te
redcloud è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Antigravity A1: drone futuristico per riprese a 360° in 8K con qualche lacuna da colmare Antigravity A1: drone futuristico per riprese a ...
Sony Alpha 7 V, anteprima e novità della nuova 30fps, che tende la mano anche ai creator Sony Alpha 7 V, anteprima e novità della ...
realme GT 8 Pro Dream Edition: prestazioni da flagship e anima racing da F1 realme GT 8 Pro Dream Edition: prestazioni da fl...
OVHcloud Summit 2025: le novità del cloud europeo tra sovranità, IA e quantum OVHcloud Summit 2025: le novità del cloud...
Un mostro da MSI: QD-OLED WQHD a 500 Hz con AI Care e DisplayPort 2.1a Un mostro da MSI: QD-OLED WQHD a 500 Hz con AI C...
Linus Torvalds durissimo su Elon Musk: '...
Il sogno del metaverso crolla? Zuckerber...
Axiom Space ha completato un importante ...
Gli aeroplani Airbus utilizzeranno i sat...
Una nuova immagine della cometa interste...
'La soluzione a un problema che non esis...
Radeon RX 9000 sì, Ryzen 9000 no:...
Amazon versa 180 milioni al Fisco e canc...
Meta, il Board di Supervisione guarda o...
DJI rivoluziona le consegne aeree: il nu...
Fibercop e Microsoft Italia uniscono per...
App Store Award 2025: scarica le 17 app ...
NVIDIA fa marcia indietro, il supporto P...
Addio definitivo alla GeForce GTX 1080: ...
Numeri record per gli iPhone 17: Apple s...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 05:54.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v