에뮬레이터 오류 발생
P粉447495069
2023-09-01 20:53:31
<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>
스크립트를 사용하여 애플리케이션을 로컬로 유지하려면 다음 두 가지를 기억하세요.
즉, 응답에서 받은 것과 동일한 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 바이너리 콘텐츠를 직접 build/44gba.js에 넣고 반환합니다. CORS 문제를 우회하기 위해 readBinary 함수의 바이너리 콘텐츠를 사용합니다. index.html을 직접 실행할 수 있습니다. 다음은 새로운
으아악build/44gba.js
build/44gba.js
파일에 대한 링크입니다. 해당 내용을 다음 파일로 바꾸세요: https://sendeyo.com/en/b02f94b524 모두 괜찮습니다. 변경 사항은 다음과 같습니다.