PDA

View Full Version : سوال: افزایش سرعت ترسیم



reza_stb2002
یک شنبه 11 بهمن 1388, 01:38 صبح
با سلام خدمت دوستان عزیز
من در رابطه با ترسیم حدود 6000 نقطه حدود یک پکسلی روی پانل در هر نیم ثانیه دچار کمی سرعت شدم.:افسرده:
قابل توجه که پانل یه شبیه ساز تابلو روان هست و راهی به جز ترسیم به نظرم نمیاد:متفکر:
میخواستم بدونم چطور این مشکل حل میشه با توجه به اینکه ویندوز توی ترسم های خیلی پیچیده تر و سریع تر از این مشکلی نداره:متعجب:
ممنون میشم اگه راهنما کنید.:لبخندساده:

reza_stb2002
یک شنبه 11 بهمن 1388, 08:43 صبح
کسی جواب نمیده؟ :افسرده:
من نیاز جدی به این جواب دارم

sia_2007
یک شنبه 11 بهمن 1388, 11:48 صبح
از تعداد نقطه هات کم کن
Double Buffered فرم رو True کن
متد Refresh پنل رو 3 تا 3 تا صدا بزن ؛ البته اگه داره

hhojjatt
یک شنبه 11 بهمن 1388, 22:44 عصر
دوست عزیز من هم در wpf این مشکل را دارم من باید چیکار کنم Double Buffered نداره.فورمی هم که کنترل سفارشی که در wpf درست کردم را در ان استفاده می کنم وقتی از Double Buffered استفاده می کنم اشکال می گیره متشکرم

reza_stb2002
سه شنبه 13 بهمن 1388, 09:33 صبح
بابت راهنماییتون ممنون


متد Refresh پنل رو 3 تا 3 تا صدا بزن ؛ البته اگه دارهاین کار باعث میشه ترسیم هایی که تا اون لحظه شده پاک بشه راه حلی به زهنتون میرسه؟


Double Buffered فرم رو True کنتا حدی تاثیر داشت
ممنون میشم اگه کمک کنید این مشکل کامل حل بشه

sia_2007
سه شنبه 13 بهمن 1388, 11:29 صبح
شما در WPF دقیقا چه کاری میخواهید انجام دهید ؛ چون تو WPF دستها بازه و میشه یه روش بهتر برای همون رسم پیدا کرد.
---
از Resoulation تصویرتون کم کنید. یعنی تعداد نقطه ها رو کمتر کنید.
راه دیگه هم اینه که از یه Thread دیگه استفاده کنید ؛ حواستان باشد ؛ در آن ترد برای اغییر دادن روی Label باید از Delegate استفاده کنید.
قطعا در این صورت مشکل حل میشود.
برای سادگی کار از Background Worker استفاده کنید.
آموزشش تو سایت هست.

hhojjatt
سه شنبه 13 بهمن 1388, 23:54 عصر
ممنون دوست عزیز برنامه من شبیه یکبرنامه paint در wpf سی شارپ است Resoulation را نمی تونم کم کنم چون کیفیت کار میاد پایین البته اگر منظورتون Resoulation ویندوز بود اگر هم منظور Resoulation کانواس بود بلد نیستم من مربع را با تابع زیر میکشم
public void draw(double heigth, double width, System.Windows.Thickness tn) { Color c = new Color(); c.A = 255; c.B = 0; c.G = 0; c.R = 0; Rectangle rec = new Rectangle(); rec.Height = heigth; rec.Width = width; rec.Stroke = new SolidColorBrush(c); rec.Margin = tn; rec.StrokeThickness = 0.4; canvas.Children.Add(rec); } اگه میشه بگین اینو چطوری به ترد دیگه یا جدید تبدیل کنم لطفا ادرس background worker را هم بگذارید تا مطالعه کنم سپاس

gwbasic
چهارشنبه 14 بهمن 1388, 08:39 صبح
برای افزایش سرعت ترسیم می توان ابتدا عمل ترسیم را روی یک شی Image انجام داد سپس آن شی را توسط متد DrawImage آن را در کنترل مورد نظر ترسیم کرد.


Image img = new Bitmap(600,400);
Graphics g=Graphics.FromImage(img);
for (int x=0; x<600; x++)
for (int y=0; y<400; y++)
g.DrawLine(Pens.Blue, new point(x,y), new point(x+5,y+5) );
g = PanelControl.CreateGraphics();
g.DrawImage(img, new point(0,0,) );

که در این کد PanelControl یک کنترل از جنس Panel می باشد که عمل ترسیم روی آن انجام می شود.
من این کد را همینطوری تایپ کردم شاید غلط تایپی داشته باشد.

در مورد BackgroundWorker نیز می توانید به لینک زیر مراجعه نمایید.
http://www.barnamenevis.org/forum/showthread.php?t=200544

hhojjatt
پنج شنبه 15 بهمن 1388, 12:06 عصر
روش ایمیج در کانواس wpf هم کار می کنه