2012-04-25 5 views
5

"ExternalInterface.call()"을 사용하여 캔버스의 내용을 반환하는 javascript 함수를 호출하려고했습니다. 그러나 상대적으로 작은 캔버스 (256x256)의 경우에는 인수/반환 값의 정렬로 인해 매우 느립니다 (약 2 초).html5 캔버스의 내용을 플래시로 효율적으로 가져 오는 방법은 무엇입니까?

이전 게시물 (2006 년부터) : Brad Neuberg (http://codinginparadise.org/weblog/2006/02/how-to-speed-up-flash-8s.html)의 제안처럼 캔버스 데이터를 더 작은 덩어리로 분해해도 여전히 성능이 떨어집니다. 어쨌든 Flash 9에서는 청크의 크기가 문제가되어서는 안됩니다.

필자는 매개 변수의 마샬링/평가를 수행하는 플래시 자바 스크립트 함수를 덮어 쓰려고 시도 할 수는 있지만 매우 복잡해 보입니다. 시도하기 전에 더 간단한 내용이 누락되었는지 알고 싶었습니다.

는 또한 수행하여 플래시 및 자바 스크립트를 전달하는 이전 방법을 시도했다 "된 GetImage는()"이미지로 캔버스의 내용을 반환하는 자바 스크립트 함수가

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

. 그러나 "Loader.load()"함수와 달리 "navigateToURL()"을 사용하지 않으면 브라우저 스크립트가 대상 URL로 사용될 수 없으므로 보안 위반 오류가 발생합니다. 불행히도 전자는 값을 반환하지 않습니다.

나는 또한 "com.macromedia.javascript.JavaScriptProxy"클래스를 사용하여 일부 오래된 코드를 본 적이 있지만 나는 그것을 테스트하지 않았습니다하고 Flash에서 사용할 수하지 않는 것 (11)

어떤 생각 것 대단히 감사하겠습니다. 감사!

+2

얼마 전 나는 [flashcam] (http://code.google.com/p/flashcam/)을 작성하여 Flash에서 웹캠 비디오를 캡처하고 JavaScript를 사용하여 HTML5 캔버스에 그려 넣었습니다. 몇 가지 테스트를 마친 후에는 마침내 기본 36을 사용하여 인코딩 된 연속적인 픽셀 차이의 쉼표로 구분 된 값의 문자열로 약간 복잡한 스키마를 사용합니다. 코드를 확인하고 프로세스를 너무 거꾸로 뒤집지 않아야합니다. –

+1

@JuanMellado, 힌트를 보내 주셔서 감사합니다. 확실히, 이미지 데이터를 인코딩하는 방식은 엄청난 차이를 만듭니다. 문자열은 결국 XML 형식으로 전달되기 때문에 이동하는 방법입니다. 나는 canvas 함수'canvas.toDataURL ('image/png')'를 통해 매우 효율적으로 수행 할 수있는 PNG 압축 + Base64 인코딩을 사용했다. 이렇게하면 이미지 데이터를 픽셀 또는 바이트 배열로 전달하는 것과 비교하여 몇 배의 성능 향상이 있었으며 클라이언트 측에서 픽셀 당 __flash__toXML() 호출이 필요했습니다. 어쩌면 내가 답변으로 게시해야할지 모르겠다. – elyuro

+0

좋습니다. 네, 그렇다면 자신의 질문에 대답하십시오. 답장을 보내 주셔서 감사합니다. –

답변

1

두 가지 옵션을 생각해 볼 수 있습니다. 하나는 쉽고 하나는 어렵습니다.

1) 서버로 왕복합니다. 느려지지만 플래시를 잠그거나 스크립트 시간 제한을 발생시키지 않아야합니다.

2) Flash의 LocalConnection에 연결할 수있는 HTML5 WebSocket을 작성할 수 있는지 확인하십시오. 이것은 결코 작은 위업이 아닙니다. This guy은 C에서 그 너트를 깨뜨린 것처럼 보입니다. 그는 LocalConnection을 "말할"수있는 앱을 만들었습니다.

+0

1)은 브라우저 측면의 모든 것을 처리하는 것보다 훨씬 비효율적이므로이 경우에는 문제가되지 않습니다. 2) 나는 빨리 살펴 봤는데 JS에서 TCP 통신을 수행하는 실제적인 방법이 아닌 것 같습니다. 내가 찾은 모든 것은 HTTP 상단에있는 시뮬레이트 된 TCP이거나 여러분이 제공하는 링크와 같은 종류의 해킹이다. 전자는 ExternalInterface Flash 객체와 비슷한 오버 헤드에 바인딩됩니다. 후자는 모든 플랫폼에서 작동하도록 두통을 일으킬 수 있다고 상상조차 할 수 없습니다. 그래도 제안에 감사드립니다. – elyuro

+0

웹 소켓은 JS에서 수행 할 수 있습니다.이 설명은 http : //www.html5rocks를 참조하십시오.co.kr/ko/tutorials/websockets/basics /,하지만 나는 웹 소켓이 유스 케이스와 잘 어울린다고 생각하지 않는다. – Eddie

관련 문제