RenderTargetのGCまわりでSEGVする問題修正
@@ -179,6 +179,7 @@ | ||
179 | 179 | static void Window_setDefaultIcon( void ); |
180 | 180 | static void Window_createCircleShader(void); |
181 | 181 | static void Window_createCircleFillShader(void); |
182 | +static void CleanRenderTargetList( void ); | |
182 | 183 | |
183 | 184 | /********************************************************************* |
184 | 185 | * Windowモジュール |
@@ -559,17 +560,21 @@ | ||
559 | 560 | // デバイスロストから復帰した |
560 | 561 | if( ret == 0 ) |
561 | 562 | { |
563 | + rb_gc_start(); | |
562 | 564 | for( i = 0; i < g_RenderTargetList.count; i++ ) |
563 | 565 | { |
564 | - struct DXRubyRenderTarget *rt = (struct DXRubyRenderTarget *)g_RenderTargetList.pointer[i]; | |
566 | + if( g_RenderTargetList.pointer[i] ) | |
567 | + { | |
568 | + struct DXRubyRenderTarget *rt = (struct DXRubyRenderTarget *)g_RenderTargetList.pointer[i]; | |
565 | 569 | #ifdef DXRUBY15 |
566 | - // 再生成Procが設定されている場合 | |
567 | - if( rt->vregenerate_proc != Qnil ) | |
568 | - { | |
569 | - rb_funcall( rt->vregenerate_proc, SYM2ID( symbol_call ), 0 ); | |
570 | - rt->clearflag = 0; | |
570 | + // 再生成Procが設定されている場合 | |
571 | + if( rt->vregenerate_proc != Qnil ) | |
572 | + { | |
573 | + rb_funcall( rt->vregenerate_proc, SYM2ID( symbol_call ), 0 ); | |
574 | + rt->clearflag = 0; | |
575 | + } | |
576 | +#endif | |
571 | 577 | } |
572 | -#endif | |
573 | 578 | } |
574 | 579 | } |
575 | 580 |
@@ -582,37 +587,12 @@ | ||
582 | 587 | rt->PictureDecideSize = 0; |
583 | 588 | for( i = 0; i < RARRAY_LEN(rt->varray); i++ ) |
584 | 589 | { |
585 | -// Image_dispose( RARRAY_PTR(rt->array)[i] ); | |
586 | 590 | Image_dispose( RARRAY_AREF(rt->varray, i) ); |
587 | 591 | } |
588 | 592 | rb_ary_clear( rt->varray ); |
589 | 593 | } |
590 | 594 | |
591 | - // RenderTargetに関連付けられた内部生成Imageの破棄 | |
592 | - for( i = 0; i < g_RenderTargetList.count; i++ ) | |
593 | - { | |
594 | - struct DXRubyRenderTarget *rt = (struct DXRubyRenderTarget *)g_RenderTargetList.pointer[i]; | |
595 | - int j; | |
596 | - rt->PictureCount = 0; | |
597 | - rt->PictureSize = 0; | |
598 | - rt->PictureDecideCount = 0; | |
599 | - rt->PictureDecideSize = 0; | |
600 | -#ifdef DXRUBY15 | |
601 | - if( rt->vregenerate_proc == Qnil ) | |
602 | - { | |
603 | - rt->clearflag = 0; | |
604 | - } | |
605 | -#else | |
606 | - rt->clearflag = 0; | |
607 | -#endif | |
608 | - for( j = 0; j < RARRAY_LEN(rt->varray); j++ ) | |
609 | - { | |
610 | -// Image_dispose( RARRAY_PTR(rt->array)[j] ); | |
611 | - Image_dispose( RARRAY_AREF(rt->varray, j) ); | |
612 | - } | |
613 | - rb_ary_clear( rt->varray ); | |
614 | - } | |
615 | - | |
595 | + CleanRenderTargetList(); | |
616 | 596 | g_RunningTime = GetSystemCounter() - g_StartTime; |
617 | 597 | |
618 | 598 | g_WindowInfo.input_updated = 0; |
@@ -2184,23 +2164,34 @@ | ||
2184 | 2164 | { |
2185 | 2165 | if( g_RenderTargetList.pointer[i] == rt ) |
2186 | 2166 | { |
2167 | + g_RenderTargetList.pointer[i] = NULL; | |
2187 | 2168 | break; |
2188 | 2169 | } |
2189 | 2170 | } |
2190 | -// if( i == g_RenderTargetList.count ) | |
2191 | -// { | |
2192 | -// rb_raise( eDXRubyError, "内部エラー - DeleteRenderTargetList" ); | |
2193 | -// } | |
2171 | +} | |
2194 | 2172 | |
2195 | - i++; | |
2196 | - for( ; i < g_RenderTargetList.count; i++ ) | |
2173 | +static void CleanRenderTargetList( void ) | |
2174 | +{ | |
2175 | + int i, j; | |
2176 | + | |
2177 | + for( i = 0, j = 0; j < g_RenderTargetList.count; ) | |
2197 | 2178 | { |
2198 | - g_RenderTargetList.pointer[i - 1] = g_RenderTargetList.pointer[i]; | |
2179 | + if( g_RenderTargetList.pointer[j] == NULL ) | |
2180 | + { | |
2181 | + j++; | |
2182 | + } | |
2183 | + else | |
2184 | + { | |
2185 | + g_RenderTargetList.pointer[i] = g_RenderTargetList.pointer[j]; | |
2186 | + i++; | |
2187 | + j++; | |
2188 | + } | |
2199 | 2189 | } |
2200 | 2190 | |
2201 | - g_RenderTargetList.count--; | |
2191 | + g_RenderTargetList.count = i; | |
2202 | 2192 | } |
2203 | 2193 | |
2194 | + | |
2204 | 2195 | /*-------------------------------------------------------------------- |
2205 | 2196 | 参照されなくなったときにGCから呼ばれる関数 |
2206 | 2197 | ---------------------------------------------------------------------*/ |
@@ -4447,7 +4438,10 @@ | ||
4447 | 4438 | RenderTarget_drawEx( 4, arr, obj ); |
4448 | 4439 | } |
4449 | 4440 | |
4450 | - rb_ary_push( rt->varray, vimage ); | |
4441 | + { | |
4442 | + struct DXRubyRenderTarget *grt = DXRUBY_GET_STRUCT( RenderTarget, g_WindowInfo.render_target ); | |
4443 | + rb_ary_push( grt->varray, vimage ); | |
4444 | + } | |
4451 | 4445 | |
4452 | 4446 | return obj; |
4453 | 4447 | } |
@@ -5061,11 +5055,6 @@ | ||
5061 | 5055 | rt->PictureSize = 0; |
5062 | 5056 | rt->PictureDecideCount = 0; |
5063 | 5057 | rt->PictureDecideSize = 0; |
5064 | - for( i = 0; i < RARRAY_LEN(rt->varray); i++ ) | |
5065 | - { | |
5066 | - Image_dispose( RARRAY_AREF(rt->varray, i) ); | |
5067 | - } | |
5068 | - rb_ary_clear( rt->varray ); | |
5069 | 5058 | |
5070 | 5059 | return self; |
5071 | 5060 | } |