ROP - Render Output Unit چیست ؟


"واحد خروجی رندرینگ" یا Render Output Unit که به اختصار ROP و همچنین "کانال عملیات های رستر" (Raster Output Pipeline) نامیده می شود یکی از مراحل پایانی در پروسه رندرینگ بورد های گرافیکی سه بعدی امروزی است. کانال پردازش پیکسل، اطلاعات پیکسل و تکسل (واحد های تشکیل دهنده تکسچر) را دریافت می کند و آن را به وسیله عملیات های ماتریسی و وکتوری خاص به یک پیکسل نهایی یا متغیر عمق پردازش می کند. ROP ها، تراکنس های بین بافر های مرتبط در حافظه محلی شامل خواندن و نوشتن و ترکیب مقادیر را انجام می دهند. پس ROP وظیفه ترکیب و قرار دادن پیکسل ها در محل مخصوص خود در صفحه نمایش (در اصل حافظه) را بر عهده دارد.
در گذشته تعداد ROP ها، TMU ها (واحد نگاشت تکسچر) و سایه زن های پیکسل، برابر بودند. هرچند از سال 2004 چندین GPU این واحد ها را از یکدیگر جدا کردند تا اختصاص ترانزیستور برای عملکرد حجم کار برنامه و حافظ در دسترس به صورت بهینه انجام شود. همینطور که این رویه ادامه پیدا می کند، اینگونه انتظار می رود تا پردازنده های گرافیکی واحد های مختلف خود را از یکدیگر جدا کنند تا سازگاری خود را با برنامه های گرافیکی آینده افزایش دهند. این طراحی باعث می شود تا سازندگان تراشه رویه ای ماژول وار ایجاد کنند که در آن GPU های رده بالا در اساس، از منطق یکسانی در مقابل GPU های رده پایین استفاده کنند.


تفاوت حافظه های DDR3 و GDDR5

 
در زیر برخی از تفاوت های عمده حافظه های DDR3 که به عنوان حافظه اصلی سیستم به کار می روند با حافظه های GDDR5 که عمدتا به عنوان حافظه کارت گرافیک های رده بالا به کار می روند، عنوان شده است.

- مصرف بالاتر و تولید گرمای بیشتر DDR3 نسبت به GDDR5 .  (مصرف 1.2 تا 1.65 ولت DDR3 نسبت به حدود 1 ولت GDDR5)

- DDR3 از کنترلر حافظه 64 بیتی برای هر کانال استفاده می کند (128 برای دو کانال، 256 برای چهار کانال و ...) در حالی که GDDR5 از کنترلر های 32 بیتی (16 بیت برای ورودی/ 16 بیت خروجی) استفاده می کند. البته GPU میتواند از هر تعداد ورودی/خروجی 32 بیتی استفاده کند. (2 عدد برای 64 بیت، 4 برای 128 بیت، 6 برای 192 بیت و ...)

- فرکانس و پهنای باند بالاتر GDDR5 نسبت به DDR3.

- تاخیر (latency) بیشتر GDDR5 نسبت به DDR3.

به علت تفاوت ذاتی CPU و GPU در پردازش و توانایی بالای GPU در موازی کاری، تاخیر حافظه های GDDR5 اهمیتی برای GPU ندارد و در عوض توانایی حافظه GDDR5 در انتقال سریع حجم عظیم اطلاعات باعث می شود که برای GPU ها از این حافظه استفاده شود؛ در طرف مقابل نیاز CPU به انجام سریع پردازشات خطی، تاخیر کم حافظه های DDR3 و انتقال سریع حجم کم اطلاعات، یک مزیت برای DDR3 به حساب می آید.  



سربارگذاری عملگر ورودی و خروجی << >> در زبان C++


شاید گاهی لازم باشد عملکرد عملگر های ورودی و خروجی را در برنامه های خود (معمولا برنامه های کنسولی) به صورت دلخواه تغییر دهیم تا بتوانیم آنها را برای اشیاء کلاس هایمان به صورت صحیح کار ببریم. سربارگذاری عملگر های ورودی و خروجی را در این پست با یک نمونه ساده در مورد "تاریخ" (date) نشان داده شده است. به کلاس ساده زیر توجه کنید.

class date
{
public:
int day, month, year;

date (int day, int month, int year)
{
   this->day = day;
   this->month = month;
   this->year = year;
}
};

