Лучшая производительность Javascript

В настоящее время я создаю приложение в React для изучения языка. Приложение - игра, и в игре я играю много звуков, используя Howler.js. Howler великолепен, так как он позволяет мне легко создавать звуки, а также очень важно позволяет мне регулировать высоту звука, что означает, что я могу создавать мелодии только с одним семплом.

Проблема, с которой я начинаю сталкиваться, когда у меня много разных звуков на разных высотах, это производительность. С кодом, который я настроил для зацикливания моего звукового объекта, он довольно тяжелый, и мне интересно, есть ли способ его оптимизировать (я ни в коем случае не эксперт по Javascript, поэтому я не удивлюсь, если бы он был намного меньше). способ выполнения звукового объекта). В любом случае, вот мой звуковой объект ниже, чтобы дать вам идею:

var testTrack = [{
        rowId:1,
        rowExtras:"notExpanded",
        rowSample:
            {
                sampleId:"1",
                notes:[
                    {
                        keyNumber:0,
                        noteDelay:0,
                        notePitch:1
                    },{
                        keyNumber:2,
                        noteDelay:460,
                        notePitch:1
                    },{
                        keyNumber:4,
                        noteDelay:920,
                        notePitch:1
                    },{
                        keyNumber:6,
                        noteDelay:1380,
                        notePitch:1
                    },{
                        keyNumber:8,
                        noteDelay:1840,
                        notePitch:1
                    },{
                        keyNumber:10,
                        noteDelay:2300,
                        notePitch:1
                    },{
                        keyNumber:12,
                        noteDelay:2760,
                        notePitch:1
                    },{
                        keyNumber:14,
                        noteDelay:3220,
                        notePitch:1
                    }                               
                ],
                sampleName:"Heavy Kick",
                sampleSource:"../../samplesWav/sample1.wav"
            }  

        },{    ...there are 12 more objects in the array with different samples in them 

Вот код, который я использую для зацикливания и воспроизведения звука с помощью Howler.js. Обратите внимание, что вышеупомянутый объект находится в моем состоянии Apps под this.state.trackObject:

  playTrack(){

    var audioArray = this.state.trackObject;

    for(var i=0; i <= audioArray.length - 1; i++) {

        var rowObject = this.state.trackObject[i]

        var notesLength = rowObject.rowSample.notes.length

        for(var j=0; j <= notesLength - 1; j++) {
            var notes = rowObject.rowSample.notes[j].noteDelay;
            var id = rowObject.rowSample.sampleId;
            var src = rowObject.rowSample.sampleSource; 
            var pitch = rowObject.rowSample.notes[j].notePitch;

            playSample(id,notes,src,pitch)                
        }

    }

    function playSample(id,notes,src,pitch){

        if(id != "null"){
        setTimeout(function(){  

        //this is where howler is used
         var sound = new Howl({
              src: [src],
              rate:pitch
         })

         sound.play();                 

         }, notes);  
      }
   }


}

Я пытаюсь сделать все возможное, используя метод React, но я все еще учусь, поэтому не уверен, что есть ли лучший способ интегрировать функцию воспроизведения с моим состоянием приложений для лучшей производительности браузера.

Я думал об использовании аудио спрайтов (которые на самом деле настроены на работу в Howler). Я попытался использовать это здесь. У меня действительно была проблема с установкой, и я не смог ее запустить, но даже если мне удастся это исправить, я не думаю, что смогу добавить звуки с изменением высоты тона, примененным из воющего API, к спрайту?

Спасибо, и я приветствую любые предложения по производительности / решениям, которые могут быть у каждого!

1 ответ

Я не уверен, как работает ваша игра, но, возможно, вам не нужно перебирать весь массив. Если вы храните звуки в хэше и обращаетесь к ним по уникальному идентификатору (возможно, по имени звука?), Это должно значительно повысить производительность.

Так что вместо того, чтобы вместо объявления testTrack в качестве массива, как это...

var testTrack = [{
  rowId:1,
  rowExtras:"notExpanded",
  rowSample: { // Code removed for brevity }
},{
  rowId:2,
  rowExtras:"notExpanded",
  rowSample: { // Code removed for brevity }
}];

Объявите это так...

var testTrack = {
  "track1": {
    rowId:1,
    rowExtras: "notExpanded",
    rowSample: { }
  },
  "track2": {
    rowId:2,
    rowExtras:"notExpanded",
    rowSample: { }
  }
};

Затем получите доступ к элементам, используя один из методов ниже, где "track1" будет именем звука...

var myTrack = testTrack.track1;
var myTrack = testTrack['track1'];

Не уверен, имеет ли это смысл в контексте вашей игры, но это, по крайней мере, спасет вас от повторения всего цикла.

Другие вопросы по тегам