কীভাবে দক্ষতার সাথে ওয়েবে একটি টাইল মানচিত্র সংরক্ষণ এবং প্রদর্শন করতে হয়?


9

সম্পর্কিত

এগুলি আসলে একটিতে দুটি প্রশ্ন। সবার আগে আমি দক্ষতার সাথে বিশাল পরিমাণে টাইলের ডেটা সঞ্চয় করার উপায় খুঁজছি। অন্যান্য দিকটি ডেটা সেট জিজ্ঞাসা করা এবং টাইল প্রদর্শন করার সাথে সম্পর্কিত। প্রথমে আপনাকে কিছু ব্যাকগ্রাউন্ড দেই।

আমরা ক্যানভাসে রেন্ডার করার জন্য ক্রাফটিজেএস লাইব্রেরি ব্যবহার করে একটি ব্রাউজার ভিত্তিক মাল্টিপ্লেয়ার টাইকুন গেমটি তৈরি করছি। জিইউআই এর পটভূমিতে আমরা পিএইচপি-তে ইয়ে ফ্রেমওয়ার্ক চালাচ্ছি এবং এটি সমস্ত পাইথনের এলোমেলো মানচিত্রের জেনারেটর এবং গেম ইঞ্জিনের সাথে সংযুক্ত।

প্রথম রুক্ষ মানচিত্রটি এভাবে দেখায়: http://i.imgur.com/khAXtl.png

মানচিত্রের ডেটা সংরক্ষণ করা

গেমের জগতটি প্রতিবার খেলা শুরু হওয়ার সাথে সাথে এলোমেলোভাবে উত্পন্ন হয়। প্রতিটি খেলোয়াড়ের জন্য আকারটি 100x100 ষড়ভুজ টাইল। তার মানে তিনটি প্লেয়ার গেমের জন্য এখানে 90.000 টাইলস তৈরি করা হয়েছে। বর্তমানে আমি একটি জাভাস্ক্রিপ্ট অ্যারে তৈরি করেছি যা থেকে আমি মানচিত্রটি রেন্ডার করি।

এটি রেন্ডারিংয়ের জন্য দুর্দান্ত কাজ করে, তবে মানচিত্রের সাথে যে কোনও ধরণের মিথস্ক্রিয়ার জন্য আমাদের কোন খেলোয়াড় টাইলের মালিক, এটির উপরে কী ধরণের কাঠামো তৈরি করা উচিত, এটি বর্তমান দাম এবং আরও অনেক কিছু সংরক্ষণ করতে হবে। প্রথমে কমপক্ষে প্রোটোটাইপের জন্য, আমরা মাইএসকিউএল ব্যবহার করতে চেয়েছিলাম, তবে কিছু পরীক্ষার পরে, এটি আমার মতো ঠিক তত দ্রুত নয়। মংগাডিবি-র মতো কোনও অবজেক্ট স্টোর কোনও এসকিউএল টেবিলের পরিবর্তে টাইলের ডেটা সঞ্চয় করার জন্য আরও উপযুক্ত। নাকি অন্য কিছু হতে পারে?

মানচিত্র প্রদর্শন করা হচ্ছে

আর একটি সমস্যা যা আমি দেখছি তা মানচিত্রের চারদিকে চলছে। বর্তমানে আমি প্রতিটি টাইলের জন্য কৌতুক সত্তা তৈরি করছি এমনকি এটি ভিউপোর্টে না থাকলেও। এটি ধীর, কারণ যদিও ক্র্যাফটি কেবল ভিউপোর্টে কেবলমাত্র রেন্ডার করে, এটি প্রতিটি রেন্ডার ইভেন্টের সমস্ত টাইলগুলির মধ্যে সঞ্চয় করে এবং সম্ভবত পুনরাবৃত্তি করে। আমার কাছে বর্তমানে একটি টানা উত্পন্ন মানচিত্র যা লোড করা খুব ধীর এবং আপনি যখন ঘুরে বেড়ান তখন তো এখন আমি এটি খেলতে সক্ষম করতে চাই।

