2017-09-20 1 views
1

나는 Float32Array 소스를 보조 Float32Array에서 만듭니다. 보조 값 Float32Array에 반복 시퀀스로 복사하려는 값 시퀀스 model이 있습니다. 나는 현재 reverse while 루프를 사용하여이 작업을 수행하고있다.반복 시퀀스를 TypedArray에 복사하는보다 효율적인 방법은 무엇입니까?

sequence = [1, 0, 0, 0, 0, 1, 0, 0, 2, 0, 1, 0]; 
n = 3179520; //divisible by sequence length 
modelBuffs = new Float32Array(n); 

var v = modelBuffs.length; 

while(v-=12){ 
    modelBuffs[v-12] = sequence[0]; 
    modelBuffs[v-11] = sequence[1]; 
    modelBuffs[v-10] = sequence[2]; 
    modelBuffs[v-9] = sequence[3]; 

    // YTransform 
    modelBuffs[v-8] = sequence[4]; 
    modelBuffs[v-7] = sequence[5]; 
    modelBuffs[v-6] = sequence[6]; 
    modelBuffs[v-5] = sequence[7]; 

    // ZTransform 
    modelBuffs[v-4] = sequence[8]; 
    modelBuffs[v-3] = sequence[9]; 
    modelBuffs[v-2] = sequence[10]; 
    modelBuffs[v-1] = sequence[11]; 
} 

불행하게도, n를 알 수 있습니다. 대체 솔루션이 없다면 상당한 리팩토링을해야 할 수도 있습니다. 내가 한 번 시퀀스를 설정할 수 있고 초기 바이트 시퀀스를 반복하는 장소/반복 채우기/비트 단위 작업에 복사본이있을 것으로 기대하고 있습니다.

편집는 예컨대 입력

+0

필자가 볼 수 있듯이 패턴이 있지만'3, 7,11,15'에서는 값을 사용하지 않습니다. 특별한 이유가 있습니까? – Rajesh

+0

@rajesh 나는 이것을 더 복잡한 예제에서 잘라 냈다. 특별한 이유는 3,7,11,15는 사용되지 않는 4x4 행렬의 마지막 열입니다. – kevzettler

+0

그래서'NxM' 행렬에서'm-1' 열은 항상 사용되지 않는다고 가정해야합니까? – Rajesh

답변

2

에게 반복 시퀀스 어레이를 채우기 위해 빠른 방법을 간소화, 입력 된 어레이의 copyWithin() 방법을 이용하여 각각의 반복에 대해 버퍼의 길이를 두 배로하는 것이다. 동일한 기본이되는 ArrayBuffer에 대해 다른보기를 작성하여 set()을 사용할 수도 있지만,이 목적으로 이전보기를 사용하는 것이 더 간단합니다. 이 경우에는 1 ~ 4의 인덱스 :

1234에 사용하는 소스로서, 상기 제 초기 반복 충전 1 것이다가 우리가 채우고 남은위한 소스로 목적지 버퍼를 사용 가입일

1234 

,

12341234 

번째 반복 채우고 16 개 지수 :

1234123412341234 
,745 그래서 8 개 번째 반복 인덱스를 채운다 등

12341234123412341234123412341234 

하고 :

네번째 반복은 32 개 개의 인덱스를 채운다.

마지막 세그먼트 길이가 2의 거듭 제곱과 일치하지 않으면 마지막 채우기와 버퍼에 남아있는 길이 사이의 diff를 수행하고 마지막 반복에이를 사용하면됩니다.

배열이 매우 긴 경우는 분명히 관계없이 시간이 좀 걸릴 것입니다. 이 경우 Web Worker을 새 SharedArrayBuffer과 함께 사용하여 다른 프로세스에서 복사를 수행 할 수 있으며 데이터를 복사하거나 전송하지 않아도됩니다. 이것으로부터 얻은 이득은 단지 내부적으로 copyWithin()의 내부가 목적을 위해 상대적으로 최적이기 때문에 메인 스레드가 버퍼를 다루는 작은 오버 헤드로 막히지 않는다는 것입니다. 단점은 비동기 측면과 이벤트 시스템의 오버 헤드가 결합 된 것입니다 (예 : 이것이 유용한 지에 따라 다릅니다).

다른 접근법은 C/C++에서 버퍼 채우기 코드를 작성하고 소스 및 대상 버퍼를 사용하는 메소드를 컴파일하고 노출 한 다음 JavaScript에서 호출하는 방법을 사용하는 것입니다. 나는이 사건에 대한 모범이 없다.

두 경우 모두 이전 버전의 브라우저와 호환성 문제가 발생합니다.

+0

감사합니다. – kevzettler

관련 문제