예제 #1
0
파일: Form1.cs 프로젝트: kwanboy/mcs
        void updateTimer_Tick(object sender, EventArgs e)
        {
            if (m_updateCount++ % 100 == 0)
            {
                Console.WriteLine("updateTimer_Tick() - {0}", m_updateCount);
            }


            if (mame.mame_machine_manager.instance() == null)
            {
                return;  // mame's not ready to update yet
            }
            osd_interface_WinForms osd = (osd_interface_WinForms)mame.mame_machine_manager.instance().osd();

            mame.RawBufferPointer framedata = osd.screenbufferptr;

            if (framedata == null)
            {
                return;
            }

#if true
            lock (osd.osdlock)
            {
                m_bitmapHelper.Lock();

                //int stride = 640;
                int stride = 400;

                Random r = new System.Random();
                for (int i = 0; i < 10; i++)
                {
                    framedata.set_uint32(i + 200 + 100 * stride, (UInt32)(r.Next() % 16000000));
                }

                for (int i = 0; i < 10; i++)
                {
                    framedata.set_uint32(i + 200 + 110 * stride, mame.rgb_t.white());
                }

#if false
                for (int i = 0; i < 10; i++)
                {
                    framedata.set_uint32(i + 200 + 120 * stride, mame.rgb_t.red);
                }

                for (int i = 0; i < 10; i++)
                {
                    framedata.set_uint32(i + 200 + 130 * stride, mame.rgb_t.green);
                }

                for (int i = 0; i < 10; i++)
                {
                    framedata.set_uint32(i + 200 + 140 * stride, mame.rgb_t.blue);
                }

                for (int i = 0; i < 10; i++)
                {
                    framedata.set_uint32(i + 200 + 150 * stride, mame.rgb_t.pink);
                }

                for (int i = 0; i < 10; i++)
                {
                    framedata.set_uint32(i + 200 + 160 * stride, mame.rgb_t.greenyellow);
                }
#endif

                BitmapHelper.SetPixelRawFunc setPixelFunc = m_bitmapHelper.IsAlphaBitmap ? m_bitmapHelper.SetPixelRawAlpha : (BitmapHelper.SetPixelRawFunc)m_bitmapHelper.SetPixelRawNoAlpha;
                int destPixelSize = m_bitmapHelper.GetRawPixelSize();

                const int scale = 3;
                for (int y = 0; y < 400; y++)
                {
                    int sourceArrayIndex = y * stride;

                    for (int j = 0; j < scale; j++)
                    {
                        int destArrayIndex = m_bitmapHelper.GetRawYIndex((y * scale) + j);

                        for (int x = 0; x < 400; x++)
                        {
                            UInt32 color = framedata.get_uint32(sourceArrayIndex + x);

                            for (int i = 0; i < scale; i++)
                            {
                                setPixelFunc(destArrayIndex, color);
                                destArrayIndex += destPixelSize;
                            }
                        }
                    }
                }


                m_bitmapHelper.Unlock(true);
            }
#endif


            if (m_graphics != null)
            {
                m_graphics.DrawImage(m_bitmap, m_bitmapXOffset, m_bitmapYOffset);

                if (mame.mame_machine_manager.instance().machine() == null || mame.mame_machine_manager.instance().machine().phase() != mame.machine_phase.RUNNING)
                {
                    return;
                }

                var         video                    = mame.mame_machine_manager.instance().machine().video();
                osd_ticks_t tps                      = mame.osdcore_global.m_osdcore.osd_ticks_per_second();
                double      final_real_time          = tps == 0 ? 0 : (double)video.overall_real_seconds + (double)video.overall_real_ticks / (double)tps;
                double      final_emu_time           = video.overall_emutime.as_double();
                double      average_speed_percentage = final_real_time == 0 ? 0 : 100 * final_emu_time / final_real_time;
                string      total_time               = (video.overall_emutime + new mame.attotime(0, mame.attotime.ATTOSECONDS_PER_SECOND / 2)).as_string(2);
                this.Text = string.Format("Emulator running... Avg Speed: {0:f2}% ({1} seconds) - speed_text: {2}", average_speed_percentage, total_time, video.speed_text());
            }
        }
