この章では 3DS のソフトウェア構成について説明します。
4.1. アプリケーション
4.2. 標準アプリ、拡張アプリ
「2.5. 動作モード」で説明したように、SNAKE には CPU 性能等が異なる「標準モード」と「拡張モード」の 2 つの動作モードがあります。なお、CTR は動作モードが標準モードのみのプラットフォームとして扱います。
これに合わせるように、アプリケーション種別には SNAKE でも標準モードで動作する「標準アプリ」と SNAKE では拡張モードで動作する「拡張アプリ」の 2 つが存在します。
アプリケーション種別 | SNAKE | CTR | 備考 |
---|---|---|---|
標準アプリ | 標準モード | 標準モード | 過去の SDK でビルドされたアプリケーション含む |
拡張アプリ | 拡張モード | 標準モード |
4.2.1. 標準アプリの作成方法
CTR-SDK のビルドシステムを利用している場合は、OMakefile に "DESCRIPTOR = $(CTRSDK_ROOT)/resources/specfiles/ExtApplication.desc" があればその行をコメントアウトしてください。
VSI-CTR(要 VSI-CTR Platform 3.0.0 以降)を利用している場合は、プロジェクトの[構成プロパティ] - [全般] - [拡張アプリケーションを作成] を "いいえ" に変更してください。
4.2.2. 拡張アプリの作成方法
CTR-SDK のビルドシステムを利用している場合は、OMakefile に "DESCRIPTOR = $(CTRSDK_ROOT)/resources/specfiles/ExtApplication.desc" を追加してください。
VSI-CTR(要 VSI-CTR Platform 3.0.0 以降)を利用している場合は、プロジェクトの[構成プロパティ] - [全般] - [拡張アプリケーションを作成] を "はい" に変更してください。
4.2.3. 拡張モード使用時の注意事項
拡張モードでは L2 キャッシュが有効になりますが、L2 キャッシュは容量が大きいため nngxUpdaterBuffer() 等のパフォーマンスが低下する可能性があります。
このパフォーマンスの低下を防ぐため、拡張モードでは目的に合わせて API が分けられています。拡張モードで動作するアプリケーションにおいてグラフィックを扱う場合は、適切な API を使用するようにしてください。
4.2.4. 動作モードが切り替わるタイミング
SNAKE の動作モードは nn::applet::Enable()
が呼び出されたときに切り替わります。そのため、標準アプリであっても、3DSロゴの表示中とアプリケーションに制御が移ってから nn::applet::Enable()
を呼び出すまでは拡張モードで動作しています。
アプリケーションが起動しているかどうかにかかわらず、HOMEメニューが表示されているときの動作モードは拡張モードです。そのため、標準アプリが HOMEメニューの表示によって中断されると、標準モードから拡張モードに切り替わり、アプリケーションに戻ったときに標準モードに切り替わります。
また、「ゲームメモ」や「インターネットブラウザー」などのシステムアプレットはアプリケーションを中断しているため、HOMEメニューを表示したときと同じように、標準モードと拡張モードの切り替えが行われます。
アプリケーション種別 | ロゴ表示 | nn::applet::Enable() | アプリケーション | HOMEメニュー | ライブラリアプレット | システムアプレット |
---|---|---|---|---|---|---|
拡張アプリ | 拡張モード | 拡張モード | 拡張モード | 拡張モード | 拡張モード | 拡張モード |
標準アプリ | 拡張モード | 標準モード | 標準モード | 拡張モード | 標準モード | 拡張モード |
4.2.5. SNAKE と CTR でアプリケーションの挙動を変化させる
3DS シリーズに SNAKE が追加されたことにより、動作しているハードウェアの種別によってアプリケーションの挙動を変化させる必要が出てくることもあります。
アプリケーションが動作しているハードウェアの種別が SNAKE であるかどうかは nn::os::IsRunOnSnake()
で判断することができます。これにより、CTR の拡張スライドパッド相当の入力装置が標準搭載されている SNAKE では拡張スライドパッドの接続確認処理を省略するなど、ハードウェアの特性に合わせた実装が可能になります。
拡張アプリとして作成されたアプリケーションが SNAKE の拡張モードで動作しているかどうかは nn::os::IsRunningAsExtApplication()
で判断することができます。ただし、この関数は実行コストが高く、nninitStartUp()
内で呼び出すことができないなどの制限があります。
ハードウェアとアプリケーションの組み合わせで、nn::os::IsRunOnSnake()
と nn::os::IsRunningAsExtApplication()
が返す値は以下のようになります。
ハードウェア | アプリケーション | IsRunOnSnake() | IsRunningAsExtApplication() |
---|---|---|---|
SNAKE | 拡張アプリ |
true
|
true
|
標準アプリ |
true
|
false
|
|
CTR | 拡張アプリ |
false
|
false
|
標準アプリ |
false
|
false
|
拡張モードで強化される項目(アプリケーションが使用できるメモリのサイズや CPU 性能)を利用できるかの判断には、必ず nn::os::IsRunningAsExtApplication()
を使用してください。ただし、L2 キャッシュが有効になることにより追加されたキャッシュ操作関連の関数は標準モードでも使用することができます。
nn::os::IsRunOnSnake()
は上記以外で SNAKE と CTR とで異なる仕様となっている機器を利用できるかの判断に使用してください。
4.2.6. SNAKE 専用タイトル
アプリケーションの動作対象を SNAKE のみにする場合、bsf ファイルに SNAKE 専用(SNAKEOnly を True)の設定をしてください。 SNAKE 専用タイトルは CTR では起動しないため、CTR での動作を考慮する必要がなくなります。
bsf ファイルについては、CTR-SDK のツール「ctr_makebanner」のリファレンスを参照してください。
4.3. SDK で提供されるもの
3DS では、キー入力などの各種デバイスを扱うためのライブラリだけでなく、HOME メニューやいつの間に通信などを利用するためのアプレットやライブラリが提供されます。
4.3.1. アプレット
HOME メニューのように、アプリケーションに特定の目的を持った機能を提供し、アプレットで提供されている機能については、アプリケーションの開発にかかるコストの削減などに効果を発揮します。
利用可能なアプレットは任天堂が提供するものに限られています。デベロッパが独自のものを開発することはできません。
4.3.2. ライブラリ
CTR-SDK では、搭載されたハードウェアを利用するためのライブラリが用意されています。それぞれのライブラリはライブラリ名に即した名前空間を持ち、複数のクラスやメンバ関数で構成されています。
ライブラリは主に C++ で記述されていますが、C 言語用のラッパー関数も用意されています。C 言語用のラッパー関数については関数リファレンスを参照してください。以降の説明では、関数名などを C++ での記述に合わせています。
ライブラリ名 |
名前空間 |
説明 |
---|---|---|
OS |
|
オペレーションシステムに関係するクラスをまとめたライブラリです。 |
RO |
|
DLL 機能を提供するためのライブラリです。 |
APPLET |
|
アプレットの起動、ふた閉じのスリープなどに対応するためのライブラリです。 |
FS |
|
各メディア上のファイルにアクセスするためのライブラリです。 |
CX |
|
データの圧縮、解凍を行うためのライブラリです。 |
MATH |
|
算術・数値演算の関数をまとめたライブラリです。 |
CRYPTO |
|
暗号化を行うライブラリです。 |
FND |
|
ヒープ、時間など、基礎的なクラスをまとめたライブラリです。 |
FONT |
|
フォントデータを利用した文字描画のためのライブラリです。 |
HID |
|
デジタルボタン、スライドパッド、タッチパネル、加速度センサー、ジャイロセンサー、デバッグパッドからの入力を扱うライブラリです。 |
PTM |
|
電源とアラームを制御するライブラリです。 |
GX |
|
GPU、LCD の制御を行うライブラリです。3D グラフィックスの描画には gl、nngx 関数を使用します。 |
GD |
|
GX ライブラリの 3D グラフィックス描画関数を軽量化したライブラリです。 |
GR |
|
3D グラフィックスコマンドの直接生成を支援するライブラリです。 |
MIC |
|
マイクを使った自動サンプリングを行うライブラリです。 |
CAMERA |
|
カメラを使った画像キャプチャを行うライブラリです。 |
Y2R |
|
YUVtoRGB 回路を利用して、YUV から RGB への変換を行うライブラリです。 |
QTM |
|
SNAKE でのみ利用可能なフェイストラッキングを行うためのライブラリです。 |
DSP |
|
サウンド再生に DSP を利用するためのライブラリです。 |
SND |
|
サウンド再生を行うライブラリです。 |
AACDEC |
|
AAC データのデコードを行うためのライブラリです。 |
AACENC |
|
AAC データのエンコードを行うためのライブラリです。 |
NDM |
|
ネットワーク処理を行っているデーモンを制御するためのライブラリです。 |
UDS |
|
無線通信モジュールを利用したローカル通信を行うライブラリです。 |
RDT |
|
UDS ライブラリを利用して、信頼性のあるデータ通信を行うライブラリです。 |
CEC |
|
すれちがい通信の設定などを行うライブラリです。 |
DLP |
|
ニンテンドー 3DS ダウンロードプレイに対応するためのライブラリです。 |
AC |
|
インフラストラクチャ通信の自動接続を行うライブラリです。 |
BOSS |
|
ダウンロードタスクの登録などを行うライブラリです。 |
FRIENDS |
|
フレンドの情報にアクセスするためのライブラリです。 |
NEWS |
|
おしらせを投稿するためのライブラリです。 |
ACT |
|
アカウントシステムに登録された情報の取得や、認証をするライブラリです。 |
EC |
|
EC 機能を利用するためのライブラリです。 |
IR |
nn::ir
|
本体間赤外線通信を利用するためのライブラリです。 |
NFP |
|
amiibo™(アミーボ)と呼ばれるキャラクター商品とアプリケーションを連携させるためのライブラリです。 |
ULCD |
|
立体視表示で使用する左目、右目用のカメラ行列を算出するライブラリです。 |
JPEG |
|
JPEG 形式のエンコードとデコードを行うライブラリです。 |
TPL |
|
複数枚のテクスチャをまとめた TPL ファイルを扱うためのライブラリです。 |
CFG |
|
本体設定で扱われている情報を取得するライブラリです。 |
NGC |
|
NG ワードリストによって NG ワードをチェックするためのライブラリです。 |
UBL |
|
受信拒否リストを管理するためのライブラリです。 |
PL |
|
3DS 固有の機能(歩数情報など)を使用するためのライブラリです。 |
UTIL |
|
ユーティリティ関数のライブラリです。 |
ENC |
|
文字コード変換を行うライブラリです。 |
ERR |
|
エラー処理のためのライブラリです。 |
ERREULA |
|
エラー・EULA アプレットを使用するためのライブラリです。 |
SWKBD |
|
ソフトウェアキーボードアプレットを使用するためのライブラリです。 |
PHTSEL |
|
写真選択アプレットを使用するためのライブラリです。 |
VOICESEL |
|
音声選択アプレットを使用するためのライブラリです。 |
EXTRAPAD |
|
拡張スライドパッド補正アプレットを使用するためのライブラリです。 |
WEBBRS |
|
インターネットブラウザーを使用するためのライブラリです。 |
OLV |
|
Miiverse アプリ、投稿アプリを使用するためのライブラリです。 |
SOCKET |
|
(デバッグ用途のみ)ソケット通信を行うライブラリです。 |
SSL |
|
(デバッグ用途のみ)SSL による通信を行うライブラリです。 |
HTTP |
|
(デバッグ用途のみ)HTTP 通信を行うライブラリです。 |
DBG |
|
デバッグ補助のためのライブラリです。 |
HIO |
|
(デバッグ用途のみ)Host IO を利用するためのライブラリです。 |
MIDI |
|
(デバッグ用途のみ)MIDI を利用するためのライブラリです。 |
※ ライブラリの構成や名前は今後変更される場合があります。
4.4. エラー処理について
3DS では本体更新によりライブラリが更新されるため、アプリケーションを開発した時点では定義されていなかった値を処理結果として返す可能性があります。このようなケースに問題なく対応するためにも、処理の成否は必ず nn::Result::IsSuccess()
もしくは nn::Result::IsFailure()
で判定するようにしてください。
成否を確認せずに一致判定のみでエラー処理を行うことは、想定外のエラーが発生した際に意図しない成功または意図しない失敗と判定してしまう危険性があるため推奨しません。
リファレンスにある症状とは異なるエラーが特定の個体でのみ発生する場合は、そのハードの故障を疑ってみてください。