2009-08-23 60 views
7

Tôi đã thực hiện một số đọc về hai khái niệm mới (tương đối) trong ngôn ngữ Javascript - Web Workers và Processing.js tuyệt vời của John Resig (tốt, không thực sự là một 'Javascript mới' khái niệm ', nhưng bạn có ý tưởng của tôi). Một số ví dụ tuyệt vời của cả hai đi lang thang internets, nhưng tôi vẫn chưa tìm thấy một trong đó sử dụng cả hai kỹ thuật hiệu quả. Nó trông khá thú vị và mạnh mẽ với tôi, vì vậy tôi nghĩ tốt hơn là nên thử.Kết hợp sức mạnh của Processing.js và Web Worker

Tuy nhiên, tôi thực sự không thể tìm ra thiết kế kịch bản tốt nhất để tích hợp cả hai ... Có vẻ như tôi thường sử dụng Processing.js, một số lớp được xác định trong vòng -ứng dụng'. Nó cho phép bạn sử dụng cú pháp giống như Java để thực hiện điều này. Tuy nhiên, các lớp này chỉ có thể truy cập trong ứng dụng Xử lý - điều hiển nhiên. Nhưng trong ví dụ this, một đối tượng hàm Javascript lần đầu tiên được định nghĩa trong một kịch bản riêng biệt, và nếu sử dụng Worker, kịch bản lệnh Worker-nhập khẩu nguyên mẫu của đối tượng và loại 'bu lông' chính nó vào nó.

Với tôi, cả hai không có vẻ 'có thể hoán đổi', trong đó bạn không thể truy cập vào lớp mà bạn đã xác định trong ứng dụng Xử lý, khi bạn đang ở trong kịch bản Công nhân của bạn. Có lẽ vì một lý do, vì các lớp xử lý giống như chắc chắn không giống như Javascript. Theo như tôi có thể thấy, tôi sẽ phải thực hiện một định nghĩa tương tự của lớp (dưới dạng một nguyên mẫu hàm mới) trong tập lệnh Worker của tôi - nó không phải là rất tốt để bảo trì, và có vẻ như thiết kế tồi tệ với tôi, mặc dù tôi vẫn là một newbie lớn về chủ đề này.

Tôi có thấy gì không? Tôi có muốn thứ gì đó không được cho là không? Hay tôi vừa hiểu lầm một số khái niệm cơ bản?

Cảm ơn sự giúp đỡ!

Edit:

tiếp tục cố gắng rối tung với nguyên mẫu của người lao động để 'hình dạng' nó như đối tượng đó là nghĩa vụ phải làm việc cho, nhưng nhận ra rất nhanh chóng, đây không phải là con đường để đi .

Hãy thử một phác thảo để làm việc với: Tôi có một lớp 'Bóng', mà khá nhiều không làm bất cứ điều gì ngoại trừ lưu trữ một vị trí hai chiều. Trên mỗi chu kỳ draw(), Processing.js gọi phương thức update() của nó, điều này làm cho Bóng chấp nhận một vị trí mới. Sau đó, phương thức display() được gọi, trong đó có Bóng vẽ một vòng tròn nhỏ ở vị trí hiện tại của nó.

Không có gì phức tạp để bắt đầu. Bây giờ, giả định rằng việc xác định vị trí mới của quả bóng là một hoạt động khá tốn kém - ví dụ, nếu nó liên quan đến chuyển động của quả bóng thông qua một trường hấp dẫn 'phức tạp'. Nếu việc tính toán này phải được thực hiện từng lần trước khi vẽ, nó sẽ gây ra ít nhất một chút chậm trễ. Tuy nhiên, nếu bạn quản lý để làm công cụ này cùng một lúc, nó có thể có một chạy mượt mà hơn. Vì vậy, tôi đã tìm ra rằng tôi có thể cung cấp cho lớp Ball một mảng 'vị trí' phụ trong danh sách thuộc tính của nó, sẽ giữ tất cả các vị trí liên tiếp của nó. Khi Ball được khởi tạo, nó tạo ra một Worker mới sẽ bắt đầu tính toán các vị trí, và mỗi khi nó hoàn thành một vị trí, nó sẽ gửi lại một thông điệp tới Ball, chứa một vị trí hai chiều mới. Sau đó, Ball sẽ đẩy cái này lên mảng vị trí của nó, vì vậy mỗi lần nó phải cập nhật vị trí của nó, nó sẽ đi tới bản ghi tiếp theo trong mảng.

Tất cả trong tất cả - ý tưởng tốt hay xấu? Nếu tốt, bất kỳ đề xuất về cách thiết kế này?

Trả lời

3

Mô phỏng vật lý trò chơi 3D (như trên xbox360) thường chạy ở tốc độ cố định, độc lập với tốc độ khung hình. Đó là bởi vì vật lý quá phức tạp để mô hình hóa phân tích, vì vậy bạn thực hiện các phép tính xấp xỉ bằng số, vì vậy bạn cần phải đồng bộ hóa lỗi xác định. Lợi ích bổ sung là tốc độ khung hình được tách riêng khỏi hiệu suất vật lý, vì vậy bạn có thể cập nhật vật lý của mình ở 5 hz và nội suy, v.v.

Vì vậy, mô hình bạn mô tả chính xác là cách các chuyên gia thực hiện.

0

Trong ví dụ này, việc tính toán các vị trí phải được hoàn thành trước khi vẽ bóng - vì vậy việc xử lý không đồng bộ không có ý nghĩa?

p5 chính nó là rất đồng bộ - có một phương pháp vẽ trung tâm thực hiện tất cả bản vẽ.

Nhân viên web cũng không thể truy cập vào nhà cung cấp, vì vậy họ không thể sử dụng để vẽ.

Đối với ứng dụng dựa trên sự kiện phức tạp hơn, giống như trò chơi, có thể sử dụng cho công nhân web.

+0

Không, đây không phải là trường hợp - khi bản vẽ được khởi tạo, công nhân bắt đầu tính toán vị trí và mỗi lần tìm thấy một cái mới, nó sẽ được gửi đến luồng chính.Ở đó, nó được lưu trữ trong một loại 'caching'-array, vì vậy nó có thể được sử dụng sau này. Tuy nhiên, tính toán tiếp tục trong khi vẽ sẽ xảy ra, do đó, không có sự chậm trễ mỗi khung hình, và không có sự chậm trễ trước khi bắt đầu. – JorenB

0

Chỉ là một ý tưởng ... nhưng trong signal processing những gì bạn làm là đưa ra một tỷ lệ mẫu mà lát lên tín hiệu tương tự vào thông tin kỹ thuật số. Điều quan trọng là giữ lại chỉ đủ tín hiệu để tạo lại bản gốc. Giống như cách MP3 được tách ra khỏi các tệp nhạc bằng cách sử dụng 128, 192, v.v.

Vì vậy, nếu bạn di chuyển quả bóng theo cách toán học (tức là dọc theo parabola), bạn sẽ có thể chuyển đổi đường dẫn thành tập hợp của các tọa độ xấp xỉ đường dẫn tương tự. Những coords đó sẽ nhanh hơn nhiều so với con đường đầy đủ. Nó cũng có thể điều chỉnh được (bằng cách thay đổi tốc độ lấy mẫu).

Tôi biết điều này không giải quyết bất kỳ câu hỏi nào của bạn về Processing.js hoặc Web Worker. Chỉ cần một ý tưởng để giúp bạn thực hiện những tính toán hiệu quả hơn.

+0

Tôi không hiểu Processing.js là gì trước khi tôi gửi câu trả lời này. Khá chắc chắn tôi là cách ra khỏi cơ sở để cung cấp bất cứ điều gì có thể giúp đỡ. Có vẻ như Processing.js đã làm một công việc khá tốt về khái niệm xử lý tín hiệu mà tôi đã mô tả ở trên. – Rake36

0

Ý tưởng này nhắc tôi về ý tưởng xếp hàng nhiệm vụ của Google được tích hợp vào Google App Engine.

http://code.google.com/appengine/docs/python/taskqueue/

Điều này có thể giúp bạn.

Đối với trò chơi trên bảng asynch trực tuyến của tôi, tôi sẽ triển khai hệ thống có lịch sử tin nhắn được lưu giữ để người chơi có thể xem điều gì đã xảy ra khi đến lượt họ. Mỗi điều sẽ xảy ra sẽ nhận được một ID duy nhất và bất cứ khi nào người chơi được gửi bất kỳ tin nhắn, nó theo dõi của một trong những mới nhất mà họ đã nhận được. Sau đó, khi họ trở lại họ có thể thấy một hình ảnh động nhanh chóng của tất cả mọi thứ xảy ra từ tin nhắn cuối cùng họ đã nhận được.

Và nếu tôi nhận được đến một điểm mà tôi cần máy chủ để xử lý một cái gì đó trong khi khách hàng không chờ đợi, tôi sẽ sử dụng hàng đợi nhiệm vụ

1

bạn không thể truy cập vào các lớp học mà bạn định nghĩa trong ứng dụng Xử lý, khi bạn đang ở trong kịch bản Công việc của mình. Có lẽ vì lý do

Điều này nhằm ngăn ngừa lỗi do nhiều công nhân thay đổi cùng một dữ liệu được chia sẻ cùng một lúc. Trong các thông điệp dữ liệu được sao chép và mỗi Worker có bản sao riêng của nó, do đó nó không phải lo lắng về việc ghi đồng thời gây ra lỗi. Đây là một cách đơn giản để tránh các lỗi đồng thời xử lý nó mà không cần lập trình viên phải lo lắng về nó (không có semaphores hoặc đồng bộ hóa, et)

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