2014-09-05 2 views
0

flex 4.6.0 + AIR 14.0 SDK를 사용하여 Android OS를 대상으로 AIR 응용 프로그램을 개발 중입니다. 일반적으로 2048 개의 요소가 포함 된 Numbers 벡터를 사용하고 알고리즘을 사용하여 주어진 벡터에서 하나의 Number를 생성 한 다음 결과에 따라 일부 그리기를 수행합니다 - 그리고 매 100ms마다 반복합니다.AIR Java 확장의 벡터 전송 속도

그 것은 성능입니다 위에서 언급 한 알고리즘은 내가 원하는만큼 좋지는 않지만 종종 50ms에서 100ms 사이에서 작동하지만 일부 상황에서는 이상을 처리 할 수 ​​있으며 그 처리에는 약 50-60ms가 소요됩니다. 그래서 as3보다 더 빠르다고 생각했기 때문에 복잡한 계산을 할 자바 네이티브 확장을 만들려고했습니다. C가 10 배 빠름, C 확장은 iOS에서만 사용 가능하다는 것을 알았습니다. 내게 문제가되는 것은 확장 속도가 훨씬 느린 것으로 보이고 확장이 사물의 속도를 높이기 위해 사용되기 때문입니다.

이상한 점은 확장을 호출하고 1-2ms 동안 배열 길이를 반환하면 AS3 객체의 모든 배열 요소를 Java double []에 복사 할 때 약 700-800ms가 필요하다는 것입니다. 나를 괴롭힌다. 내가 확장 Java 메소드가 시작되면 모든 데이터가 전송되는 것을 생각했지만, 왜 다음 호출

인수 [0] .getElementAt [0] .getAsDouble() 2048

너무 오래 지속, 내가 뭔가 잘못하고 있어요, 에어와 익스텐션 간의 데이터 전송이 어떻게 세부적으로 작동하는지 어떻게 알 수 있습니까? 또는 누군가가이 문제를 해결하는 더 좋은 방법을 알고 있다면 정말 감사 할 것입니다. 내가이 튜토리얼을 기반으로 모든 것을했지만 내 코드보다 훨씬 간단합니다, 그래서 나는이 게시하도록하겠습니다 -

는 여기에 몇 가지 유용한 링크 Android extension API referenceExtension code tutorial 있습니다.

+0

저는 오래 전 네이티브 확장 프로그램을 사용하고 비슷한 문제가 있음을 기억합니다. 나는 액션 스크립트 코드와 네이티브 확장 간의 통신이 그다지 빠르지 않다고 생각한다. – Ingweland

+0

귀하의 기여에 감사드립니다. 그래, 내가이 일을 시작했을 때 나의 주요 관심사 였지만 자바 확장 메서드를 입력하는 것이 빠르며 args 언 패킹이 느리다. 나는 그 반대의 상황을 예상했다 :) –

+0

Actionscript의 알고리즘이 잘 최적화되어 있는지 확인 하시겠습니까? 그것을 더 좋게 만드는 것이 가치가있을 수 있습니다. 또한 고정 크기 벡터를 사용하고 있습니까? 조금 더 빠를 수도 있습니다. – Ingweland

답변

1

AIR에서 Android 확장까지의 전송 속도에 대한 질문에 대한 답을 찾은 것 같지만 여전히 내 문제를 해결하지 못합니다.

FREObject 클래스를 통해 배열을 전송하기 때문에 시간이 좀 걸립니다. 배열에서 CSV 문자열을 만들고 해당 문자열을 확장자로 전달하여이 부분을 최적화했습니다. 확장 및 반환 결과에서 문자열의 길이 만 읽을 경우 그것은 몇 ms 완료됩니다.

