Java Riverning è lento in determinate condizioni
-
22-09-2019 - |
Domanda
Sto facendo una griglia semplice che ogni quadrato è evidenziato dal cursore:
Sono un paio di jpanel, mapgrid e sovrapposizioni all'interno di un jlayeredpane, con MapGrid in fondo. MapGrid si basa solo sull'inizializzazione la griglia, la sua vernice Metodh è:
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
for (int i = 0; i < h; i++) {
for (int j = 0; j < w; j++) {
g2d.setColor(new Color(128, 128, 128, 255));
g2d.drawRect(tileSize * j, i * tileSize, tileSize, tileSize);
}
}
Nell'overlay jpanel è dove si verifica l'evidenziazione, questo è ciò che viene ridipinto quando il mouse viene spostato:
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setColor(new Color(255, 255, 128, 255));
g2d.drawRect((pointerX/tileSize)*tileSize,(pointerY/ tileSize)*tileSize, tileSize, tileSize);
}
Ho notato che anche se lo strato di base (mapgrid) non viene ridipinto quando il mouse si muove, solo il livello di sovrapposizione trasparente, la performance è carente. Se do uno sfondo a Overlay Jpanel, è più veloce. Se rimuovo l'antializzazione di MapGrid, è anche un po 'più veloce.
Non so perché dare uno sfondo allo strato di overlay (e quindi, nascondendo il mapgrid) o disabilitando l'antialias nel mapgrid porta a prestazioni molto migliori.
C'è un modo migliore per farlo? Perché succede?
Soluzione
Questi due post dei blog recenti di 37signals discutono come hanno ottenuto quel "scatto" nel nuovo basecamp:
Come Basecamp potrebbe essere così dannatamente velocemente senza usare molta ui-lato-lato
Altri suggerimenti
Se tutto il tuo mapgrid ha lo stesso colore, tira fuori il setColor dal loop. In questo momento ogni chiamata alla pittura è creare nuovi oggetti a colori.
Per fare ciò che dovresti fare affidamento sulla callback della finestra di dialogo per aprire un'altra finestra di dialogo.
Esempio:
var options = SP.UI.$create_DialogOptions();
options.width = 500;
options.height = 250;
options.url = "/_layouts/MyApplicationPage.aspx";
options.dialogReturnValueCallback = Function.createDelegate(null, modalDialogClosedCallback);
SP.UI.ModalDialog.showModalDialog(options);
function modalDialogClosedCallback(dialogResult, returnValue) {
// Depending on what data you get in your 'result' param
// your logic to open the new dialog goes here.
var options = SP.UI.$create_DialogOptions();
options.width = 500;
options.height = 250;
options.url = dialogResult;
SP.UI.ModalDialog.showModalDialog(options);
}
.
Per assicurarsi che il modalDialogClosedCallback
ottenga i dati necessari per aprire un nuovo modaldialog.Nella pagina dell'applicazione Aggiungi questo ai pulsanti Fare clic su Evento SP.UI.ModalDialog.commonModalDialogClose(dialogResult, returnValue)
.È un metodo che chiuderà il modaldialog e invierà i dati al parametro dialogReturnValueCallback
impostato in options
.
Esempio:
<asp:Button ID="btn" runat="server" OnClick="javascript:SP.UI.ModalDialog.commonModalDialogClose('/_layouts/test.aspx', 'Dialog closed')" Text="Open Test" />
.
Quindi nella propria passione, assicurati che dialogResult
contiene l'URL per la nuova pagina da aprire nel nuovo modaldialog.