আমি সি # এবং এক্সএনএ ব্যবহার করছি। আলোকসজ্জার জন্য আমার বর্তমান অ্যালগরিদম একটি পুনরাবৃত্ত পদ্ধতি। তবে এটি ব্যয়বহুল , যেখানে প্রতি 8 সেকেন্ডে একটি 8x128x8 অংশ গণনা করা হয়।
- এমন কি অন্যান্য আলোর পদ্ধতি রয়েছে যা ভেরিয়েবল-অন্ধকারের ছায়া তৈরি করবে?
- বা পুনরাবৃত্তির পদ্ধতিটি ভাল, এবং সম্ভবত আমি এটি কেবল ভুল করছি?
দেখে মনে হচ্ছে পুনরাবৃত্ত উপাদানগুলি মূলত ব্যয়বহুল (প্রতি অংশের প্রায় 25k ব্লক ধরে যেতে বাধ্য করা হয়)। আমি রে ট্রেসিংয়ের মতো একটি পদ্ধতি ব্যবহার করার বিষয়ে ভাবছিলাম, তবে এটি কীভাবে কাজ করবে তা আমার কোনও ধারণা নেই। আরেকটি জিনিস আমি চেষ্টা করেছিলাম একটি তালিকায় আলোর উত্স সংরক্ষণ করা এবং প্রতিটি ব্লকের জন্য প্রতিটি আলোক উত্সের দূরত্ব পাওয়া এবং এটি সঠিক স্তরে আলোকিত করার জন্য ব্যবহার করা, তবে তারপরে আলোক প্রাচীরের মধ্য দিয়ে যেতে হবে।
আমার বর্তমান পুনরাবৃত্তি কোডটি নীচে is সূর্যরশ্মি এবং টর্চলাইট সাফ করে পুনরায় যুক্ত করার পরে শঙ্কার হালকা স্তর নেই এমন অংশের যে কোনও জায়গা থেকে এটিকে বলা হয়।
world.get___atএটি এমন একটি ফাংশন যা এই অংশের বাইরে ব্লকগুলি পেতে পারে (এটি খণ্ড শ্রেণীর অভ্যন্তরে)। Locationএটি আমার নিজস্ব কাঠামো যা একটি এর মতো Vector3তবে ভাসমান পয়েন্টের মানগুলির পরিবর্তে পূর্ণসংখ্যার ব্যবহার করে। light[,,]খণ্ড জন্য হালকা মানচিত্র।
private void recursiveLight(int x, int y, int z, byte lightLevel)
{
Location loc = new Location(x + chunkx * 8, y, z + chunky * 8);
if (world.getBlockAt(loc).BlockData.isSolid)
return;
lightLevel--;
if (world.getLightAt(loc) >= lightLevel || lightLevel <= 0)
return;
if (y < 0 || y > 127 || x < -8 || x > 16 || z < -8 || z > 16)
return;
if (x >= 0 && x < 8 && z >= 0 && z < 8)
light[x, y, z] = lightLevel;
recursiveLight(x + 1, y, z, lightLevel);
recursiveLight(x - 1, y, z, lightLevel);
recursiveLight(x, y + 1, z, lightLevel);
recursiveLight(x, y - 1, z, lightLevel);
recursiveLight(x, y, z + 1, lightLevel);
recursiveLight(x, y, z - 1, lightLevel);
}