کلاس date دارای سه عضو عمومی برای روز، ماه و سال است و یک سازنده برای مقدار دهی این اعضا دارد. البته اعضای کلاس معمولا باید به صورت خصوصی تعریف شوند ولی ما در این مین مثال ساده ترین گزینه را در نظر می گیریم. سربارگذاری عملگر های ورودی و خروجی باید در بیرون کلاس صورت گیرند. در ادامه به ترتیب سربارگذاری برای عملگر ورودی و خروجی تعریف شده است. ما می خواهیم که بتوانیم تاریخ را به صورت یکجا (مثلا 22/3/1396 وارد کنیم یا در خروجی چاپ کنیم، پس باید این عملگر های را به گونه ای که مورد نظر ماست دستکاری کنیم).


istream &operator>> (istream &output, date &day)
{
  char slash;
  output >> day.day >> slash >> day.month >> slash >> day.year;
  return output;
}

ostream &operator<< (ostream &output, date day)
{
  return output << day.day << "/" << day.month << "/" << day.year;
}

عملگر << از نوع istream و عملگر >> از نوع ostream است. برای همین نوع بازگشتی توابع را از این انواع تعیین می کنیم. این توابع باید دارای دو پارامتر باشند که پارامتر اول شیئی از نوع ذکر شده برای خروجی است و پارمتر دوم شیئی از کلاس date است که دربردارنده سه عضو روز، ماه و سال است. اگر این اعضا خصوصی تعریف شده بود باید از توابع دستیابی برای دسترسی به آنها استفاده می کردیم ولی چون اینجا اعضا، عمومی هستند نیازی به این کار نیست.

تابع اول به نحوی تعریف شده است که روز، ماه و سال را یکجا از از کاربر دریافت می کند و مقدار آنها را در متغیر های عضو قرار می دهد؛ کاراکتر اسلش / به عنوان جدا کننده انها به کار رفته است همانطور که هنگام نوشتن تاریخ از آن برای جدا کردن روز، ماه و سال استفاده می کنیم. تابع دوم ساده تر از تابع اول است و تنها سه متغیر عضو را همراه با کاراکتر اسلش برای جداسازی در خروجی چاپ می کند. حالا می توانیم این این دو عملگر را برای اشیاء کلاس date به صورت مستقیم به کار ببریم و تاریخ را یکجا از ورودی دریافت یا در خروجی نمایش دهیم.  

 

Two Steps From Hell


Two Steps From Hell یا "دو قدم تا دوزخ" کمپانی تهیه کننده موسیقی واقع در لس آنجلس کالیفرنیا است که به وسیله دو آهنگساز به نام های Nick Phoenix و Thomas J. Bergersen در سال 2006 تاسیس شده است. این کمپانی برای تریلر (پیش نمایش) فیلم ها، برنامه های تلویزیونی و بازی های ویدئویی، موسیقی تهیه می کند.

در طی چند سال این گروه برای صد ها تریلر موسیقی تهیه کرده است که بسیاری از انها جزء بزرگترین بلاک باستر های دهه اخیر هستند. از جمله این فیلم ها و بازی ها می توان به سری فیلم های هری پاتر، دزدان دریایی کارائیب، بتمن، گرگ و میش، مردان ایکس، و سرآغاز، ترون، استار ترک، جایی برای پیرمرد ها نیست و ... و بازی هایی مانند مس افکت، کیلزون (قتلگاه)، جنگ ستارگان و ... اشاره کرد.  

نصب  Net Framework 3.5 / 3 / 2 بر روی ویندوز 8 (windows 8)


به صورت پیشفرض نسخه های 3.5 ، 3 یا 2 چهار چوب .Net بر روی ویندوز 8 نصب نیستند و بسیاری از برنامه ها نیز به این نسخه ها برای اجرا نیازمند هستند؛ ولی میتوانید خیلی ساده این نسخه ها را بر روی ویندوز 8 نصب کنید. برای این کار می توانید از دو روش آنلاین یا دیسک نصب ویندوز استفاده کنید.

روش انلاین :

به کنترل پنل ویندوز رفته و وارد قسمت Programs and Features شوید و گزینه Turn Windows features on or off را انتخاب کنید. سپس تیک گزینه .NET Framework 3.5 را بزنید و Ok را کلیک کنید. پس از تایید دانلود فریمورک از اینترنت، به صورت خودکار فایل های موردنیاز دانلود شده و نصب می شوند.

روش افلاین : (استفاده از دیسک نصب ویندوز)
دیسک را در درایو قرار دهید و سپس به Command Prompt ویندوز رفته (با اختیارات Administrator) و دستور زیر را تایپ یا کپی کنید و enter را بزنید و صبر کنید تا مراحل نصب تکمیل شوند. 


