Die GD implentation ist Speicherintensiv und CPUfressend, gerade was so Riesenbilder angeht. Bei einer gut besuchten Seite wird der Server gut zu arbeiten haben.
Soll dies nun in einem Browsergame passieren und viele User klicken öfters auf diese Karte wird dies der Overkill.
Ich würde die erste Antwort (die übrigens nach 2 Stunden kam) beherzigen und das Problem mit gutem CSS und HTML lösen. Für das Klicken auf einen der 5x5x px Quadranten noch JavaScript mit ins Boot holen.
Desweiteren ist bei so einer grösse auch die Ladezeit und der Traffic nicht zu verachten.
Bsp:
http://upload.wikimedia.org/wikiped...rld_map_with_oceans_marked_in_blue-edited.png
Die Karte ist relativ nackt und hat eine Dateigrösse von ca 125kb. Mit mehr Farben und Details könnte es gut an die 200kb gehen. Bei 1000 Aufrufen pro Tag ist man da schon bei 200MB, im Monat 6Gbyte.
Die theorethischen Ladezeiten halten sich zwar in Grenzen (DSL 6000 deutlich weniger als 500ms), aber der Browser muss es auch rendern, ergo > 1sec wartezeit + die Bearbeitungszeit durch PHP für das Bild.
Dann zur Benutzerfreundlichkeit:
Bei einer Standardauflösung von 1024*768 ist der Scrollaufwand enorm. Willst du das dem User antun?
Ich würde dir raten deine logisch 3000x3000 Karte in bsp. 500x500px kleine Areas zu schneiden. Und wenn der Benutzer eine Area nach "rechts" will, dann kann er auf einen Pfeil klicken und die Seite relaoded (oder ganz modern per Ajax).
Die Positionierung der Grafiken würde ich per CSS lösen, das spart dem Server eine Menge arbeit (nur 2-3 einfache mathematische Formeln für die Position des Bildes in der Area).
Wenn du denn noch diese Riesenkarte mit GD direkt bearbeiten willst, dann führe erstmal ein paar Benchmark Tests durch um zu sehen, wie sich die Geschwindigkeit und Serverauslastung bei einer gewissen Load verhält.
Ich hab hier mal eben ein Test gemacht für Imagecopymerge gemacht (source von einem Usercomment auf php.net etwas modifiziert)
PHP:
<?php
function cust_memory_get_usage()
{
$pid = getmypid();
exec("ps -o rss -p $pid", $output);
return $output[1] *1024;
}
function waterMark($fileInHD, $wmFile, $transparency = 50, $jpegQuality = 90, $margin = 5) {
$wmImg = imageCreateFromJPEG($wmFile);
$jpegImg = imageCreateFromJPEG($fileInHD);
for($i = 0; $i <4; $i++) {
$wmX = (bool)rand(0,1) ? $margin : (imageSX($jpegImg) - imageSX($wmImg)) - $margin;
$wmY = (bool)rand(0,1) ? $margin : (imageSY($jpegImg) - imageSY($wmImg)) - $margin;
// Water mark process
imageCopyMerge($jpegImg, $wmImg, $wmX, $wmY, 0, 0, imageSX($wmImg), imageSY($wmImg), $transparency);
}
imagejpeg($jpegImg, $fileInHD, $jpegQuality);
}
echo "Start Script: Time:\t".microtime(TRUE)."\t\t Mem: ".cust_memory_get_usage()."\n";
waterMark('myImage.jpg','watarmark.jpg');
echo "End Script: Time:\t".microtime(TRUE)."\t\t Mem: ".cust_memory_get_usage()."\n";
?>
Ergebnis:
Start Script: Time: 1205082262.15 Mem: 8339456
End Script: Time: 1205082263.07 Mem: 8732672
Habs in der commandline ausgeführt, sodass da kein Browserrender oder grosses Datenübertragung im Netzwerk passieren muss.
Ergebnis ist ca 1sek ausführungszeit, bei 4 gesetzen Watermarks (50x50px).
Hoffe das reicht dir als Antwort. Der Rest ist in den Manuals unter
http://www.php.net/gd nachzulesen.
Edit:
Achja. fast vergessen. Das von PHP geschriebene JPEG ist knapp 950kb gross geworden. Weiss nicht, ob man an der Kompression spielen kann.