also bist du der meinung, ich soll weniger daten beim Request mitverschicken
Vielleicht hab ich mich hier etwas schlecht ausgedrückt....du brauchst nicht weniger Daten senden - die Übertragung der Daten zum Server und zurück dauert derzeit jeweils 0ms. Da hast du also noch Luft. Wie Todi schon meinte, musst du verschiedene Messpunkte setzen. Wielange dauert die Verarbeitung auf Server, von dem Zeitpunkt wo der Request eintrifft, bis der Response abgesendet wird. Wie lange dauern die einzelnen Methoden.
Schleifen
Bei den Schleifen - nimm alle Schleifeninvarianten (Werte die sich bei den Durchläufen nicht ändern) raus.
Beispiele:
(tileHeight/2)
Das berechnest du in jedem Schleifendurchlauf mehrfach. Einmal vor dem Durchlauf berechnen und dann immer wieder benutzen. Jeder unnötige, zeitaufwändige Befehl potentiert sich innerhalb der Schleifen.
Unnötige DOM Zugriffe / jQuery
$('#Y'+y+'X'+x).attr('name','visible');
Natürlich hast du Performanceverluste, wenn du jQuery einsetzt. Ein einfaches document.getElementById ist schneller. Den Selektorstring muss jQuery natürlich erst parsen um dann selber document.getElementById zu machen. Allerdings sollte das erst die allerletze Maßnahme sein. Viel wichtiger an diesem Beispiel ist die Tatsache, dass du das Element 2 Zeilen vorher erzeugst, hier also unnötige DOM Zugriffe hast. Warum schreibst du an der Stelle nicht gleich das Namensattribut mit rein?
DOM Manipulation
Noch eine Sache, die ich sonst als Regel kenne ist, dass du Veränderungen am DOM minimieren sollstest. Derzeit wir immer wenn ein Div-Element erstellt wird. Dieses sofort in den DOM gehängt bzw. du appendest dieses in deine komplette Karte. Ich kann mir vorstellen, dass dein innerHTML der Karte relativ lang ist und du führst sehr viele Stringverkettungen aus. Ich bin nicht 100% sicher, aber ich vermute, dass hier der String im Speicher sehr viel umkopiert werden muss. Verwende besser ein DocumentFragment, dem du alle DIV Elemente anhängst und dass du am Ende in den DOM hängst. Das DocumentFragement hat die angenehme Eigenschaft sich beim appenden in den DOM selbst aufzulösen und es werden nur die Children eingehängt.
Styling der Elemente
Beim Styling der Elemente habe ich mich ein wenig gewundert, da du ja ein Player CSS hast. Du setzt einzelne Attribute des Styles um die Elemente in die richtige Breite, Höhe und mit Hintergrung zu versehen. Spricht etwas dagegen einfach nur "grasTile" als CSS Klasse anzulegen. Übrigens würde es reichen diese Klasse per JSON zu übertragen, anstatt die lange URL zum Bild. Du sparst Datenvolumen und vereinfachst die Verarbeitung in JS. Dann brauchst du nur noch die Positionierung vorzunehmen.
Reihenfolge der Aufrufe
Wenn ich es richtig gesehen habe, dann erzeugst du zunächst die Div-Elemente und führst dann den Ajax aus? Evtl. kannst du auch erst den Ajax abschicken und während dieser läuft die Teile erzeugen. Hier ist dann ein wenig Fingerspitzengefühl gefragt, wie es läuft, wenn der Ajax vorher zurück ist.
Erhöhung der wahrgenommenen Performance
Als kleinen Trick könntest du die Ajax Anfrage bereits auf das MouseDown Event legen und nicht erst den kompletten Klick abwarten. Sobald der User klickt, wir der Ajaxrequest geschickt.
Anderes Konzept zum nachdenken
Nochmal ein kleiner Gedankenanstoß für das gesamte Konzept. Warum hälst du alle Positionsdaten per ID im DOM Baum an den Elementen? Du könnstest dir auch in Javascript ein Object/Array mit allen HTML Referenzen und Positionen halten. Du hälst nur eine feste Anzahl, die den Bildschirm komplett ausfüllt (+etwas Puffer). Divs die den sichtbaren Bereich verlassen, werden nicht gelöscht, sondern du schaltest sie unsichtbar, weißt Ihnen neue Styles zu und positionierst sie neu. Du erstellst initial die benötigte Menge, brauchst keine neu erzeugen und keine löschen, keine Selektoroperationen im DOM mehr nötig.