2016-12-28 12 views
6

vấn đề: trong trò chơi video có rất nhiều con số có độ chính xác thấp có thể được đóng gói cùng nhau qua mạng để tiết kiệm băng thông đáng kể so với gửi chuỗi. Các chuỗi được phân bổ cho UTF-8 sử dụng 1 byte cho mỗi ký tự.Làm thế nào để viết các số có độ chính xác thấp (2-10 bit) vào một bộ đệm mảng/blob?

Lý tưởng nhất là nên có một cách để viết những con số này với nhau:

  • chơi id trong trò chơi- chính xác 0-1023 phạm vi, 10 bit
  • chơi rotation- quaternion- một vài số điện thoại kết thúc là 24 bit sau khi đơn giản hóa toán học
  • đầu vào trình phát- 0-1 phạm vi x2, 2 bit

Làm thế nào để bạn có những con số có độ chính xác thấp như thế này và đặt chúng vào bộ đệm mảng/blob?

+1

* "Chuỗi được cấp cho UTF-8 sử dụng 1 byte cho mỗi ký tự." * Hoặc hai, hoặc ba hoặc bốn, tùy thuộc vào ký tự. Ví dụ, 'ç' (như trong François) là hai byte trong UTF-8, như là' £ '(dấu Pound Sterling) và' ¥ '(yên); '€' (dấu Euro) là ba byte. –

+0

Lưu ý rằng tổng số bit trong ví dụ OP là 36 khiến cho vấn đề này phức tạp hơn một chút (nếu lưu trữ nhỏ gọn là mục tiêu, nghĩa là). – K3N

+0

có và các con số phải sắp xếp đúng cách mặc dù bit co lại quá, vì vậy một số phương pháp để đảm bảo độ dài cố định được yêu cầu – hydrix

Trả lời

2

Bạn có thể sử dụng Uint32Array và sau đó sử dụng các phép dịch bit và mặt nạ để lưu trữ các giá trị trong mảng đó.

Ví dụ, nếu bạn muốn lưu trữ một số 4 bit, và sau đó một số 10 bit (để lại 18 bit còn lại để biết thêm lĩnh vực):

array[0] = (num0 & 0x0f) << 0) | 
      (num1 & 0x3ff) << 4); 

và trích lục các lĩnh vực:

num0 = (array[0] >>> 0) & 0x0f; 
num1 = (array[0] >>> 4) & 0x3ff; 

Mảng có thể được truy cập dưới dạng ArrayBuffer để tuần tự hóa bằng cách truy cập thuộc tính .buffer của nó.

+0

bạn có nghĩa là sử dụng mặt nạ bit để thêm giá trị, sau đó bit thay đổi số bit được gán để trượt nó hơn? Bởi vì các toán tử bitwise vẫn là 32-bit và tôi giả sử đó là cách duy nhất để loại bỏ các số 0 trước đây một cách duyên dáng – hydrix

+1

, bạn vẫn nên sử dụng các trường có chiều rộng cố định, nhưng chỉ cần sử dụng nhiều bit để lưu trữ toàn bộ số câu hỏi. – Alnitak

0

Có lẽ số bit-stream của MathewBarker có thể trợ giúp, tại đây.

1

dựa trên Alnitak của câu trả lời:

function binPush(arr, i, num, max) { 
    arr[i] = arr[i] << max.toString(2).length; //shift int32 $max (in base 2) bits to the left to allow for allocation 
    arr[i] |= num; // OR bitwise operation, which copies the 1s from $num 

} 

var myArr = new Uint32Array(1); 

binPush(myArr, 0, 3, 3);  // push 11:  00000000000000000000000000000011 
binPush(myArr, 0, 10, 15); // push 1010:  00000000000000000000000000111010 
binPush(myArr, 0, 120, 127); // push 1111000: 00000000000000000001110101111000 
binPush(myArr, 0, 120, 255); // push 01111000: 00000000000111010111100001111000 

thông báo như thế nào cuối cùng binPush thêm một thêm 0 vào phía trước vì tối đa là 255, đó là chính xác 8 bit trong khi 120 là 7 bit

jsfiddle

Các vấn đề liên quan