|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Apr 2007
Messaggi: 263
|
[C#] Proverbiale lentezza di GDI+
Salve a tutti,
sto scrivendo un Tilemap-editor e questo é il codice che uso per renderizzare la mappa: Codice:
void pnlCenter_Paint(object sender, PaintEventArgs e)
{
System.Drawing.Graphics g = e.Graphics;
if (map != null)
{
for (int y = 0; y < map.TilesY; y++)
{
for (int x = 0; x < map.TilesX; x++)
{
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor;
g.DrawImage(map.Image, new Rectangle(x * map.Tileset.TileWidth, y * map.Tileset.TileHeight, map.Tileset.TileWidth, map.Tileset.TileHeight), new Rectangle(x * map.Tileset.TileWidth, y * map.Tileset.TileHeight, map.Tileset.TileWidth, map.Tileset.TileHeight), GraphicsUnit.Pixel);
}
}
}
}
La visualizzazione é estremamente lenta. Circa 10sec per una finestra 200x200 Qualcuno mi puó suggerire un modo migliore... |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Questo è fatto in C# e non presenta i problemi che hai tu: dagli un'occhiata.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Feb 2006
Messaggi: 1304
|
Hmm.. come mai renderizzi ogni volta TUTTI i tile? lo credo bene che è lento, sono più di 16 milioni
![]() Dovresti fare un check per trovare solamente l'area visibile, in modo da disegnare solo i tiles visibili... sarebbe già un bel passo avanti. Un'altra cosa che dovrebbe migliorare le prestazioni è usare una specie di "stencil buffer" per usare solo "num tipi" istruzioni di disegno: nel ciclo, invece di disegnare, salvi in una matrice grande come la visuale dove un certo tipo è visibile, usando semplici float (che puoi anche usare per blendare più tipi Quindi, copri la visuale delle tiles di un certo tipo con un solo full screen rectangle (leggasi una sola chiamata di disegno), e rendi trasparenti le tiles di troppo usando la matrice. Cmq mai usato il C#, ma dovrebbe essere più o meno tutto fattibile |
|
|
|
|
|
#4 |
|
Member
Iscritto dal: Apr 2007
Messaggi: 263
|
Innanzitutto grazie per le risposte!!!
Ora invece di una immagine molto grande ho provvisto ogni elemento del Tileset di una sua piccola immagine e ho quindi riscritto la funzione per disegnare: Codice:
for (int y = 0; y < map.TilesY; y++)
{
for (int x = 0; x < map.TilesX; x++)
{
RectangleF rc = new RectangleF(x * map.TileWidth - scrollX, y * map.TileHeight - scrollY, map.TileWidth, map.TileHeight);
if (rc.IntersectsWith(g.ClipBounds))
{
g.DrawImage(map[x, y].Image, x * map.TileWidth - scrollX, y * map.TileHeight - scrollY);
}
}
}
P.S. Cosa strana che ho notato é che questo codice: Codice:
for (int tx = 0; tx < tileWidth; tx++)
{
for (int ty = 0; ty < tileHeight; ty++)
{
((Bitmap)ti.Image).SetPixel(tx, ty, bmp.GetPixel(x * tileWidth + tx, y * tileHeight + ty));
}
}
Ultima modifica di stdecden : 04-09-2008 alle 22:11. |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 06:49.




