আমার প্রথম ধারণাটি ভিউপোর্টে থাকা টাইলগুলির প্রদর্শিত উপসেটটি লোড করা ছিল। কিন্তু যখন কোনও প্লেয়ার ভিউপোর্টটি একটি ফাঁকা জায়গায় নিয়ে যায়, তখন আমাকে সার্ভারটি জিজ্ঞাসা করতে হবে এবং প্রতিক্রিয়াটির জন্য অপেক্ষা করতে হবে, তবেই মানচিত্রটি রেন্ডার করা যায়। দেশীয় অ্যাপ্লিকেশনটিতে এটি সূক্ষ্ম হবে, তবে এটি একটি ওয়েব গেমের চেয়ে পিছিয়ে।

মানচিত্র থেকে মসৃণ পারফরম্যান্স পাওয়ার উপায়টি জাভাস্ক্রিপ্ট অ্যারেতে টাইলগুলির একটি বৃহত উপসেটটি আগে লোড করা এবং এটি ক্যাশে হিসাবে ব্যবহার করা হতে পারে। প্লেয়ারটির কয়েকটি স্ক্রিন "ক্যাশেড" থাকবে এবং যখন সে ভিউপোর্টটি সরিয়ে ফেলবে, আমি জেএস "ক্যাশে" আরও টাইলস লোড করতাম।

আমি কি সঠিক দিকে যাচ্ছি? যিনি অনুরূপ কিছু করেছেন তার কাছ থেকে আমি আরও কিছু তথ্য পেতে চাই। আমি গেমের বিকাশে নতুন, তবে গত কয়েক সপ্তাহ ধরে আমি প্রচুর উত্সের মধ্য দিয়ে যাচ্ছি।


1
আমি অবাক হয়েছি যে আপনি মাইএসকিউএলকে একটি বাধা হিসাবে চিহ্নিত করেছেন। জিনিসগুলি ধীর করে দিচ্ছে এমন সিদ্ধান্তে পৌঁছতে আপনি কী পরীক্ষা করেছেন?
বম্মজ্যাক

@ অ্যালবামজ্যাক যদি টাইল প্রতি সারি থাকে তবে আমি কীভাবে জিনিসগুলি ধীর হতে পারি না তা খুব কমই দেখতে পেলাম।
আআআআআআআআআআআআআআআআআআআআআআআআ

1
@eBusiness একটি ডিবি থেকে কয়েক হাজার সারি জিজ্ঞাসা করা আসলেই সমস্যা হওয়া উচিত নয়। এটি এখনও কিছু মিলিসেকেন্ডের মধ্যে থাকা উচিত। এছাড়াও এটি 90'000 সারি নয়, বরং 3 খেলোয়াড়ের জন্য 30'000 সারি (প্রতি খেলোয়াড়ের প্রতি 100x100)।
বাম্মজ্যাক

বিভ্রান্তিকর গণিতের জন্য দুঃখিত, প্লেয়ার জোন ছাড়াও খেলোয়াড়দের মধ্যে দ্বিগুণ জায়গা রয়েছে যাতে একে অপরের থেকে সমান দূরত্ব হয়, যা এটি 90 কে করে তোলে। জিজ্ঞাসা করা কোনও সমস্যা নয়। 90k টাইল নির্বাচন করা এবং একটি মানচিত্র তৈরি করা হয়। তবে এটি করা ভাল উপায় নয়। আমি বিশদ তথ্যের জন্য অনুরোধ করা হলে আমি মানচিত্রের ডেটা সিরিয়ালিয়াল করব এবং ডিবিতে টাইলগুলি কোয়েরি ব্যবহার করব।
উপাদান

উত্তর:


2

গেমপ্লে
সবার আগে আমি আপনাকে জিজ্ঞাসা করতে চাই, আপনার প্রতি খেলোয়াড়ের আসলেই কি 10000 টাইলস দরকার? আমি জানি না আপনি কী ধরণের গেমটি তৈরি করছেন তা সাধারণত সত্য যে বড় মানচিত্রগুলি দীর্ঘ গেম করে make সভ্যতার 5-এ বৃহত্তম মানচিত্রটি 10240 টাইলস এবং এটি কেবল বাছাই কাজ করে কারণ আপনাকে এর একটি ভগ্নাংশের চেয়ে বেশি খেলতে হবে না।

