>  Q&A  >  본문

에뮬레이터 오류 발생

<p>저는 온라인에서 찾은 GBA 에뮬레이터(https://gba.44670.org/)를 리버스 엔지니어링하고 HTML 추출기를 사용하여 이를 복제하려고 했습니다. 저는 오프라인에서 작동하기를 원했기 때문에 모든 스크립트를 내 컴퓨터에 다운로드하여 그곳에서 실행했습니다. 그러나 이후에는 "파일 선택" 버튼이 더 이상 나타나지 않고 "로드 중입니다. 잠시만 기다려 주십시오..." 텍스트 줄로 대체됩니다. 코드를 더 깊이 파고들어 WASM과 관련이 있다는 것을 발견했습니다. 코드는 다음과 같습니다. </p> <pre class="brush:php;toolbar:false;"><div id="wasm-loading"> 로딩 중 기다려주세요... </div> <div id="select-rom" 숨김> <입력 유형="파일" onchange="onFileSelected()"숨겨진 /></p> <button onclick="$id('romFile').click()" id="btn-choose">파일 선택...</button>
<p>코드에서 WASM에 대한 다른 참조는 .js 파일 app.js에 있습니다. </p> <pre class="brush:php;toolbar:false;">함수 wasmReady() { romBuffer = Module._emuGetSymbol(1) var ptr = Module._emuGetSymbol(2) wasmSaveBuf = Module.HEAPU8.subarray(ptr, ptr + wasmSaveBufLen) ptr = Module._emuGetSymbol(3) imgFrameBuffer = new Uint8ClampedArray(Module.HEAPU8.buffer).subarray(ptr, ptr + 240 * 160 * 4) idata = 새로운 ImageData(imgFrameBuffer, 240, 160) isWasmReady = 사실 document.getElementById('wasm-loading').hidden = true document.getElementById('select-rom').hidden = false }</pre> <p>스크립트를 다운로드하면 정상적으로 작동할 것으로 예상했습니다. 내 말은, 필요한 스크립트에 여전히 액세스할 수 있다는 뜻이죠, 그렇죠? <code>document.getElementById('select-rom').hidden = false</code>에서 true/false 문을 변경하여 텍스트를 숨기려고 했지만 아무 것도 작동하지 않는 것 같습니다. 어떤 아이디어가 있나요? 미리 감사드립니다. </p> <p>(그런데 vscode.dev에서 파일 경로를 찾고 있습니다. 다음과 같습니다: <code><script src="/Scripts/44gba.js"></script> < ;script src="/Scripts /app.js"></script> <script src="/Scripts/localforage.js"></script> <script src=/Scripts/pako.min .js></script></code> )</p>
P粉447495069P粉447495069414일 전789

모든 응답(1)나는 대답할 것이다

  • P粉550823577

    P粉5508235772023-09-02 11:05:59

    스크립트를 사용하여 애플리케이션을 로컬로 유지하려면 다음 두 가지를 기억하세요.

    1. 스크립트가 작성되었으며 현재 앱 디렉토리 구조에서 리소스(js, CSS, 그림)를 검색합니다
    2. CORS 실행 전 검사를 비활성화하지 않는 한 대부분의 브라우저에서 요청 및 파일 읽기가 CORS에 의해 차단됩니다.

    즉, 응답에서 받은 것과 동일한 HTML(https://gba.44670.org/ )을 복사하면 파일 구조가 보존됩니다. 이것이 내가 얻은 것입니다(index.html):

    으아악

    그러면 파일을 생성할 스크립트 경로를 볼 수 있습니다:

    으아악

    또한 WASM 파일(압축 651KB, 비압축 7.7MB)을 다운로드해야 합니다. 여기에서 타르볼을 다운로드할 수 있습니다(개발 도구의 "네트워크" 탭에서 찾을 수 있음): https://gba.44670.org/build/44gba.wasm

    마지막으로 필요한 모든 파일을 다운로드합니다(원하는 경우 아이콘과 이미지도 다운로드할 수 있지만 필수는 아닙니다):

    다음과 같은 구조를 얻게 됩니다:

    이제 브라우저에서 CORS를 비활성화할 수 있다면 좋을 것 같습니다. 하지만 그렇지 않은 경우에는 로컬 HTTP 서버에서 서비스를 제공해야 합니다. 한 가지 옵션은 NPM 패키지(https://www.npmjs.com/package/http-server )를 설치하고 npm install --global http-server를 실행하는 것입니다. 그런 다음 터미널에서 프로젝트 디렉터리로 이동하여 서버를 시작하세요.

    으아악

    올바른 화면이 표시되고 ROM을 로드하면 작업이 완료됩니다.

    편집자: 간단한 해킹으로 로컬 CORS 문제 해결

    당신이 지금 ChromeOS를 사용하고 있고 기술적으로 Node, NPM 및 HTTP 서버를 사용하여 처리하는 방법을 모르기 때문에 몇 가지 수정 사항을 적용하고 WASM 바이너리 콘텐츠를 직접 < code> build/44gba.js에 넣고 반환합니다. CORS 문제를 우회하기 위해 readBinary 함수의 바이너리 콘텐츠를 사용합니다. index.html을 직접 실행할 수 있습니다. 다음은 새로운 build/44gba.jsbuild/44gba.js 파일에 대한 링크입니다. 해당 내용을 다음 파일로 바꾸세요: https://sendeyo.com/en/b02f94b524 모두 괜찮습니다. 변경 사항은 다음과 같습니다.

    으아악

    회신하다
    0
  • 취소회신하다