0

私は OpenGL と SDL を使用していくつかのクロスプラットフォーム コードに取り組んでいますが、すぐに Mac OSX で問題が発生しました。

参考までに、GitHub のコードベースは次のとおりです: https://github.com/GrooveStomp/platformer

また、表示されているエラーを同じレポにプッシュしました: https://github.com/GrooveStomp/platformer/blob/master/errors.txt

今、私が行った読書から、SDL は単に Mac OSX の Objective-C Cocoa レイヤーをラップしているように見えます。プログラム全体をラップするには、独自の NSAutoreleasePool を宣言する必要があります。あれは正しいですか?

このリンクに出くわしました: http://sourceforge.net/apps/wordpress/paintown/2010/12/26/sdl-and-osx/著者がソースからインストールし、問題はありません。ビルド時に「-framework OpenGL」を指定する必要があるため、作者のステップ#3と同等であると想定するHomebrewを使用してインストールしました。

[編集]

したがって、NSAutoreleaseNoPool() の問題は、次の 3 つの手順に従って処理する必要があることがわかります。

  1. main() には次のシグネチャが必要です: int main(int argc, char * argv[])
  2. main() があるソース ファイルに #include <SDL.h> を追加します。
  3. -lSDLmain でリンク

その結果、SDL は独自の main() を NSAutoreleasePool でラップし、メイン全体をラップします。ただし、これを行うと、次のエラーが表示されます。

https://github.com/GrooveStomp/platformer/blob/master/make_errors.txt

4

1 に答える 1

1

NSAutoreleasePool が配置されていないスレッドで Objective-C メッセージを送信すると、メモリ「Just Leaking」に関するメッセージが表示されます。プログラム全体を自動解放プールにラップすることの問題は、プログラムが排出されず、メモリ不足のリスクがあることです。代わりに、イベント ループの開始時にプールを作成し、各反復の終了時にドレインします。これを行うと、「ジャスト リーク」エラーがすべて修正されるはずです。

NSAutorelasePool オブジェクトは通常のオブジェクトではないため、適切な使用法は他のほぼすべての Cocoa オブジェクトとは少し異なります。サンプルは次のとおりです。


while(1)
{
    NSAutoreleasePool* pool = [NSAutoreleasePool new];

    // Do your event processing

    [pool drain];
}
于 2011-02-17T17:21:07.917 に答える