मुझे पता है कि शीर्षक व्याख्यात्मक नहीं है, लेकिन यहां कहानी है: मैं एक ब्राउज़र गेम विकसित कर रहा हूं, ज्यादातर जावास्क्रिप्ट और मैपबॉक्स लाइब्रेरी का उपयोग कर रहा हूं।
डेस्कटॉप, एंड्रॉइड और आईओएस पर सबकुछ अच्छी तरह से काम करता है, लेकिन एक समस्या आईओएस पर दिखाई देती है: गेम को कुछ मिनटों तक चलने देने के बाद अचानक फोन में ग्राफिक कलाकृतियां शुरू हो जाती हैं और अधिकांश टेक्स्ट स्क्रैम्बल हो जाते हैं।
यहाँ क्या फोन शुरू होता है की कुछ तस्वीरें देख रहे हैं:
मेरा प्रश्न है: क्या वास्तव में मेरे कोड में यह कारण हो सकता है? एक स्मृति रिसाव? ( ले : यह वास्तव में एक स्मृति रिसाव हो गया है)
असली सवाल यह है: कैसे आता है कि आप लगभग एक वेब पेज ब्राउज़ करके पूरे फोन को ईंट कर सकते हैं? क्या सफारी को यह नहीं रोकना चाहिए, या कम से कम आईओएस?
यह इस विशिष्ट डिवाइस के साथ कोई समस्या नहीं है, क्योंकि यह समस्या विभिन्न iPhone उपकरणों पर पुन: पेश की जा सकती है। (मैं विभिन्न iOS संस्करणों के बारे में निश्चित नहीं हूं)।
मैं त्रुटि को कैसे पुन : पेश कर सकता हूं :
- खेल खोलें (सफारी के अंदर)।
- इसे 3-4 मिनट तक चलने दें।
- नोटिफिकेशन सेंटर को स्लाइड करें और सब कुछ पागल हो जाता है।
मैंने एक YouTube वीडियो जोड़ा है जिसमें दिखाया गया है कि कैसे मैं अपने iPhone 5C पर त्रुटि को पुन: उत्पन्न कर सकता हूं।
ऐसा लगता है कि समस्या पहले अधिसूचना केंद्र में दिखाई देती है (यदि आप ऊपर से मेनू को नीचे स्वाइप करते हैं)।
अभी तक, यह समस्या केवलiPhone 5C
iOS 9.2.1 (13D15) पर होती है। यह नए iOS 9.3 वर्जन पर भी होता है।
इस समस्या को ठीक करने के लिए मुझे निम्न करना होगा:
- सफ़ारी एप्लिकेशन बंद करें (जिसमें गेम टैब खुला है)।
- फोन को लॉक करें। इसे अनलॉक करने के बाद सब कुछ वापस सामान्य हो जाता है।
खेल के बारे में कुछ विवरण :
- खेल एक नक्शा बॉक्स नक्शा और उस पर कुछ इकाइयों (मार्कर) से पता चलता है।
- Node.js सर्वर 1 टिक / सेकेंड पर चलता है और प्रत्येक टिक के बाद अपडेटेड गेम स्टेट को Socket.io के माध्यम से ब्राउज़र को भेजा जाता है।
- हर बार जब ब्राउज़र गेम स्टेट प्राप्त करता है तो वह उसी के अनुसार मार्करों को अपडेट करता है।
- * यदि आप ज़ूम इन या आउट करते हैं या आप उनका चयन करते हैं तो गेम मार्कर को भी अपडेट कर सकता है।
EDIT2:
मेमोरी लीक मिला (उम्मीद के मुताबिक)। इस रिसाव को ठीक करने के बाद ( undefined
_icon के लिए जाँचें) समस्या अब नहीं होती है। इसका मतलब है, कि कहीं न कहीं उन लाइनों के साथ सफारी / आईओएस बग ट्रिगर हो गया है।
यहाँ वही है जो वास्तव में प्रत्येक टिक को कहा जा रहा था, प्रत्येक इकाई के लिए जिसे क्लस्टर किया गया था (एक मार्कर क्लीयर के अंदर छिपा हुआ था और दूसरों के साथ समूहीकृत किया गया था):
var $icon = $(marker._icon); // marker._icon is undefined because of the clustering
$icon.html('');
$icon.append($('<img class="markerIcon" src="' + options.iconUrl + '" />'));
var iconX = 10;
var iconY = -10;
var iconOffset = 0;
for(var v in this.icons) {
this.icons[v].css('z-index', + $icon.css('z-index') + 1);
this.icons[v].css('transform', 'translate3d(' + iconX + 'px,'
+ (iconY + iconOffset) + 'px,' + '0px)');
iconOffset += 20;
this.icons[v].appendTo($icon);
}
// Fire rate icons
this.attackRateCircle = $('<div class="circle"></div>');
this.attackRateCircle.circleProgress({
value: 0,
size: 16,
fill: { color: "#b5deff" },
emptyFill: 'rgba(0, 0, 0, 0.5)',
startAngle: -Math.PI / 2,
thickness: 4,
animation: false,
});
this.attackRateCircle.hide();
// Create and display the healthbar
this.healthBar = $('<div>').addClass('healthBar ');
this.healthBar.css('z-index', $icon.css('z-index'));
this.healthBarFill = $('<span class="fill">');
this.healthBar.append(this.healthBarFill);
$icon.append(this.healthBar);
$icon.append(this.attackRateCircle);
और यह icons
सरणी है:
this.icons = {
attack_order: $('<img src="img/attack.png" class="status_icon">'),
attack: $('<img src="img/damage.png" class="status_icon icon_damage">'),
hit: $('<img src="img/hit.png" class="status_icon icon_hit">'),
};
circleProgress
कॉल इस लाइब्रेरी से है: https://github.com/kottenator/jquery-circle-progress
डेमो
हाँ, मैं एक jsFiddle बनाने में सक्षम है जो बग को पुन: पेश करता है: https://jsfiddle.net/cte55cz7/14/ iPhone 5C पर सफारी पर खोलें और कुछ मिनटों तक प्रतीक्षा करें। IPhone 6 और iPad मिनी पेज क्रैश (स्मृति रिसाव के कारण अपेक्षित)
यहां HasteBin में वही कोड है, जो कोई भी इसे चलाना नहीं चाहता है।
SuperUser
। मुझे उम्मीद है कि इस सवाल को पूछने के लिए यह सही जगह है।