예제 #2
0
        void updateTimer_Tick(object sender, EventArgs e)
        {
            if (m_updateCount++ % 100 == 0)
            {
                Console.WriteLine("updateTimer_Tick() - {0}", m_updateCount);
            }


            if (mame.mame_machine_manager.instance() == null)
            {
                return;  // mame's not ready to update yet
            }
            osd_interface_WinForms osd = (osd_interface_WinForms)mame.mame_machine_manager.instance().osd();

            mame.Pointer <byte>             framedata = osd.screenbufferptr;
            ConcurrentDictionary <int, int> frameDataCopyThreadIds = new ConcurrentDictionary <int, int>();

            if (framedata == null)
            {
                return;
            }

#if true
            lock (osd.osdlock)
            {
                //if (Width != m_bitmap.Width || Height != m_bitmap.Height ||
                //    Width != osd.get_width() || Height != osd.get_height())
                //{
                //    m_bitmap = new Bitmap(Width, Height, System.Drawing.Imaging.PixelFormat.Format32bppRgb);
                //    m_bitmapHelper = new BitmapHelper(m_bitmap);
                //
                //    osd.set_bounds(Width, Height);
                //
                //    framedata = osd.screenbufferptr;
                //}

                // right now the source and target bitmaps are different sizes, so detect resizes differently for each

                if (Width - (m_bitmapXOffset * 2) != m_bitmap.Width || Height - (m_bitmapYOffset * 2) != m_bitmap.Height)
                {
                    m_bitmap       = new Bitmap(Width - (m_bitmapXOffset * 2), Height - (m_bitmapYOffset * 2), System.Drawing.Imaging.PixelFormat.Format32bppRgb);
                    m_bitmapHelper = new BitmapHelper(m_bitmap);

                    m_graphics = CreateGraphics();
                }

                if (osd.get_width() != 600 || osd.get_height() != 600)
                {
                    osd.set_bounds(600, 600);

                    framedata = osd.screenbufferptr;
                }

                m_bitmapHelper.Lock();

#if false
                {
                    // random dots to make sure things are working, and not frozen
                    int    stride = osd.get_width();
                    int    x      = 200;
                    int    y      = 100;
                    Random r      = new System.Random();
                    if (x + 10 < osd.get_width() && y + 60 < osd.get_height())
                    {
                        for (int i = 0; i < 10; i++)
                        {
                            framedata.set_uint32(x + (y * stride) + i, (UInt32)(r.Next() % 16000000));
                        }

                        for (int i = 0; i < 10; i++)
                        {
                            framedata.set_uint32(x + ((y + 10) * stride) + i, mame.rgb_t.white());
                        }

#if false
                        for (int i = 0; i < 10; i++)
                        {
                            framedata.set_uint32(x + ((y + 20) * stride) + i, mame.rgb_t.red);
                        }

                        for (int i = 0; i < 10; i++)
                        {
                            framedata.set_uint32(x + ((y + 30) * stride) + i, mame.rgb_t.green);
                        }

                        for (int i = 0; i < 10; i++)
                        {
                            framedata.set_uint32(x + ((y + 40) * stride) + i, mame.rgb_t.blue);
                        }

                        for (int i = 0; i < 10; i++)
                        {
                            framedata.set_uint32(x + ((y + 50) * stride) + i, mame.rgb_t.pink);
                        }

                        for (int i = 0; i < 10; i++)
                        {
                            framedata.set_uint32(x + ((y + 60) * stride) + i, mame.rgb_t.greenyellow);
                        }
#endif
                    }
                }
#endif

                {
                    // copy whole line at once
                    int sourceWidth       = osd.get_width();
                    int sourceHeight      = osd.get_height();
                    int sourceBytesPerPix = 4;  // TODO query this
                    int sourceStride      = sourceWidth * sourceBytesPerPix;
                    int destWidth         = m_bitmapHelper.Width;
                    int destHeight        = m_bitmapHelper.Height;
                    int destBytesPerPix   = 4; // TODO fix funcs in BitmapHelper and query this
                    int destStride        = destWidth * destBytesPerPix;

                    // if dest is smaller than source, clamp
                    sourceHeight = Math.Min(sourceHeight, destHeight);
                    int copyLength = Math.Min(sourceStride, destStride);

                    System.Threading.Tasks.Parallel.For(0, sourceHeight, y =>
                                                                                                                 //for (int y = 0; y < sourceHeight; y++)
                    {
                        frameDataCopyThreadIds.TryAdd(System.Threading.Thread.CurrentThread.ManagedThreadId, 0); // count how many threads are in use when using Parallel.For() version
                        framedata.CopyTo(y * sourceStride, m_bitmapHelper.GetBitmapData(y * destStride, copyLength), copyLength);
                    });
                }

#if false
                // copy pixel by pixel

                BitmapHelper.SetPixelRawFunc setPixelFunc = m_bitmapHelper.IsAlphaBitmap ? m_bitmapHelper.SetPixelRawAlpha : (BitmapHelper.SetPixelRawFunc)m_bitmapHelper.SetPixelRawNoAlpha;
                int       destPixelSize = m_bitmapHelper.GetRawPixelSize();
                const int scale         = 1;
                for (int y = 0; y < osd.get_height(); y++)
                {
                    int sourceArrayIndex = y * osd.get_height();

                    for (int j = 0; j < scale; j++)
                    {
                        int destArrayIndex = m_bitmapHelper.GetRawYIndex((y * scale) + j);

                        for (int x = 0; x < osd.get_width(); x++)
                        {
                            UInt32 color = framedata.get_uint32(sourceArrayIndex + x);

                            for (int i = 0; i < scale; i++)
                            {
                                setPixelFunc(destArrayIndex, color);
                                destArrayIndex += destPixelSize;
                            }
                        }
                    }
                }
#endif

                m_bitmapHelper.Unlock(true);
            }
#endif


            if (m_graphics != null)
            {
                m_graphics.DrawImageUnscaled(m_bitmap, m_bitmapXOffset, m_bitmapYOffset);
                //m_graphics.DrawImage(m_bitmap, m_bitmapXOffset, m_bitmapYOffset, Width - (m_bitmapXOffset * 3), Height - (m_bitmapYOffset * 3));

                if (mame.mame_machine_manager.instance().machine() == null || mame.mame_machine_manager.instance().machine().phase() != mame.machine_phase.RUNNING)
                {
                    return;
                }

                var         video                    = mame.mame_machine_manager.instance().machine().video();
                osd_ticks_t tps                      = mame.osdcore_global.m_osdcore.osd_ticks_per_second();
                double      final_real_time          = tps == 0 ? 0 : (double)video.m_overall_real_seconds + (double)video.m_overall_real_ticks / (double)tps;
                double      final_emu_time           = video.m_overall_emutime.as_double();
                double      average_speed_percentage = final_real_time == 0 ? 0 : 100 * final_emu_time / final_real_time;
                string      total_time               = (video.m_overall_emutime + new mame.attotime(0, mame.attotime_global.ATTOSECONDS_PER_SECOND / 2)).as_string(2);
                this.Text = string.Format("Emulator running... Avg Speed: {0:f2}% ({1} seconds) Framedata_Copy_Threads: {2} - speed_text: {3}", average_speed_percentage, total_time, frameDataCopyThreadIds.Count, video.speed_text());
            }
        }