Dism.exe /online /enable-feature /featurename:NetFX3 /All /Source:E:\sources\sxs /LimitAccess


به قسمت E:\source\sxs دقت کنید. این پوشه در دیسک نصب ویندوز قرار دارد و لازم است این آدرس به نسبت به نام درایو دی وی دی شما تغییر کند. برای مثال اگر "G" درایو دی وی دی شما است، آن را به       G:\source\sxs تغییر دهید.  

سربارگذاری عملگر تساوی ( == )


این پست مثالی از سربارگذاری عملگر تساوی یا == در زبان C++ است. سربار گذاری این عملگر می تواند در داخل یا خارج از کلاس موردنظر انجام شود؛ به این معنی که تابع سربارگذاری تابع عضو کلاس باشد یا خیر. برای این مثال ما سربارگذاری را در خارج از کلاس انجام می دهیم و در فضای عمومی برنامه تابع خود را قرار می دهیم.

تفاوت سربارگذاری در داخل یا خارج از کلاس (تابع عضو یا غیر عضو) :

تفاوت اینکه تابع را در کلاس تعریف کنید یا خیر این است که هنگامی که در تابع در کلاس تعریف می شود اولا به اعضای خصوصی دسترسی دارید و دوما تابع شما تنها یک پارامتر را می پذیرد که آن عملوند طرف راست عملگر == است و عملگر this به عملوند طرف چپ == اشاره دارد. ولی تابعی که در خارج از کلاس تعریف شده باشد مانند مثال زیر نیازمند دو پارامتر است که اولی عملوند طرف چپ و دومی عملوند طرف راست == هستند.
کلاس زیر را در نظر بگیرید : (من همیشه سعی می کنم تا ساده ترین حالت ممکن را در مثال ها، عنوان کنم تا ذهن خواننده درگیر مسائل فرعی نشود)


class students
{
public:
  int num;
  string name , family;
};

students کلاسی برای ذخیره نام، نام خانوادگی و شماره یک دانش آموز است. فرض کنید دو شی یا دو دانش آموز از کلاس بالا در اختیار دارید و می خواهید یکسان بودن آنها را به صور مستقیم با عملگر == بررسی کنید. اگر این مثال را نمی پسندید می توانید کلاسی را برای تاریخ یا درامد یا هر چیز دیگری تصور کنید...

students stu1, stu2;
stu1.name = "ali"; stu2.name = "hossein";
stu1.familiy = "rahimi"; stu2.family = "rajabi";
stu1.num = 15452214; stu2.num = 15426444;

اگر بخواهید این دو دانش آموز را به صورت مستقیم با یکدیگر مقایسه کنید چون عملگر == با کلاس شما مطابقت ندارد، با پیغام خطای کامپایلر مواجه می شوید.

if (stu1 == stu2) // Error
{
  // do something
}

راه حل سربار گذاری عملگر == برای کلاس students است. تابع سربارگذاری عملگر == دارای دوپارامتر const یا "ثابت" است که در مورد آنها توضیح دادیم. نوع این بازگشتی این تابع bool یا منظقی است چون قرار است یک مقدار true یا false را برگرداند و بدنه آن (در این مثال) بررسی هر سه متغیر عضو کلاس برای دو شی ارسال شده است.

bool operator== (const students &stu1, const students &stu2)
{
     if (stu1.name == stu2.name
         && stu1.family == stu2.family
          && stu1.num == stu2.num)
     { 
        return true;
     }
    return false; 
}

یا به صورت بهتر :


bool operator== (const students &stu1, const students &stu2)
{
return (stu1.name == stu2.name
          && stu1.family == stu2.family
           && stu1.num == stu2.num);
}

حالا میتوان با این تابع، به صورت مستقیم عملگر == را برای اشیای کلاس students به کار برد. حالا که سربارگذاری عملگر == را انجام دادیم، باید بتوانیم سربارگذاری عملگر =! را به همین صورت انجام دهیم. 

جست و جو و مرتب سازی در vector

 
در زبان C++ دو تابع پیش ساخته را می توانیم برای جست و جو و مرتب سازی وکتور به کار ببریم. واضح است که استفاده از توابع پیش ساخته در بسیاری مواقع به توابع شخصی ارجحیت دارد.

مرتب سازی وکتور :
برای مرتب سازی وکتور از تابع sort استفاده می کنیم که در کتابخانه algorithm نوشته شده است و حالت کلی آن به صورت زیر است.


