SDL ライブラリを使用して単純なゲームのコードを実行しています。これに関して2つの質問があります:
ブレークポイントを設定せずにプログラムを単独で実行すると、メモリ使用量が高くなります (最初と比べて 20 ~ 30 倍)。しかし、ループ(ゲームのメインループ)を止めて自分でクリックすると、100回くらいクリックしてもメモリ使用量は変わらない(?)。なんで?
そのため、ループ内で新しい要素を破棄せずに追加できると考えているため、instrument を使用してその理由を分析することにしました。そして、Instrument でレコードをヒットするたびに、アプリは 5 秒間継続し、クラッシュ レポートでシャットダウンします (アプリは xcode でメモリを使用して完全に実行されます)。
スレッド 0 がクラッシュしました:: ディスパッチ キュー: com.apple.main-thread
0 org.libsdl.SDL2 0x0000000100f5bea9 0x100ee9000 + 470697
1 スパイク 10 0x0000000100ea40cc imageTexture::render() + 50 (imageTexture.cpp:37)
2 スパイク 10 0x0000000100ea2b70 GUI::renderImage() + 40 (GUI.cpp:140)
3 スパイク 10 0x0000000100ea30b2 GUI::run() + 1258 (GUI.cpp:172)
4 スパイク 10 0x0000000100ea439e メイン + 36 (main.cpp:15)
5 libdyld.dylib 0x00007fff8c60f5ad 開始 + 1
これらは、関連していると思われるいくつかのコードです。
3 番目の場合: //imageVector はすべての imageVector ポインターを含む単なるベクターです。
SDL_RenderClear( gRenderer );
for (int i = 0; i < imageVector.size(); i++) {
imageVector[i]->render();
}
番号 2 の場合:
//set rendering space and render to screen
SDL_Rect temp = {x, y, width, height};
//render to the screen
SDL_RenderCopy(gRenderer, texture, NULL, &temp);
コードを無効/有効にして何が起こるかを長い間試した後、何が問題なのかまだわかりません。
これは私の現在のループです:
while (true) {
textVector[0]->setInput(system->output());
renderImage();
renderText();
SDL_RenderPresent( gRenderer );
}
それのためのいくつかのコード:
void textTexture::setInput(std::string newText) {
gText = newText;
}
void GUI::renderImage() {
SDL_RenderClear( gRenderer );
for (int i = 0; i < imageVector.size(); i++) {
imageVector[i]->render();
}
}
void GUI::renderText() {
for (int i = 0; i < textVector.size(); i++) {
textVector[i]->render();
}
}
void textTexture::render() {
//set rendering space and render to screen
SDL_Rect temp = {x, y, width, height};
//recreate the texture
createTextureFromRenderedText(gText);
//render to the screen
SDL_RenderCopy(gRenderer, texture, NULL, &temp);
}
void textTexture::createTextureFromRenderedText(std::string text) {
if (text != "") {
SDL_Surface* textSurface = TTF_RenderText_Blended_Wrapped(gFont, text.c_str(), textColor, 600);
if( textSurface == NULL )
{
printf( "Unable to render text surface! SDL_ttf Error: %s\n", TTF_GetError() );
}
else
{
//Create texture from surface pixels
texture = SDL_CreateTextureFromSurface( gRenderer, textSurface );
if( texture == NULL )
{
printf( "Unable to create texture from rendered text! SDL Error: %s\n", SDL_GetError() );
}
else
{
//Get image dimensions
width = textSurface->w;
height = textSurface->h;
}
//Get rid of old surface
SDL_FreeSurface( textSurface );
}
}
}