그러나 문자열을 이중으로 변환하는 데는 많은 시간이 걸립니다. parseDouble()의 Java 구현이 느리다는 것을 알았 기 때문에 다른 라이브러리를 찾았고 속도는 빨라졌지만 여전히 150ms를 넘었습니다. 그래서 이야기의 자바 부분이 문제인 것처럼 보입니다. long과 int를 구문 분석하는 것이 훨씬 빨라야합니다. 일부 테스트 후에는 사실 인 것처럼 보이므로 이러한 유형으로 작업 할 수 있는지 확인하려고 노력할 것입니다.

1

그러나 문자열 변환은 많은 시간이 걸립니다. parseDouble()의 Java 구현이 느리다는 것을 알았 기 때문에 다른 라이브러리를 찾았고 속도는 빨라졌지만 여전히 150ms를 넘었습니다. 그래서 이야기의 자바 부분이 문제인 것처럼 보입니다. long과 int를 구문 분석하는 것이 훨씬 빨라야합니다. 일부 테스트 후에는 사실 인 것처럼 보이므로 이러한 유형으로 작업 할 수 있는지 확인하려고 노력할 것입니다.

당신은 훨씬 더 빨리, 당신은 다른 측면에서이 해당 일 할 수 있다면 할 수 있습니다 : 당신은 long을 전달하고 이중으로의 비트를 재 해석

double x = Double.longBitsToDouble(readLong()); 

합니다.정상적인 JVM에서 이것은 내장 함수입니다. 보통 레지스터에서 부동 소수점 레지스터로 이동하는 것입니다. Android에서는 잘 모르겠습니다.

구문 분석 long은 확실히 빠르지 만 비 ASCII 숫자를 처리하는 Character.digit을 피함으로써 더 빨리 만들 수 있습니다. 아마 16 진수 형식으로 갈 것입니다.

어쩌면 문자열 대신 FREByteArray을 전달할 수 있습니까? 전달 된 데이터가 절반 (자바 Character 2 바이트 걸립니다)이며 어떤 구문없이 ByteBuffer.getDouble() 사용할 수 있으므로이 더욱 빨라야합니다.

+0

안녕하세요, 귀하의 도움을 주셔서 감사합니다, 나는 두 제안을 시도했지만 다시 너무 느린, 내가 뭔가 잘못하고 확장명을 가지고 있는지 모르겠지만 여기에 결과가 : 내가 FREByteArray를 사용하면 2048 요소 약 900ms 지속, 여기는 [코드] (http://pastebin.com/zwhnfZbR)입니다 그리고 longBitsToDouble에 대해, 나는 모든 것을 구현하지는 못했지만, Longs를 String으로 확장하여 전달하려고 시도한 다음 longBitsToDouble [(] http://pastebin.com/Ax3gTzJp와 같이) 길고 일정한 더미에서 2048 개의 요소에 대해 300-400 밀리 초가 걸렸으므로 내 필요에 충분하지 않습니다. 팁을 주셔서 다시 한번 감사드립니다. –

+0

@StefanKostic 링크 된 코드에서 쓸데없는 일을 할 때마다 한 번씩 '두 번'n 번 읽는 것입니다. 이것은 말도 안되며, 느리고 항상 첫 번째 바이트를 읽습니다! 루프는 한 줄만 포함해야합니다 ('real [i] = bb.getDouble();'). 'longBitsToDouble'에 관해서는 안드로이드에서 속도가 훨씬 느릴 수도 있습니다. 시도하지 않았습니다. 나는'ByteBuffer'를 먼저 시도 할 것입니다. – maaartinus

+0

Aaaaargh, 정말 미안해, 이유를 모르겠다.하지만 하나의 ByteArray에 모든 double을 넣는 대신 각 Double에 대해 하나의 ByteArray를 전달했다. 나는 너무 피곤했다. :) 어쨌든, 지금 테스트했고 결과는 정말 좋다. - 반복 당 약 10-15ms가 걸리므로 다른 계산을위한 충분한 시간이 있습니다. 다시 한번 대단히 감사합니다, 당신은 나를 구 했어요! –