PDA

View Full Version : سوال: چرا گرافیک معمولی سی شارپ اینقدر کنده ؟!!



MEhdi Sobhani
پنج شنبه 13 آبان 1389, 18:58 عصر
سلام
یه برنامه ای بود که قبلا با وی بی 6 نوشته بودم و حالا تقریبا همون رو در سی شارپ پیاده سازی کردم .
یه سوال برام پیش اومده و اون اینکه چرا اینقدر گرافیک معمولی در سی شارپ کنده !!!!!
حتی از وی بی 6 هم کندتره !!!
جالب اینکه حتی وقتی مستقیم از توابع GDI استفاده کردم بازم خیلی از کارهای گرافیکی کند بود !!!!!

navid_8x
پنج شنبه 13 آبان 1389, 19:19 عصر
سی شارپ حرفه ای تر از وی بی 6 هستش. سرعتشم بیشتره اگه بافر کنی.

debugger
پنج شنبه 13 آبان 1389, 19:34 عصر
دوست عزیز بستگی به شیوه کد نویسی هم داره

البته برنامه های native کمی از برنامه های تحت دات نت سریعتر هستند . و این بدیهی است . دلیلش هم واضحه

MEhdi Sobhani
پنج شنبه 13 آبان 1389, 19:41 عصر
سی شارپ حرفه ای تر از وی بی 6 هستش. سرعتشم بیشتره اگه بافر کنی.
سلام
ممنون
این روش کلی هست که من استفاده میکنم:


Pic.BackgroundImage = new Bitmap(Pic.Width, Pic.Height);
BackGraphic = Graphics.FromImage(Pic.BackgroundImage);

و بعد روی ابجکت گرافیکم کارها رو انجام میدم و در نهایت پیکچرباکس رو دوباره رفرش میکنم .
هیچ نوع فلیکری هم نداره .
لطفا اگر این روش اشکالی داره و علت کندی برنامم همین هست روش های دیگه رو هم بفرمایید .
ممنون

MEhdi Sobhani
پنج شنبه 13 آبان 1389, 19:59 عصر
این نمونه کد وی بی 6 و سی شارپ هست :

سی شارپ



Bitmap MyBitmap = new Bitmap(1024, 768);
Graphics g = Graphics.FromImage(MyBitmap);
DateTime STime = DateTime.Now;
Pen MyPen = new Pen(Color.Black);
for (int i = 0; i < 100000; i++)
{
g.DrawLine (MyPen, 0, 0, 1024, 768);
}
MessageBox.Show(DateTime.Now.Subtract(STime).Total Milliseconds.ToString());

وی بی 6 :



t = Timer
For i = 1 To 100000
Me.Line (0, 0)-(1024, 768), 0
Next
MsgBox (Timer - t)

تو کامپیوتر من کد سی شارپ 4.2 ثانیه زمان میبره اما کد VB6 حدود 1.37 ثانیه .
هر دو کد هم یه کار رو انجام میدن !!

navid_8x
پنج شنبه 13 آبان 1389, 23:49 عصر
Bitmap MyBitmap = new Bitmap(1024, 768);
Graphics g = Graphics.FromImage(MyBitmap);
BufferedGraphicsContext c = new BufferedGraphicsContext();
BufferedGraphics gr = c.Allocate(g, new Rectangle(0, 0, 1024, 768));
DateTime STime = DateTime.Now;
Pen MyPen = new Pen(Color.Black);
for (int i = 0; i < 100000; i++)
{
gr.Graphics.DrawLine(MyPen, 0, 0, 1024, 768);
}
gr.Render(g);
MessageBox.Show(DateTime.Now.Subtract(STime).Total Milliseconds.ToString());
اینو ببین

MEhdi Sobhani
جمعه 14 آبان 1389, 00:11 صبح
سلام
ممنونم
اما تست کردم سرعت این از قبلی هم کمتر بود .
اینجا هم پرسیدم ، یه نفر جواب داد به نظر منطفی میومد جوابش :
http://stackoverflow.com/questions/4099515/why-is-the-speed-of-drawing-graphics-slower-in-c-than-vb6
گفت که اون چیزی که در وی بی 6 استفاده میشه GDI هست و 24 بیت و بدون الفا و این GDI+ هست و 32 بیت و AntiAliased و ... .

debugger
جمعه 14 آبان 1389, 01:12 صبح
برای اینکه سرعت خیلی خیلی خیلی بالا بره باید OnPaint را Override کنید



protected override void OnPaint(PaintEventArgs paintEvnt)
{
Graphics gfx = paintEvnt.Graphics;
Pen myPen = new Pen(Color.Black);
//
for (int i = 0; i < 100000; i++)
{
gfx.DrawLine(myPen, 0, 0, 1024, 768);
break;
}
return;
}


حالا ببین در عرض صفر میلی ثانیه خط را رسم میکنه . عمرا اگر با وی بی 6 بتونی همچین کاری بکنی

MEhdi Sobhani
جمعه 14 آبان 1389, 02:41 صبح
برای اینکه سرعت خیلی خیلی خیلی بالا بره باید OnPaint را Override کنید



protectedoverridevoid OnPaint(PaintEventArgs paintEvnt)
{
Graphics gfx = paintEvnt.Graphics;
Pen myPen = newPen(Color.Black);
//
for (int i = 0; i < 100000; i++)
{
gfx.DrawLine(myPen, 0, 0, 1024, 768);
break;
}
return;
}
حالا ببین در عرض صفر میلی ثانیه خط را رسم میکنه . عمرا اگر با وی بی 6 بتونی همچین کاری بکنی

سلام
نه اینم سرعتش همون طوریه
break گذاشتین فقط یه بار رسم می کنه و خارج میشه ، 100000 تا که تو این هست حدود 30 ثانیه با کامپیوتر من .

کلا سرعت سی شارپ خیلی کمتر هست تو کارهای گرافیکی عادی .
نمونه دیگه الفابلند هست که با دستورات خود سی شارپ نسبت به api های ویندوز که تو وی بی 6 استفاده میکردم خیلی خیلی کندتر بود .

Felony
جمعه 14 آبان 1389, 09:16 صبح
نباید توقع سرعتی که تو یه زبان Native داشتید رو از Net. داشته باشید ، این طبیعی هست که سرعت کمتر از زبان Native باشه مخصوصا در این نوع موراد که برنامه نیاز به Performance داره ، شما در زبانی مثل دلفی یا ++VC یا ... مستقیم با توابع API ویندوز کار میکنید ولی در Net. خیر ، کد شما باید توسط CLR و Framework طراحی شده برای سکوی ویندوز ترجمه بشه و بعد اجرا بشه ...