কীভাবে আমি ওপেনাল বাফারগুলি আনবাইন্ড এবং মুছব?


12

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

ওপেনজিএলে, ফাংশনগুলি মুছে ফেলা হয় স্বয়ংক্রিয়ভাবে জিনিসগুলি আনবাইন্ড (উদাঃ টেক্সচার), বা অবশেষে আনবাউন্ড (উদাঃ শেডার) হয়ে গেলে জিনিসটি স্বয়ংক্রিয়ভাবে মুছে ফেলা হয় এবং তাই মুছে ফেলা পরিচালনা করা সহজ। তবে এর alDeleteBuffersপরিবর্তে কেবল AL_INVALID_OPERATIONবাফারটি যদি কোনও উত্সের সাথে আবদ্ধ থাকে তবে এটি ব্যর্থ হয় ।

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

একইভাবে, বাফারগুলি খেলা শেষ করার পরে আনবাইন্ড করার (তবে মুছবে না) মুভি করার উপায় আছে কি? এটি দুর্দান্ত হবে যদি আমি যখন কোনও মুক্ত উত্সের সন্ধান করতাম, তখন কেবল আমার কেবল বাফারটি সংযুক্ত ছিল কিনা এবং উত্সের স্থিতি পরীক্ষা করতে বিরক্ত না করে তা দেখার দরকার ছিল।

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

openal 

আপনার যদি এখনও উত্তর প্রয়োজন হয় তবে আমি গর্জন ইঞ্জিনে একটি আবর্জনা সংগ্রহের পদ্ধতিটি ব্যবহার করেছি: sf.net/p/gorgon-ge
Cem Kalyoncu

উত্তর:


8

একটি বাফার মুছে ফেলার আগে আপনাকে অবশ্যই এটি ব্যবহার করে এমন প্রতিটি উত্স থেকে এটি alSourcei(mSourceId, AL_BUFFER, NULL);আবদ্ধ করতে হবে (উদা: বাফারের সাথে আবদ্ধ সমস্ত উত্স মুছুন।

সম্পূর্ণ হওয়ার পরে আপনার প্রতিটি সাউন্ডের দৈর্ঘ্যের উপর নজর রাখতে হবে। আপনি প্রতিটি উত্সের জন্য কাঠামো ব্যবহার করে শব্দটির দৈর্ঘ্য এবং সময়টি চালিয়ে যেতে পারেন (প্রতিটি গেমের টিকটি আপডেট করেছেন)। উদা:

struct AudioVoice
{
    ALuint          mSourceId;
    ALuint          mMsDuration;
    ALuint          mMsPlayed;
};

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

আপনি যদি আপনার কোডটিতে প্লে / বিরতি দেওয়া পরিবর্তনগুলি ট্র্যাক না করেন তবে আপনি প্লে সময় বাড়ানোর আগে উত্সগুলি খেলছে কিনা তাও পরীক্ষা করে দেখতে চাইবেন।

ALint sourceState;
alGetSourcei(mSourceId, AL_SOURCE_STATE, &sourceState);
if (sourceState == AL_PLAYING) { /* increase played time */  }

আপনি যদি বাফারের সাথে আবদ্ধ উত্সগুলি ট্র্যাক রাখতে চান তবে আপনি আপনার বাফারের আইডি এবং কোনও ভেক্টর উত্স কাঠামোর সাথে সংযুক্ত করে কোনও কাঠামো ব্যবহার করতে পারেন তবে আপনাকে মুক্তি দিতে হবে এমন একটি বাফারের সাথে আবদ্ধ সমস্ত উত্স বাধাগ্রস্থ করতে পারেন যত শীঘ্র সম্ভব। উদা:

struct AudioData
{
    RKuint                      mMsDuration;
    ALuint                      mSourceId;
    std::vector<AudioVoice*>    mVoices;
};

আপনি সঠিক ট্র্যাক পেতে এটি যথেষ্ট হওয়া উচিত be আমি আমার প্রকল্পগুলি থেকে আপনাকে আরও বিশদ কোড দিতে পারি না কারণ তারা ম্যাক্রোগুলি এবং হাতে তৈরি আরটিটিআই প্রক্রিয়াতে প্রচুর নির্ভর করে re

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