// #include < algorithm >

sort (Beginning, End);

تابع sort دو پارامتر دارد که ابتدا و انتهای بازه مورد نظر برای مرتب سازی را مشخص می کند. دو تابع begin و end ایندکس ابتدا و انتهای وکتور را برمی گردانند. اگر وکتور numbers را در مثال زیر در نظر بگیریم، مرتب سازی کل وکتور به صورت زیر خواهد بود.


vector < int > numbers (100);
sort (numbers.begin(), numbers.end());

با این کار کل عناصر ویکتور از کوچک به بزرگ مرتب خواهند شد. مرتب سازی می تواند از هر بازه دلخواهی صورت گیرد. برای این کار می توانید از پارامتر های begin و end مقدار دلخواه را کم یا زیاد کنید تا محدوده دلخواه شما مشخص شود. برای مثال مرتب سازی نیمه اول وکتور به صورت زیر خواهد بود.

sort (numbers.begin(), numbers.end() - 50);


جست و جو در وکتور :

جست و جو در وکتور میتواند به سادگی با یک الگوریتم جست و جوی خطی انجام شود. ولی ما در این جا از تابع find از کتابخانه استاندارد C++ استافده می کنیم که حات کلی آن به صورت زیر است و در کتابخانه algorithm نوشته شده است.


// #include < algorithm >
find (Beginnig, End, Value);

دو پارامتر اول، نقطه شروع و پایان جست و جو و پارمتر سوم مقداری است که در وکتور به دنبال آن می گردیم. برای مثال در وکتور numbers کد زیر وجود مقدار 124 را در وکتور بررسی می کند.


if (find (numbers.begin(), numbers.end(), 124) != numbers.end())
{
  cout << "found";
}
else
{
  cout << "not-found";
}

تابع find مقدار صحیح یا غلط را برنمیگرداند، در عوض مقداری از نوع iterator را برمیگرداند که ایندکس اولین خانه است که مقدار ارسال شده در آن یافته شده است. و اگر این مقدار اصلا یافته نشد حد بالا بازه جست و جو + یک ، را برمی گرداند. پس حالا که ما در کل وکتور جست و جو را انجام می دهیم، اگر جست و جو موفقیت آمیز نباشد(مقدار ارسال شده یافته نشود) ایندکس آخرین خانه وکتور + یک (numbers.end() + 1) یا اندازه ویکتور (numbers.size()) برگردانده می شود.
اگر خواسته باشید ایندکس خانه ای که یافته شده است را به دست اورید می توانید به صورت زیر عمل کنید.

int index = find (numbers.begin(), numbers.end(), 124) - numbers.begin();

در این صورت هم اگر عمل جست و جو نتیجه ای نداشته باشد، اندازه وکتور بر گردانده می شود.

 

دانلود مستند Five Broken Cameras 2011


معمولا من دنبال قرار دادن فیلم یا آهنگ یا فایل خاصی برای دانلود در وبلاگ نیستم، دلایل زیادی هم برای این کار دارم که خیلی هاشون واضح هستند. ولی چون دیدم در سایت های فارسی مستند "پنج دوربین شکسته" برای دانلود قرار نگرفته خواستم تا این مستند رو با لینک مستقیم برای علاقه مندان قرار بدم.


موضوع این مستند که به وسیله دو مستند ساز فلسطینی و اسرائیلی به نام های Emad Burnat و Guy Davidi ساخته شده است، در مورد استقامت مردم روستایی به نام "بلعین" در کرانه غربی برابر ارتش اسرائیل است. استقامت و روحیه مردم این روستا مثال زدنی و قابل تحسین است و مانند بسیاری دیگر از فیلم های مستند این "حقیقت" است که بیننده را تا پایان مجذوب خود نگه می دارد...

Type Safety چیست ؟

 

type safety یا به فارسی "اطمینان نوع" قابلیت یا ویژگی یک زبان برنامه نویسی برای جلوگیری یا کاهش رخدادن خطاهای "عدم تطابق نوع" یا Type Errors در برنامه است. عدم تطابق نوع، به رفتار ناخواسته و نامطلوب یک برنامه به دلیل اختلاف در انواع داده ای در متغیر ها، ثابت ها یا توابع برنامه، گفته می شود. برای مثال رفتار کردن با یک متغیر نوع صحیح (integer) مانند یک متغیر نوع ممیز شناور (float).

