تحميل ملفات صوتية متعددة العينة كبيرة في ذاكرة للتشغيل - كيفية تجنب التجميد المؤقت

StackOverflow https://stackoverflow.com/questions/2373094

سؤال

أنا أكتب تطبيقًا يحتاج إلى استخدام عينات صوتية كبيرة ، وعادة ما تكون حوالي 50 ميجابايت في الحجم. يحتوي ملف واحد على ما يقرب من 80 تسجيلات صوتية قصيرة فردية ، والتي يمكن أن يتم تشغيلها من خلال طلبي في أي وقت. لهذا السبب يتم تحميل جميع بيانات الصوت في الذاكرة للوصول السريع.

ومع ذلك ، عند تحميل أحد هذه الملفات ، قد يستغرق الأمر عدة ثوانٍ لوضعه في الذاكرة ، مما يعني أن برنامجي إذا تم تجميده مؤقتًا. ما هي الطريقة الجيدة لتجنب حدوث هذا؟ يجب أن يكون متوافقًا مع Windows و OS X. يتجمد في هذا: myMultiSampleClass->open(); التي يجب أن تفعل الكثير من تخصيص الذاكرة الديناميكية والقراءة من الملف باستخدام Ifstream.

لقد فكرت في خيارين محتملين:

  1. افتح الملف وقم بتحميله في الذاكرة في مؤشر ترابط آخر حتى لا تتجمد عملية التطبيق الخاصة بي. لقد بحثت في مكتبة Boost للقيام بذلك ، لكنني بحاجة إلى القيام بالكثير من القراءة قبل أن أكون مستعدًا للتنفيذ. كل ما أود القيام به هو استدعاء وظيفة Open () في الخيط ثم تدمير الخيط بعد ذلك.

  2. توصل إلى مخطط للتأكد من عدم تحميل الملف بأكمله في الذاكرة في أي وقت ، أنا فقط أحمل على الطيران إذا جاز التعبير. المشكلة هي أن أي عينة يمكن تشغيلها في أي وقت. أعلم أن بعض البرامج الأخرى لديها هذا النوع من النظام ، لكنني لست متأكدًا من كيفية عمله. يعتمد ذلك كثيرًا على مواصفات الكمبيوتر الفردية ، فقد يعمل بشكل رائع على جهاز الكمبيوتر الخاص بي ، لكن شخص لديه محرك الأقراص الصلبة البطيئة/الذاكرة قد يحصل على نتائج سيئة للغاية. كانت إحدى الأفكار التي كانت لديّ هي تحميل عينات X من كل تسجيل صوتي في الذاكرة ، ثم إذا كنت بحاجة إلى اللعب ، فابدأ تشغيل العينات الموجودة بالفعل أثناء تحميل بقية الصوت في الذاكرة.

أي أفكار أو انتقادات؟ شكرا لك مقدما :-)

هل كانت مفيدة؟

المحلول

أنا أحب الحل 1 كمحاولة أولى - بسيطة وذلك إلى هذه النقطة.

إذا كنت تحت Windows ، يمكنك القيام بعمليات الملفات غير المتزامنة - ما يسمونه متداخلة - لإخبار نظام التشغيل بتحميل ملف وإعلامك عندما يكون جاهزًا.

نصائح أخرى

إستخدم ملف تعيين الذاكرة. وقت التحميل في البداية "فوري" ، وسيتم نشر النفقات العامة للإدخال/الإخراج مع مرور الوقت.

أعتقد أن أفضل حل هو تحميل جزء صغير أو عينة واحدة من بيانات الموجة في وقت واحد أثناء التشغيل باستخدام I/O غير المتزامن (كما ذكر John Dibling) لحجم ثابت من العازلة.

ستكون الاستراتيجية تملأ المخزن المؤقت للتشغيل أولاً ثم يتم تشغيله (سيؤدي ذلك إلى إضافة قدر صغير من التأخير ولكنه يضمن التشغيل المستمر) ، أثناء تشغيل المخزن المؤقت ، يمكنك إعادة ملء عازلة تشغيل أخرى على خيط مختلف (متداخل) ، على الأقل تحتاج إلى ذلك لديك اثنين من العازلة التشغيل ، واحدة للعب وواحدة لإعادة الملء في الخلفية ، ثم تبديلها في الوقت الفعلي

في وقت لاحق ، يمكنك تعيين حجم حجم العازلة في التشغيل استنادًا إلى أداء الكمبيوتر العميل (سيتم تداوله بين حجم الذاكرة وقوة المعالجة ، وسوف تتطلب أسرع وحدة المعالجة المركزية مخزن مؤقتًا أصغر وبالتالي تأخير أقل).

قد ترغب في التفكير في المنتج المستهلك مقاربة. يتضمن هذا أساسًا قراءة بيانات الصوت في مخزن مؤقت باستخدام مؤشر ترابط واحد ، وقم بتشغيل البيانات من المخزن المؤقت إلى بطاقة الصوت الخاصة بك باستخدام مؤشر ترابط آخر.

قارئ البيانات هو المنتج ، وتدفق البيانات إلى بطاقة الصوت هو المستهلك. أنت بحاجة إلى علامات عالية للمياه ومنخفضة المياه بحيث ، إذا كان المخزن المؤقت ممتلئًا ، يتوقف المنتج عن القراءة ، وإذا انخفض المخزن المؤقت ، يبدأ المنتج في القراءة مرة أخرى.

مكتبة قالب تزامن منتج C ++
http://www.bayimage.com/code/pcpaper.html

تعديل: أود أن أضيف أن هذا النوع من الأشياء صعب. إذا كنت تقوم ببناء عينة لاعب ، فإن الحمل على النظام يختلف بشكل مستمر كدالة يتم تشغيل المفاتيح ، وعدد الأصوات التي يتم تشغيلها في وقت واحد ، ومدة مدة كل صوت ، ما إذا كانت دواسة الاستدامة يتم الضغط عليها ، وعوامل أخرى مثل سرعة القرص الصلب والتخزين المؤقت ، وكمية الحصان المعالج المتاحة. لن تكون بعض تحسينات البرمجة التي تستخدمها في النهاية واضحة للوهلة الأولى.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top