ডাটাবেস
আপনার কোনও গেমটি ডাটাবেস থেকে চালানোর চেষ্টা করা উচিত নয়, আপনাকে ডেটা অ্যাপ্লিকেশন মেমোরিতে রাখতে হবে। গেমটি ব্যাক আপ করতে আপনি একটি ডাটাবেস ব্যবহার করতে পারেন। সম্পূর্ণ ব্যাকআপের জন্য গেমের ডেটার একটি ক্রমিক সংরক্ষণ করুন এবং তারপরে আপনি প্রদত্ত আদেশগুলি সংরক্ষণ করে এটি বাড়িয়ে তুলতে পারেন এবং তারপরে ব্যাকআপটি ব্যবহার করার প্রয়োজন হলে সেগুলি পুনরায় চালু করতে পারেন।

জাভাস্ক্রিপ্ট স্টোরেজ
হিসাবে ক্লায়েন্ট হিসাবে, আমি বলতে চাই যে আপনি পুরো ম্যাপটি লোড করে রাখুন, কমপক্ষে আপনি যদি গাজিলিয়ন টাইলগুলিতে এটি একটি সুন্দর বস্তু গাছের মধ্যে থাকতে চান তবে কিছুটা বেশি হতে পারে, তাই আপনার সম্ভবত ডেটা রাখা উচিত একটি "আধা-বাইনারি" এনকোডযুক্ত ফর্ম্যাটে। স্ট্রিংস এই ধরণের স্টাফের জন্য দুর্দান্ত কাজ করে, পর্যায়ক্রমে, আপনি 64 বিট ফ্লোটে 53 বিট অবধি স্বাক্ষরবিহীন পূর্ণসংখ্যার সঞ্চয় করতে পারেন, অ্যারেতে থাকা অনেকগুলি স্টাফ করতে পারেন এবং আমি মনে করি আপনি একটি দুর্দান্ত বিনয়ী মেমরির ছাপ দেখতে পাবেন।

জাভাস্ক্রিপ্ট ভিজ্যুয়ালাইজেশন
যদিও আমি বলব না যে আপনার অগত্যা ক্যানভাস ব্যবহার করা উচিত নয়, আসলে আপনার এ জাতীয় স্টাফের প্রয়োজন নেই। এটিকে সবগুলি ইমগ উপাদানগুলির গুচ্ছ হিসাবে সেট করুন, এবং মানচিত্রের বিভিন্ন অংশ প্রদর্শন করতে src সম্পত্তি পরিবর্তন করুন change

প্রো টিপ
উপায়, কখনও কখনও পুরো মানচিত্রটি ভাগ করে নেওয়ার চেয়ে বীজ উত্পন্ন করার জন্য ভাগ করা সহজ easier


+1, তবে দুঃখের বিষয় হচ্ছে পিএইচপিতে লিখিত একটি ওয়েব-অ্যাপের সাধারণত গেম-স্টেটকে স্মরণে রাখার কোনও উপায় থাকে না।
বম্মজ্যাক

@ অম্বমজ্যাক, আহ, ঠিক আছে, আমি মনে করি আমি কোনওভাবে পিএইচপি শব্দটি এড়িয়ে গেছি এবং কেবল পাইথনটি পড়েছি। তারপরে ব্যাকএন্ড ফ্রেমওয়ার্কের পরিবর্তনটি হতে পারে। নোড.জেএস একটি বিকল্প হতে পারে।
আআআআআআআআআআআআআআআআআআআআআআআআআ

আমি একটি প্রতিযোগিতামূলক ট্রান্সপোর্ট ট্রাইক নির্মাণ করছি, ওপেনটিটিডি ভাবুন, একটি মানচিত্র 512x512 (262 কে) বেশ কয়েকটি খেলোয়াড়ের পক্ষে এটি বড় নয়। আমি বুঝতে পারি যে এটি উচ্চাভিলাষী, তবে মানচিত্রটি যদি বড় না হয় তবে খেলাটি খুব শীঘ্রই শেষ হবে। কারণ এটি একটি মাল্টিপ্লেয়ার খেলা আমার খেলোয়াড়দের মধ্যে মানচিত্রে পরিবর্তনগুলি সিঙ্ক করতে হবে। আমার প্রথম প্রবৃত্তিটি কেবল ওয়েব বিকাশ থেকে আমার জানা ধারণাগুলি ব্যবহার করা এবং একটি ডাটাবেস নিয়ে যাওয়া ছিল। এটি সুপার রিয়েলটাইম হওয়ার দরকার নেই। আমি জেএস ভিজুয়ালাইজেশনের সাথে যাচ্ছি, কারণ আমি মানচিত্রে গতিশীল জিনিস রাখতে চাই।
উপাদান