یک زبان برنامه نویسی ممکن است خطاهای بالقوه را در هنگام کامپایل مشخص کند یا اطلاعات انواع را در زمان اجرا با مقدار ها بررسی کند تا خطاهای قریب الوقوع را مشخص کند یا ترکیبی از این دو نوع باشد. type safety گاهی اوقات نه به عنوان یک ویژگی زبان برنامه، بلکه به عنوان ویژگی برنامه نوشته شده یاد می شود؛ به این دلیل که برخی از زبان های برنامه نویسی امکاناتی برای برنامه نویسیان فراهم کرده اند تا برنامه نویسان بتوانند از آن در برنامه های خود استفاده کنند.


ساختار vector در زبان C++


در زبان برنامه نویسی C++ ، وکتور (vector) ساختاری است که به شما اجازه می دهد چندین مقدار یا ارزش را تحت یک نام ذخیره و استفاده کنید؛ بر خلاف متغیر ها که تنها اجازه ذخیره یک مقدار تحت یک نام را می دهند. وکتور را میتوانید مانند آرایه تصور کنید که دارای خانه هایی مشخص و پشت سر هم است و در هر کدام از انها می تواند یک مقدار ذخیره شود و برای دسترسی به این خانه ها از ایندکس آنها که از صفر شروع می شود، استفاده می شود.
تعریف یک وکتور :
پیش از هر کاری، برای استفاده از این ساختار باید کتابخانه vector را به برنامه خود اضافه کنید. حالت کلی تعریف وکتور به صورت زیر است :


// add vector lib to program
#include

// declaration
vector < TYPE > NAME;

خط بالا یک وکتور را به کلی ترین حالت ممکن تعریف می کند. پس تعریف به این صورت است که پس از کلمه vector در بین دو علامت < > ، نوع داده ای وکتور اعلان می شود و پس از آن نام وکتور مشخص می شود.
برای مثال کد زیر را در نظر بگیرید که وکتوری به نام numbers از نوع int یا صحیح تعریف می کند که در طول پست برای ذکر مثال از آن استفاده می کنیم.


vector < int > numbers;

مشخص کردن تعداد خانه ها یا عناصر وکتور در هنگام تعریف :

vector < TYPE > NAME (SIZE);

در این صورت وکتوری با تعداد عناصر یا خانه های مشخص شده به صورت SIZE ایجاد می شود و به عبارت دیگر اندازه وکتور به تعداد مشخص شده محدود می شود.

تعیین مقدار اولیه یا پیشفرض عناصر وکتور در هنگام تعریف :

vector < TYPE > NAME (SIZE , Default_Value);

در این صورت وکتوری با اندازه مشخص شده ایجاد می شود که عناصر آن همگی به صورت پیشفرض دارای مقدار تعریف شده Default_Value هستند.

دسترسی و مقدار دهی به عناصر وکتور :
برای دسترسی به عناصر وکتور از ایندکس یا شماره خانه هر عنصر استفاده می کنیم. برای مثال برای وکتور numbers مقدار دهی یا خواندن سه عنصر اول به صورت زیر خواهد بود.

numbers[0] = 100;
numbers[1] = 200;
numbers[2] = 300;
..........
cout << numbers[0];
cout << numbers[1];
cout << numbers[2];


مقدار دهی با استفاده از تابع push_back :
تابع push_back مقدار ارسال شده را در اولین خانه در دسترس (خالی) وکتور قرار می دهد. بنابراین اگر برای اولین بار از این تابع استفاده کنیم مقدار ارسال شده در خانه اول ( ایندکس 0 ) وکتور قرار می گیرد. (چون وکتور تا به حال مقدار دهی نشده باشد) و برای بار های بعد مقدار ارسال شده در خانه های بعدی قرار خواهند گرفت. فرض کنید خط زیر را برای وکتور numbers به کار ببریم :

numbers.push_back (400);

در این صورت مقدار 400 در خانه چهارم این وکتور قرار می گیرد چون سه خانه اول قبلا (در کد های بالا) اشغال شده بوده اند و خانه چهارم اولین خانه ی در دسترس برای ذخیره این مقدار است.

حذف اخرین عنصر وکتور با استفاده از تابع pop_back :
تابع pop_back آخرین خانه اشغال شده وکتور را خدف (خالی) می کند. ولی دقت کنید که مقدار این خانه را بر نمی گرداند. برای مثال کد زیر، مقدار 400 را از خانه چهارم وکتور numbers حذف می کند.

numbers.pop_back();