Emulatory konsol do gier - Java

0

Od jakiegoś czasu zgłębiam wiedzę odnośnie działania i tworzenia emulatorów konsol do gier. Dostępnych informacji na ten temat jest całkiem sporo, ale oczywiście większość z nich jest pod kątem C/C++.
Interesuje mnie kwestia pisania takich emulatorów w Javie. Wiem, że to zupełnie możliwe, ale osobiście nie widziałem nigdy emulatora w tym języku, który byłby pod konsole mocniejsze niż PS1 (widziałem jeden pod N64 z 2009, ale to był jeden jedyny, a emulacja N64 ogółem jest naprawdę trudna i do dziś mocno wadliwa, więc tamten to był najprawdopodobniej proof of concept). Były też jakieś próby z PS2 i coś tam im się udawało, ale nie był to tak naprawdę funkcjonalny emulator. Oczywiście wiem, że takie rzeczy jak Dolphiny i inne Cemu to naprawdę skomplikowane projekty, więc przyczyn niepowodzeń może być bardzo wiele - techniczne to tylko jedna z kategorii.

Problem z emulatorami opartymi o Javę jest taki, że większość z nich jest potwornie stara lub/i praca nad nimi została przerwana w trakcie. Większość z nich ma stosunkowo niskie accuracy, o bugach już nie wspominając. Dokumentacji i ogólem informacji na ich temat jest bardzo mało.

Czy ktoś z Was ma wiedzę na temat pisania tego typu oprogramowania w Javie lub w innych językach? Czy używając najnowszych JVM można się jakkolwiek zbliżać wydajnością do dobrze napisanych emulatorów w C/C++? Jeśli nie, to jakiego kalibru różnicy byście się spodziewali? Czy oprócz tego są jakieś inne poważne konsekwencje wyboru tego typu niestandardowego języka w takim projekcie?
Interesuje mnie praktycznie wszystko na ten temat, więc każda informacja będzie mile widziana.

2
C.mind napisał(a):

Czy używając najnowszych JVM można się jakkolwiek zbliżać wydajnością do dobrze napisanych emulatorów w C/C++?
Jeśli nie, to jakiego kalibru różnicy byście się spodziewali?

Najbardziej bałbym się, że GC włączy się podczas gry. Będzie stop-the-world i po grze. Możliwe że rozwiązaniem jest GraalVM, ale jeszcze nie używałem.
Jeśli miałbym możliwość wyboru języka programowania do takiego projektu to wybrałbym Rust. Wydajność C/C++, a kontrola typów jak w Haskellu.

4

GraalVM jest o tyle ciekawy, że jest napisany w Javie i udostępnia swój wewnętrzny model reprezentacji kodu wykonywalnego, czyli AST (abstract syntax tree). Działa to tak, że po swojej stronie tłumaczysz kod programu (obojętnie czy tekstowy kod źródłowy czy np binarny bitkod) na AST, a następnie GraalVM zajmuje się interpretowaniem tego AST oraz JITowaniem go do kodu natywnego. Na tej zasadzie działa np GraalVM Sulong - jest tam lli (formalnie interpreter bitkodu LLVMowego), który osiąga wysoką wydajność dzięki JITowi. Nie wiem na ile takie rozwiązanie sprawdziłoby się podczas pisania emulatorów - o to zapytaj na listach mailingowych GraalVMa.

Najbardziej bałbym się, że GC włączy się podczas gry. Będzie stop-the-world i po grze.

Są GC, które mają bardzo krótkie fazy stop-the-world, schodzące nawet poniżej milisekundy:

Z tego co wiem nie są jeszcze obsługiwane przez GraalVMa, ale w ciągu kilku lat prawdopodobnie będą.

Wykorzystanie typowej Javy (np standardowej Javy 8) najprawdopodobniej nie będzie rozsądne przez to, że standardowa Java jak na razie oferuje niewiele efektywnych niskopoziomowych optymalizacji. Jest bardziej zorientowana pod wysoką wydajność w kodzie typowo obiektowym/ biznesowym/ wysokopoziomowym/ etc

1 użytkowników online, w tym zalogowanych: 0, gości: 1