воскресенье, 22 апреля 2012 г.

Alynx - Эмулятор Atari Lynx для Android

16/08/2012, aLynx теперь Open Source! Линк
31/05/2012, начиная с версии 1.02 используются исходники Handy 0.95, перипетии с GPL более не актуальны .
29/04/2012, совсем забыл про скриншоты, добавил.

    Два месяца назад администратор форума emu-mobi.com - murrenna предложил мне портировать эмулятор Atari Lynx - Handy/SDL, использующий для ввода-вывода библиотеку SDL. Буквально на следующий день порт был готов. Но из-за того, что эмулятор был ориентирован на запуск из командной строки, не было ни меню, ни настроек, нельзя было выбрать ром (только переименовывать и помещать в нужную папку). Тогда я подумал что неплохо будет сделать версию без SDL, со стандартным GUI, за одно не будет лишним узнать об особенностях программирования под Android, использование в проекте JNI, OpenGL ES.
 
    Подробный отчет о ходе работы можно почитать в теме по эмулятору. Тут лишь расскажу об основных возможностях и своими мыслями об программировании под Android.
Возможности:
  • Работает на Android OS версии 2.1 и выше;
  • Запуск ромов на полной скорости;
  • Вывод звука;
  • Возможность редактировать позиции на-экранных падов, позицию и размер выводимого изображения;
  • Для ввода поддерживается мультитач, хардварные кнопки;
  • Несколько типов рендеринга изображения (Canvas, OpenGL ES, OpenGL ES Native);
  • Для улучшения или придание эффектов изображению можно использовать десяток фильтров (только в полной версии);
  • Сохранение и загрузка игровых состояний в любое время (только в полной версии);
    Когда начинал писать эмулятор ("эмулятор" конечно громко сказано, скорее всего GUI) обладал небольшими знаниями в Java и околонулевыми в программировании под Android (пара quick SDL портов не в счет), но в интернете очень много различной информации, так что с этим освоился достаточно быстро.

    Сначала, в качестве рендера использовал OpenGL, но на PowerVR GPU ничего не рисовалось, пришлось перейти на Canvas. Потом я узнал в чем проблема - использование текстур не в степени двойки и добавил выбор рендера - Canvas/OpenGL. Так как при GL рендеринге нужно создавать новую текстуру каждый кадр - работал он не очень быстро и с рандомными подвисаниями (когда срабатывал сборщик мусора). Но картинку, даже не смотря на фильтры, он отрисовывал лучше, чем Canvas, нужно было искать как его ускорить. И вот, после очередного гугления, я наткнулся на интересную статью об нативном GL рендеринге. Это же как раз то, что нужно - нет необходимости передавать RGB565 массив изображения (Си->JNI->Java), размером 38кб, каждый кадр; работа с GL происходит в нативной части, то есть создание текстуры займет чуть меньше времени. Результат на лицо - вместо 15фпс стало 22! (все тестировал исключительно в эмуляторе). Так что в список рендеров вошел еще и нативный GL.

    Так же мне хотелось бы высказаться об платной версии. Несмотря на то, что исходный код Handy/SDL открыт и распространяется под лицензией GPL, нигде я не нашел что исходные коды с этой лицензией запрещено включать в состав платных программ. А если не запрещено, то, стало быть, - можно. Чтение различной информации по этому вопросу так же подтвердило, что измененные исходные коды под GPL должны быть выложены на всеобщее обозрение или вручены покупателям приложения, по первому запросу. Я решил, что если кто-нибудь спросит  - выложу измененные исходники, которые попадают под это требование. Исходники нативного GL рендеринга, а уж тем более Java части под это требование не попадают, так как написаны мной и уж тем более не под GPL лицензией :)

    Скачать:
    Alynx free
    aLynx

    Так как рисовать я особо не умею - графика убогая, а пады в нативе, после преобразования из RGBA8888 в RGBA4444 становятся вообще неузнаваемые, может быть попозже ко мне придет просветление и я нарисую все на отлично.

    А теперь слова благодарности - благодарю всех тех, кто принимал активное участие в обсуждениях о разработке эмулятора, активно тестировал тестовые сборки, выявлял различные ошибки. Вот их имена:
    murrenna
    PASHA
    Ruzel
    EXL


А вот и забытые скриншоты:

Главное меню
Настройки

Настройки падов, можно двигать и менять
размер картинки, а также передвигать и
менять прозрачность падов


Можно установить кнопки консоли
на хардварные кнопки
Справка
Выбор рома

Игра Desert Strike с фильтром 2xSAI
Меню сохранения и загрузки игровых
состояний

6 комментариев:

  1. А в чем различия между платной и бесплатной версией?

    ОтветитьУдалить
    Ответы
    1. В платной фильтры и сохранения, а так они полностью идентичны.

      Удалить
  2. ну если не жалко, я-бы попросил выложить хотя-бы отдельные куски кода, которые ты используешь для рендеринга, если можно, буду благодарен, спасибо!

    ОтветитьУдалить
    Ответы
    1. А что конкретно интересует? Создание битмапа в Java части и копирование в него изображение из Си? Или как реализовать нативный GL рендеринг? По последнему постараюсь написать простенькую демку и залить исходники на гуглокод.

      Удалить
    2. во, спасибо(по второму пункту), именно рендеринг!!!

      Удалить
  3. Этот комментарий был удален автором.

    ОтветитьУдалить