remove entities by render bounds - will improve performance, particularly in the case of repeated panning/zooming without letting the download complete
This commit is contained in:
parent
76ca083ad7
commit
6ad6ee56cf
@ -21,22 +21,66 @@ window.Render.prototype.startRenderPass = function(level,bounds) {
|
|||||||
|
|
||||||
this.bounds = bounds;
|
this.bounds = bounds;
|
||||||
|
|
||||||
this.clearPortalsBelowLevel(level);
|
// we pad the bounds used for clearing a litle bit, as entities are sometimes returned outside of their specified tile boundaries
|
||||||
|
// this will just avoid a few entity removals at start of render when they'll just be added again
|
||||||
|
var paddedBounds = bounds.pad(0.1);
|
||||||
|
|
||||||
|
this.clearPortalsBelowLevelOrOutsideBounds(level,paddedBounds);
|
||||||
|
|
||||||
|
this.clearLinksOutsideBounds(paddedBounds);
|
||||||
|
this.clearFieldsOutsideBounds(paddedBounds);
|
||||||
|
|
||||||
|
|
||||||
this.rescalePortalMarkers();
|
this.rescalePortalMarkers();
|
||||||
}
|
}
|
||||||
|
|
||||||
window.Render.prototype.clearPortalsBelowLevel = function(level) {
|
window.Render.prototype.clearPortalsBelowLevelOrOutsideBounds = function(level,bounds) {
|
||||||
var count = 0;
|
var count = 0;
|
||||||
for (var guid in window.portals) {
|
for (var guid in window.portals) {
|
||||||
var p = portals[guid];
|
var p = portals[guid];
|
||||||
// clear portals below specified level - unless it's the selected portal, or it's relevant to artifacts
|
// clear portals below specified level - unless it's the selected portal, or it's relevant to artifacts
|
||||||
if (parseInt(p.options.level) < level && guid !== selectedPortal && !artifact.isInterestingPortal(guid) && !ornaments.isInterestingPortal(p)) {
|
if ((parseInt(p.options.level) < level || !bounds.contains(p.getLatLng())) && guid !== selectedPortal && !artifact.isInterestingPortal(guid)) {
|
||||||
this.deletePortalEntity(guid);
|
this.deletePortalEntity(guid);
|
||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
console.log('Render: deleted '+count+' portals by level');
|
console.log('Render: deleted '+count+' portals by level/bounds');
|
||||||
|
}
|
||||||
|
|
||||||
|
window.Render.prototype.clearLinksOutsideBounds = function(bounds) {
|
||||||
|
var count = 0;
|
||||||
|
for (var guid in window.links) {
|
||||||
|
var l = links[guid];
|
||||||
|
|
||||||
|
// NOTE: our geodesic lines can have lots of intermediate points. the bounds calculation hasn't been optimised for this
|
||||||
|
// so can be particularly slow. a simple bounds check based on start+end point will be good enough for this check
|
||||||
|
var lls = l.getLatLngs();
|
||||||
|
var linkBounds = L.latLngBounds(lls);
|
||||||
|
|
||||||
|
if (!bounds.intersects(linkBounds)) {
|
||||||
|
this.deleteLinkEntity(guid);
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
console.log('Render: deleted '+count+' links by bounds');
|
||||||
|
}
|
||||||
|
|
||||||
|
window.Render.prototype.clearFieldsOutsideBounds = function(bounds) {
|
||||||
|
var count = 0;
|
||||||
|
for (var guid in window.fields) {
|
||||||
|
var f = fields[guid];
|
||||||
|
|
||||||
|
// NOTE: our geodesic polys can have lots of intermediate points. the bounds calculation hasn't been optimised for this
|
||||||
|
// so can be particularly slow. a simple bounds check based on corner points will be good enough for this check
|
||||||
|
var lls = f.getLatLngs();
|
||||||
|
var fieldBounds = L.latLngBounds([lls[0],lls[1]]).extend(lls[2]);
|
||||||
|
|
||||||
|
if (!bounds.intersects(fieldBounds)) {
|
||||||
|
this.deleteFieldEntity(guid);
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
console.log('Render: deleted '+count+' fields by bounds');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -103,6 +147,7 @@ window.Render.prototype.processGameEntities = function(entities) {
|
|||||||
// end a render pass. does any cleaning up required, postponed processing of data, etc. called when the render
|
// end a render pass. does any cleaning up required, postponed processing of data, etc. called when the render
|
||||||
// is considered complete
|
// is considered complete
|
||||||
window.Render.prototype.endRenderPass = function() {
|
window.Render.prototype.endRenderPass = function() {
|
||||||
|
var countp=0,countl=0,countf=0;
|
||||||
|
|
||||||
// check to see if there are any entities we haven't seen. if so, delete them
|
// check to see if there are any entities we haven't seen. if so, delete them
|
||||||
for (var guid in window.portals) {
|
for (var guid in window.portals) {
|
||||||
@ -110,19 +155,24 @@ window.Render.prototype.endRenderPass = function() {
|
|||||||
// artifact (e.g. jarvis shard) portals are also kept - but they're always 'seen'
|
// artifact (e.g. jarvis shard) portals are also kept - but they're always 'seen'
|
||||||
if (!(guid in this.seenPortalsGuid) && guid !== selectedPortal) {
|
if (!(guid in this.seenPortalsGuid) && guid !== selectedPortal) {
|
||||||
this.deletePortalEntity(guid);
|
this.deletePortalEntity(guid);
|
||||||
|
countp++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (var guid in window.links) {
|
for (var guid in window.links) {
|
||||||
if (!(guid in this.seenLinksGuid)) {
|
if (!(guid in this.seenLinksGuid)) {
|
||||||
this.deleteLinkEntity(guid);
|
this.deleteLinkEntity(guid);
|
||||||
|
countl++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (var guid in window.fields) {
|
for (var guid in window.fields) {
|
||||||
if (!(guid in this.seenFieldsGuid)) {
|
if (!(guid in this.seenFieldsGuid)) {
|
||||||
this.deleteFieldEntity(guid);
|
this.deleteFieldEntity(guid);
|
||||||
|
countf++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
console.log('Render: end cleanup: removed '+countp+' portals, '+countl+' links, '+countf+' fields');
|
||||||
|
|
||||||
// reorder portals to be after links/fields
|
// reorder portals to be after links/fields
|
||||||
this.bringPortalsToFront();
|
this.bringPortalsToFront();
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user