ページ

2013年9月24日火曜日

ぼくのかんがえたすちーむぼっくす その3

前回はSteamBoxのOSについて妄想しました。まとめると以下のような感じですかね。
OS = Ubuntu 12.04 LTS (Ubuntu Coreバージョン)
UI = Steamクライアント (ビッグピクチャーモード固定?)
まず何故Ubuntu 12.04なのかですが、Linuxディストリビューションの中で最もアクティブなユーザー数が多い事と、12.04は長期サポート (LTS) 版である事が理由だと思います。またUbuntu Coreという組み込み向け(といっても、本来の組み込みというより、Windowsのエンベデッド版に近い感じ)で最小構成で利用可能だからだと思います。

UIは正直まだ判りませんが、Valveの発表を見ると「リビングルーム」を強調しているので、もしかしたら通常のSteamクライアントのUIは封印されてビッグピクチャーモードのみで運用するのかもしれませんね。通常のSteamクライアントが使えるとしても、Ubuntu上でSteamクライアントを立ち上げるような感じではなく、ブートして、そのままSteamクライアントへログインするという感じになるかもしれません。感覚としてはChromeOSに近いかもと思っているのですが、正直全然判りません。

ウィンドウシステムは12.04という事でデフォルトの「X.Org Server」の確率が高いでしょうね。今話題の「Mir」あるいは「Wayland」は、商用のシステムで実戦投入するには時期尚早ですしね。12.04はLTSなので「2017年4月」がサポートの最終期限ですし。恐らく2015年くらいには、MirかWaylandも落ち着いてくるでしょうし(適当ですが)。

ちなみにSteamは、この厄介な次世代ウィンドウシステム戦争をどう考えているのかというと、ValveにいろいろとアドバイスをしているプログラマーのRyan C. Gordon(icculus)氏は以下のようにツイッターでコメントしています。

またicculus氏は、この厄介な問題の解決策として、Valveは「SDL2.0」を積極的に使って対処するだろうともコメントしています。
This isn't strictly true. Most of the current titles are using SDL, which uses GLX behind the scenes. One could swap out the game's included SDL library with a build that targets Wayland or Mir, and the game would run without an X server and not know or care that it's not using X11. This can happen without updating the game binaries directly.

For games that don't ship their own copy of SDL (and thus use the one included in the Valve Runtime by default), you don't even have to touch the game's depot at all. Valve just needs to update their Runtime package and it's good to go.

SDL is smart enough to try to use Wayland or Mir first, and if they aren't available, use X11, so one copy of SDL will work on whatever the current system has.

This is an oversimplication; there are probably games that use SDL but will cheat and try to talk to an X server directly for various reasons--but this is rare--and there's at least one big game on Steam that's talking to GLX directly without using SDL. But by and large, switching the Linux Steam library from X11 to Wayland and/or Mir is not only doable, it's probably relatively easy.

--ryan.
要約すると、WaylandかMirかX.orgかと言った厄介な問題はイチイチ考えず、Valveが配布している「Valve Runtime」に含まれているSDL2.0を開発者が使ってくれれば、後はValve Runtimeが面倒見てくれるよと……。もしかしたら大幅に間違っているかもしれませんが、取り敢えずValve Runtimeを使っておけばOKみたいな感じですかね(適当)。