আমার উত্তরটিকে কিছু পয়েন্টার হিসাবে বিবেচনা করুন, শেষ পর্যন্ত আপনাকে নিজেই কর্মক্ষমতাটি পরিচালনা করতে হবে, এটি একটি গুরুতর বিষয় এবং আপনাকে কিছু আপস করতে হতে পারে।
আআআআআআআআআআআআআআআআআআআআআআআআআআআ

আমি সম্মত, আপনার উত্তর আমাকে চিন্তার জন্য প্রচুর খাবার দিয়েছে। আমি সিরিয়ালযুক্ত মানচিত্রের ডেটা মেমরিতে রাখার উপায় এবং ডাটাবেসটিকে ব্যাকআপ হিসাবে রাখার চেষ্টা করব। তবে তারপরে আমাকে খেলোয়াড়দের মধ্যে কীভাবে পরিবর্তনগুলি ভাগ করতে হয় তা নির্ধারণ করতে হবে। আরও কিছু পরীক্ষা-নিরীক্ষার পরে আমি যা নিয়ে এসেছি তা নিয়ে ফিরে আসব।
উপাদান

1

মাইএসকিউএল স্লো নয়। সম্ভবত আপনি নির্লজ্জ অনুসন্ধান করছেন বা উপ-অনুকূল সূচক রয়েছে। মঙ্গোডিবি-র মতো নোএসকিউএল পদ্ধতিগুলি দ্রুত হতে পারে, নাও হতে পারে। আপনার অ্যাক্সেস প্যাটার্ন এবং ক্যোয়ারীর পছন্দটি এখানে এখানে আসলে গুরুত্বপূর্ণ। পারফরম্যান্স কীভাবে উন্নত করা যায় সে সম্পর্কে পরামর্শ দেওয়া সম্ভব তবে আপনি ইতিমধ্যে কী করছেন তা না দেখে।

মানচিত্র থেকে মসৃণ পারফরম্যান্স পাওয়ার উপায়টি জাভাস্ক্রিপ্ট অ্যারেতে টাইলগুলির একটি বৃহত উপসেটটি আগে লোড করা এবং এটি ক্যাশে হিসাবে ব্যবহার করা হতে পারে।

হ্যা অবশ্যই. এখানে যোগ করার মতো অনেক কিছুই নেই - ক্লায়েন্ট সার্ভার থেকে টাইলস চায়, তাই আপনাকে কেবল এটি নিশ্চিত করতে হবে যে আপনি যা চেয়েছিলেন তা পর্দার চেয়েও বড় কোনও অঞ্চল coverেকে রাখবে।

সংযোজন:

আমরা পিএইচপি-তে Yii ফ্রেমওয়ার্ক চালাচ্ছি এবং এটি সমস্ত পাইথনের এলোমেলো মানচিত্র জেনারেটর এবং গেম ইঞ্জিনের সাথে সংযুক্ত।

আপনি যদি পাইথনের সাথে পারদর্শী হন তবে আমি আপনাকে পরামর্শ দেব যে আপনি পিএইচপি মিডলম্যানকে খনন করবেন। যদি আপনি পাইথন প্রক্রিয়া হিসাবে আপনার গেমটি চালান তবে আপনি আপনার টাইলের ডেটা মেমরিতে আরও সহজেই রাখতে পারেন এবং মাইএসকিউএল অ্যাক্সেসগুলি উল্লেখযোগ্যভাবে হ্রাস করতে পারেন। এটি পিএইচপি-র চেয়ে পাইথনকে অনেক বেশি সানার ভাষা বলে সহায়তা করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.