मैं थोड़ा HTML5 गेम कर रहा हूं और, मानचित्र की शुरुआत में अपने sprites लोड करते समय, मैं सभी छवियों पर GetImageData()/looping के साथ कुछ प्रसंस्करण करता हूं/PutImageData()।मोबाइल पर भयानक कैनवास GetImageData()/PutImageData() प्रदर्शन
यह मेरे पीसी पर शानदार रूप से बढ़िया काम करता है, हालांकि, मेरे सेल फोन पर यह बेहद धीमी है।
PC: 5-6 ms
iPhone 4: 300-600 ms
Android HTC Desire S: 2500-3000 ms
मैं कुछ बहुत ही बुनियादी बेंच मार्किंग कर रहा हूँ, और दोनों GetImageData और PutImageData बहुत तेजी से चलाने के लिए, क्या समय लग रहा है सामग्री के माध्यम से पाशन है।
अब, स्पष्ट रूप से फोन पर मंदी की उम्मीद है, लेकिन 1000x थोड़ा अधिक लगता है, और लोडिंग में मेरे एचटीसी पर लगभग 4 मिनट लगते हैं, इसलिए यह काम नहीं करेगा। इसके अलावा, इस खेल में सब कुछ बहुत ही उचित गति से काम करता है (जिसका मुख्य कारण स्क्रीन हास्यास्पद छोटा होता है, लेकिन फिर भी यह एक सेल फोन पर जे एस के लिए आश्चर्यजनक रूप से ठीक काम करता है)
क्या मैं इस प्रक्रिया में कर रहा हूँ एक निश्चित स्तर पर स्प्राइट मूल रूप से "अंधेरा" होता है। मैं बस सभी पिक्सल के माध्यम से लूप, और एक मूल्य < द्वारा गुणा करें 1. यह सब कुछ है।
चूंकि यह बहुत धीमा है ... क्या कैनवास कार्यक्षमता, (कंपोजिटिंग, अस्पष्टता, जो कुछ भी) का उपयोग करके, एक ही चीज़ को करने के लिए एक बेहतर तरीका है, बिना किसी पिक्सल के लूपिंग के?
नोट: इस परत में कुछ 100% पारदर्शी पिक्सल हैं, और कुछ 100% अपारदर्शी पिक्सल हैं। दोनों को 100% अपारदर्शी या 100% पारदर्शी रहने की आवश्यकता है।
चीजें मुझे लगता है कि के बारे में सोचा गया है काम नहीं होगा:
1), एक नया कैनवास में स्प्राइट चित्रकारी कम अस्पष्टता के साथ। यह काम नहीं करेगा क्योंकि मुझे अपारदर्शी रहने के लिए sprites की जरूरत है, बस गहरा।
2) sprites चित्रकारी, और उनके ऊपर एक अर्द्ध पारदर्शी काले rect चित्रकारी। यह उन्हें गहरा कर देगा, लेकिन यह मेरे पारदर्शी पिक्सल को पारदर्शी नहीं बनाएगा ...
कोई विचार?
इस कोड मैं का उपयोग कर रहा है, अगर आप इसे में कुछ बहुत मूर्खतापूर्ण देखें:
function DarkenCanvas(baseImage, ratio) {
var tmpCanvas = document.createElement("canvas");
tmpCanvas.width = baseImage.width;
tmpCanvas.height = baseImage.height;
var ctx = tmpCanvas.getContext("2d");
ctx.drawImage(baseImage, 0, 0);
var pixelData = ctx.getImageData(0, 0, tmpCanvas.width, tmpCanvas.height);
var length = pixelData.data.length;
for (var i = 0; i < length; i+= 4) {
pixelData.data[i] = pixelData.data[i] * ratio;
pixelData.data[i + 1] = pixelData.data[i + 1] * ratio;
pixelData.data[i + 2] = pixelData.data[i + 2] * ratio;
}
ctx.putImageData(pixelData, 0, 0);
return tmpCanvas
}
संपादित करें: यह क्या मैं छवि के साथ क्या करने की कोशिश कर रहा हूँ का एक उदाहरण है :
मूल: http://www.crystalgears.com/isoengine/sprites-ground.png
अन्धेरा: http://www.crystalgears.com/isoengine/sprites-ground_darkened.png
धन्यवाद!
डैनियल
कृपया हमें जिस प्रभाव को प्राप्त करने का प्रयास कर रहे हैं उसकी तस्वीरों के पहले और बाद में हमें दिखाएं? –
बस प्रश्न के नीचे दिए गए लिंक जोड़ा। धन्यवाद! –
आप बस कुछ sprites अंधेरे करने की कोशिश कर रहे हैं? भलाई के लिए, इसके लिए प्रति पिक्सेल छवि डेटा का उपयोग न करें। अल्फा को संरक्षित करने के लिए बस अर्ध-पारदर्शी ब्लैक ओवरटॉप (एक अलग ['globalCompositeOperation'] (http://www.tutorialspoint.com/html5/canvas_composition.htm) के साथ बनाएं। – Phrogz