ちなみにValve Runtimeは今の所、以下のようなパッケージ内容になっているようです。これって、Valveが推奨しているゲーム制作用のライブラリー群って事で良いんですかね? 正直、理解不足なんですけど……。ちなみにValveのGitHubでDL可能みたいです:-)
acl libacl1 libacl1-dev
alsa-lib libasound2 libasound2-dev
alsa-plugins libasound2-plugins
atk1.0 libatk1.0-0 libatk1.0-dev
attr libattr1 libattr1-dev
avahi libavahi-common3 libavahi-common-dev libavahi-client3 libavahi-client-dev
bzip2 libbz2-1.0 libbz2-dev
cairo libcairo2 libcairo2-dev
cups libcups2 libcups2-dev
curl libcurl3 libcurl3-gnutls libcurl4-gnutls-dev
cyrus-sasl2 libsasl2-2 libsasl2-dev
d-conf dconf-gsettings-backend
dbus libdbus-1-3 libdbus-1-dev
dbus-glib libdbus-glib-1-2 libdbus-glib-1-dev
dummygl dummygl-dev
e2fsprogs libcomerr2 comerr-dev
expat libexpat1 libexpat1-dev
flac libflac8 libflac-dev
fltk1.1 libfltk1.1 libfltk1.1-dev
fontconfig libfontconfig1 libfontconfig1-dev
freeglut freeglut3 freeglut3-dev
freetype libfreetype6 libfreetype6-dev
gcc-4.6 libgcc1 libstdc++6 libstdc++6-4.6-dev libstdc++6-4.6-pic libgomp1 gcc-4.6-base
gconf libgconf-2-4 libgconf2-dev
gdk-pixbuf libgdk-pixbuf2.0-0 libgdk-pixbuf2.0-dev
glew libglew1.6 libglew1.6-dev
glib2.0 libglib2.0-0 libglib2.0-dev
gmp libgmp10 libgmp-dev
gnutls26 libgnutls26 libgnutls-dev
gst-plugins-base0.10 libgstreamer-plugins-base0.10-0 libgstreamer-plugins-base0.10-0-dev
gstreamer0.10 libgstreamer0.10-0 libgstreamer0.10-0-dev
gtk+2.0 libgtk2.0-common libgtk2.0-0 libgtk2.0-dev
gtk2-engines gtk2-engines
gtk2-engines-murrine gtk2-engines-murrine
gtk2-engines-pixbuf gtk2-engines-pixbuf
heimdal libasn1-8-heimdal libgssapi3-heimdal libhcrypto4-heimdal libheimbase1-heimdal libheimntlm0-heimdal libhx509-5-heimdal libkrb5-26-heimdal libroken18-heimdal libwind0-heimdal
jack-audio-connection-kit libjack0 libjack-dev
jasper libjasper1 libjasper-dev
json-c libjson0 libjson0-dev
keyutils libkeyutils1 libkeyutils-dev
krb5 libkrb5-3 libkrb5-dev libk5crypto3 libkrb5support0 libgssapi-krb5-2 krb5-multidev
lcms2 liblcms2-2 liblcms2-dev
libappindicator libappindicator1 libappindicator-dev
libasyncns libasyncns0 libasyncns-dev
libav libavcodec53 libavcodec-dev libavfilter2 libavfilter-dev libavformat53 libavformat-dev libavutil51 libavutil-dev libswscale2 libswscale-dev
libcanberra libcanberra0 libcanberra-dev libcanberra-gtk0 libcanberra-gtk-dev libcanberra-gtk-module
libcap2 libcap2 libcap-dev
libdbusmenu libdbusmenu-glib4 libdbusmenu-gtk4
libexif libexif12 libexif-dev
libffi libffi6 libffi-dev
libgcrypt11 libgcrypt11 libgcrypt11-dev
libgpg-error libgpg-error0 libgpg-error-dev
libgsm libgsm1 libgsm1-dev
libice libice6 libice-dev
libidn libidn11 libidn11-dev
libindicator libindicator7 libindicator-dev
libjpeg6b libjpeg62 libjpeg62-dev
libjpeg-turbo libjpeg-turbo8
libmad libmad0 libmad0-dev
libmikmod libmikmod2 libmikmod2-dev
libnotify libnotify4 libnotify-dev
libogg libogg0 libogg-dev
#libogre-1.7.4 libogre-1.7.4 libogre-dev
libpng libpng12-0 libpng12-dev
libsamplerate libsamplerate0 libsamplerate0-dev
libsdl1.2 libsdl1.2debian libsdl1.2-dev
libsdl2 libsdl2 libsdl2-dev
libsdl2-image libsdl2-image libsdl2-image-dev
libsdl2-mixer libsdl2-mixer libsdl2-mixer-dev
libsdl2-net libsdl2-net libsdl2-net-dev
libsdl2-ttf libsdl2-ttf libsdl2-ttf-dev
libselinux libselinux1 libselinux1-dev
libsm libsm6 libsm-dev
libsmpeg0 libsmpeg0 libsmpeg-dev
libsndfile libsndfile1 libsndfile1-dev
libtasn1-3 libtasn1-3 libtasn1-3-dev
libtheora libtheora0 libtheora-dev
libtool libltdl7 libltdl-dev
libusb-1.0 libusb-1.0-0 libusb-1.0-0-dev
libva libva1 libva-dev
libvorbis libvorbis0a libvorbisfile3 libvorbisenc2 libvorbis-dev
libvpx libvpx1 libvpx-dev
libx11 libx11-6 libx11-dev libx11-xcb1 libx11-xcb-dev libx11-data
libxau libxau6 libxau-dev
libxaw libxaw7 libxaw7-dev
libxcb libxcb1 libxcb1-dev libxcb-shm0 libxcb-shm0-dev libxcb-render0 libxcb-render0-dev libxcb-glx0 libxcb-glx0-dev
libxcomposite libxcomposite1 libxcomposite-dev
libxcursor libxcursor1 libxcursor-dev
libxdamage libxdamage1 libxdamage-dev
libxdmcp libxdmcp6 libxdmcp-dev
libxext libxext6 libxext-dev
libxfixes libxfixes3 libxfixes-dev
libxi libxi6 libxi-dev
libxinerama libxinerama1 libxinerama-dev
libxml2 libxml2 libxml2-dev
libxmu libxmu6 libxmu-dev
libxpm libxpm4 libxpm-dev
libxrandr libxrandr2 libxrandr-dev
libxrender libxrender1 libxrender-dev
libxss libxss1 libxss-dev
libxt libxt6 libxt-dev
libxtst libxtst6 libxtst-dev
libxxf86vm libxxf86vm1 libxxf86vm-dev
mesa libglu1-mesa libglu1-mesa-dev
ncurses libncursesw5 libncursesw5-dev libtinfo5 libtinfo-dev
network-manager network-manager-dev libnm-util2 libnm-util-dev libnm-glib4 libnm-glib-dev
nspr libnspr4 libnspr4-dev
nss libnss3 libnss3-dev
nvidia-cg-toolkit nvidia-cg-toolkit libcg
openal-soft libopenal1 libopenal-dev
openldap libldap-2.4-2 libldap2-dev
openssl libssl1.0.0 libssl-dev
orc liborc-0.4-0 liborc-0.4-dev
p11-kit libp11-kit0 libp11-kit-dev
pango1.0 libpango1.0-0 libpango1.0-dev
pcre3 libpcre3 libpcrecpp0 libpcre3-dev
pixman libpixman-1-0 libpixman-1-dev
pulseaudio libpulse0 libpulse-dev
rtmpdump librtmp0 librtmp-dev
schroedinger libschroedinger-1.0-0 libschroedinger-dev
sdl-image1.2 libsdl-image1.2 libsdl-image1.2-dev
sdl-mixer1.2 libsdl-mixer1.2 libsdl-mixer1.2-dev
sdl-ttf2.0 libsdl-ttf2.0-0 libsdl-ttf2.0-dev
speex libspeex1 libspeex-dev libspeexdsp1 libspeexdsp-dev
sqlite3 libsqlite3-0 libsqlite3-dev
tbb libtbb2 libtbb-dev
tcp-wrappers libwrap0 libwrap0-dev
tdb libtdb1 libtdb-dev
tiff libtiff4 libtiff4-dev
udev libudev0 libudev-dev libgudev-1.0-0 libgudev-1.0-dev
util-linux libuuid1 uuid-dev
x11proto-composite x11proto-composite-dev
x11proto-core x11proto-core-dev
x11proto-fixes x11proto-fixes-dev
x11proto-input x11proto-input-dev
x11proto-kb x11proto-kb-dev
x11proto-randr x11proto-randr-dev
x11proto-render x11proto-render-dev
x11proto-scrnsaver x11proto-scrnsaver-dev
x11proto-xext x11proto-xext-dev
x11proto-xf86vidmode x11proto-xf86vidmode-dev
xft libxft2 libxft-dev
xtrans xtrans-dev
zenity zenity
zlib zlib1g zlib1g-dev
私の浅い解釈だと、Valveは互換性維持の為にオープンソースなライブラリー、とりわけSDL2.0を強く推奨しているようですね。以前もこのブログで書きましたが、SDLのメイン開発者である「Sam Lantinga(Slouken)」氏がValve入りしていますし。

