2012-04-25 35 views
5

Tôi đã cố gắng sử dụng "ExternalInterface.call()" để gọi hàm javascript trả về nội dung của canvas. Tuy nhiên, đối với một canvas tương đối nhỏ (256x256) thì điều này cực kỳ chậm (khoảng 2 giây), dường như là do sự sắp xếp của các đối số/giá trị trả về.Làm cách nào để nhập nội dung của canvas html5 vào flash một cách hiệu quả?

Ngay cả khi tôi chia nhỏ dữ liệu canvas thành các đoạn nhỏ hơn, theo đề xuất của Brad Neuberg trong một bài đăng cũ hơn (từ năm 2006): http://codinginparadise.org/weblog/2006/02/how-to-speed-up-flash-8s.html, tôi vẫn nhận được hiệu suất kém. Kích thước của khối không phải là một vấn đề như của Flash 9 anyway.

Tôi đoán tôi vẫn có thể cố gắng ghi đè lên các chức năng javascript Flash thực hiện việc sắp xếp/đánh giá các tham số, nhưng điều này dường như rất có liên quan và tôi muốn biết nếu tôi thiếu bất kỳ điều gì đơn giản hơn trước khi thử.

Tôi cũng đã cố gắng một cách cũ để giao tiếp flash và javascript bằng cách thực hiện:

var req : URLRequest = new URLRequest("javascript:getImage()"); 
var loader : Loader = new Loader(); 
loader.load(req); 

nơi "getImage()" là một hàm javascript trả về nội dung của bức tranh như một hình ảnh. Nhưng điều này sẽ ném một số loại lỗi vi phạm bảo mật vì không có tập lệnh trình duyệt nào được phép sử dụng làm URL mục tiêu, trừ khi người dùng sử dụng "navigationToURL()" trái ngược với hàm "Loader.load()". Thật không may trước đây không trả về một giá trị.

Tôi cũng đã nhìn thấy một số mã lớn tuổi sử dụng lớp "com.macromedia.javascript.JavaScriptProxy", nhưng tôi đã không kiểm tra nó và nó dường như không có sẵn trong Flash 11.

Bất kỳ suy nghĩ sẽ được đánh giá cao. Cảm ơn!

+2

Một thời gian trước, tôi đã viết [flashcam] (http://code.google.com/p/flashcam/) để quay video webcam trên Flash và vẽ nó sau trên canvas HTML5 bằng JavaScript. Sau một số thử nghiệm, cuối cùng tôi sử dụng một lược đồ phức tạp bit với một chuỗi các giá trị phân tách bằng dấu phẩy được phân tách bằng cách sử dụng cơ số 36. Kiểm tra mã, không được quá khó đảo ngược quá trình. –

+1

@JuanMellado, Cảm ơn bạn đã gợi ý. Chắc chắn, cách thức mà bạn mã hóa dữ liệu hình ảnh tạo ra một sự khác biệt rất lớn, và chuỗi là cách để đi vì cuối cùng mọi thứ đều được truyền theo định dạng XML. Tôi đã kết thúc bằng cách sử dụng một nén PNG + Base64 mã hóa có thể được thực hiện rất hiệu quả thông qua chức năng canvas 'canvas.toDataURL ('image/png')'. Điều này cải thiện hiệu suất của một số đơn đặt hàng của cường độ so với truyền dữ liệu hình ảnh như là một mảng pixel hoặc byte, trong đó bao gồm một cuộc gọi __flash__toXML() cho mỗi pixel ở phía khách hàng. Có lẽ tôi nên đăng bài này như một câu trả lời, không chắc chắn, tôi mới đến SO. – elyuro

+0

Tuyệt vời. Và vâng, trả lời câu hỏi của riêng bạn sau đó. –

Trả lời

1

Tôi có thể nghĩ đến 2 tùy chọn: một cách dễ dàng, một cách khó khăn.

1) Vòng chuyến đi đến máy chủ. Nó có thể chỉ là chậm nhưng nó sẽ không dễ bị khóa Flash hoặc gây ra một thời gian chờ kịch bản.

2) Xem bạn có thể viết một WebSocket HTML5 có thể kết nối với LocalConnection của Flash hay không. Đây là một kỳ công không nhỏ. This guy dường như đã bị nứt hạt đó trong C. Ông đã thực hiện một ứng dụng có thể "nói" LocalConnection.

+0

cảm ơn bạn đã trả lời. 1) chắc chắn là không hiệu quả hơn xử lý mọi thứ ở phía trình duyệt, vì vậy nó nằm ngoài câu hỏi trong trường hợp này. 2) Tôi đã xem nhanh và dường như không có cách nào thực sự để thực hiện bất kỳ giao tiếp TCP nào trong JS. Tất cả mọi thứ tôi tìm thấy hoặc là mô phỏng TCP trên đầu trang của http hoặc một số loại hack như liên kết bạn cung cấp. Trước đây là ràng buộc với một chi phí tương tự như của đối tượng ExternalInterface Flash, sau này, tôi thậm chí không thể tưởng tượng những đau đầu nó sẽ cung cấp cho nó để làm việc trên tất cả các nền tảng. Tuy nhiên, cảm ơn những lời đề nghị. – elyuro

+0

Websockets có thể được thực hiện từ JS, xem giải thích http: //www.html5rocks này.com/en/tutorials/websockets/basic /, nhưng tôi không nghĩ rằng websockets phù hợp với trường hợp sử dụng của bạn, âm thanh giống như kết nối một lần, thay vào đó các ổ cắm kết nối mở đang chạy dài được dự định. – Eddie

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