誤解を恐れずSDLを説明すると、オープンソースかつクロスプラットフォームな「DirectX」って説明が一番近いですかね。Direct3DはOpneGLですが、他の例えばキーボードやコントローラーの出入力や2Dのサウンド、フォントの取り扱いとかですか? プログラマーじゃないんで適当で申し訳ないんですが:-(

実際、SDL2.0になってから、コントローラーの取り扱いはかなり改善されているようです。以前のバージョンだと、コントローラーの扱いがあんまり良くなかったので、例えば有名なエミュレーターである「Mednafen」なんかは、SDLから他のライブラリーに1年前くらいから変更してしまいましたし……。実際に最近になってValveはWindows版の「Team Fortress 2」でのコントローラーの取り扱いをSDL2.0に変更していますし。

この事から考えられる事は、ValveはSteamBoxに置いて、PS4のように独自APIを追加するのではなく、逆にSDLやOpenGL、その他のオープンソースなクロスプラットフォームを多用して、クロスプラットフォームでの互換性を最大限に優先するのではないかと思われます。

この事はオープンソース愛好者からすると、嬉しい事ではあるのですが、SteamBoxがPS4のような次世代機と「ガチ」な性能競争ではかなり不利になる事にもなりかねないので、ゲーム機ファンとしては、少し残念ではありますけどね:-( 互換性と性能の両立というのは、なかなかに難しいものです……。

またまた長くなったので一旦終わります。次はハードウェアについて書きたいのですが、正直2時までに間に合うかわかりません……。

#外部リンク
[Phoronix] Valve's Steam Box Will Most Likely Use An X.Org Server
http://www.phoronix.com/scan.php?page=news_item&px=MTMxODc

steam-runtime/README.md at master · ValveSoftware/steam-runtime · GitHub
https://github.com/ValveSoftware/steam-runtime/blob/master/README.md

Mednafen Forum: Development => Mednafen 0.9.25-WIP
http://forum.fobby.net/index.php?t=msg&goto=2694&

0 件のコメント:

コメントを投稿