رفتن به مطلب
مرجع رسمی سی‌پلاس‌پلاس ایران

کامبیز اسدزاده

بنیـــان گذار
  • تعداد ارسال ها

    505
  • تاریخ عضویت

  • روز های برد

    266

تمامی مطالب نوشته شده توسط کامبیز اسدزاده

  1. کامبیز اسدزاده

    در تکمیل نظر دوستمون جناب @فرهاد شیری به این مورد اشاره کنم که تقریباً نیازی به استفاده از Java در کیوت ندارید مگر اینکه هدفی که دارید رو تحت NDK نتونید پیاده سازی کنید. برای مثال یک سری نیاز‌ها مانند فعال سازی سرویس‌های اندروید در بک‌گراند برنامه نیاز به جاوا برا گسترش QAndroidService خواهید داشت. البته این ویژگی در نسخه‌های پیشین کیوت وجود نداشته و از نسخه‌ی ۵.۷ به اینور امکان استفاده از کلاس‌های سرویس اندرویدی در کیوت فراهم شده و اینطور انتظار میره که در نسخه‌های بعدی نیازی به استفاده از کد‌های جاوا برای دسترسی در برخی موارد نیاز نباشه. خارج از این باشه به قول جناب @فرهاد شیری نیازی به جاوا ندارید.
  2. کامبیز اسدزاده

    سلام، شما نمی‌تونید مستقیماً از کُد‌های جاوا در QML استفاده کنید. اما می‌تونید کد‌های جاوا رو با سی‌پلاس‌پلاس ترکیب و بعدش کد‌های سی++ خودتون رو برای کیو‌ام‌ال رجیستر کنید. مستندات خود کیوت در این زمینه.
  3. نسخه‌ی بتای 4.8 منتشر شد! پشتیبانی از ویژگی‌های عمومی از ویژگی‌های جدید این نسخه می‌توان به ویژگی پشتیبانی از LSP اشاره کرد که در این نسخه به صورت آزمایشی افزوده شده است. برای فعال سازی این ویژگی کافی است به مسیر Help > About Plugins (Qt Creator > About Plugins on macOS) بروید. ویژگی‌های مربوط به ++C در سمت سی‌پلاس‌پلاس ویژگی‌های جدیدی به صورت آزمایشی اضافه شده اند. ویژگی‌های جدید با پشتیبانی از Cppcheck و اشکال زدایی‌ بهتر. دیگر بهبود‌ها‌ی اساسی در نسخه‌ی مک‌او‌اِس پوسته‌ی محیط با ویژگی‌های جدید سیستم‌عامل macOS Mojave (10.14) سازگار شده است. در اندروید نیز مشکل اتصال به API 24 حل شده است. جزئیات و دیگر بهبود‌ها: Qt Creator version 4.8 contains bug fixes and new features. The most important changes are listed in this document. For a complete list of changes, see the Git log for the Qt Creator sources that you can check out from the public Git repository. For example: git clone git://code.qt.io/qt-creator/qt-creator.git git log --cherry-pick --pretty=oneline origin/4.7..v4.8.0 General * Added `HostOs:PathListSeparator` and `HostOs:ExecutableSuffix` Qt Creator variables * Added `Create Folder` to context menu of path choosers if the path does not exist * Fixed menu items shown in menu locator filter (QTCREATORBUG-20071, QTCREATORBUG-20626) Editing * Added experimental plugin `LanguageClient` for supporting the [language server protocol](https://microsoft.github.io/language-server-protocol) (QTCREATORBUG-20284) * Added support for the pastecode.xyz code pasting service * Made it possible to change default editors in MIME type settings All Projects * Added option for parallel jobs to `make` step, which is enabled by default if `MAKEFLAGS` are not set (QTCREATORBUG-18414) * Added auto-detection of the Clang compiler shipped with Qt Creator * Added option for disabling automatic creation of run configurations (QTCREATORBUG-18578) * Added option to open terminal with build or run environment to project tree and the corresponding configuration widgets in `Projects` mode (QTCREATORBUG-19692) * Improved handling of relative file paths for custom error parsers (QTCREATORBUG-20605) * Fixed that `make` step required C++ tool chain * Fixed that many very long lines in application or build output could lead to out of memory exception (QTCREATORBUG-18172) QMake Projects * Fixed that `make qmake_all` was run in top-level project directory even when building sub-project (QTCREATORBUG-20823) Qbs Projects * Added `qmlDesignerImportPaths` property for specifying QML import paths for Qt Quick Designer (QTCREATORBUG-20810) C++ Support * Added experimental plugin `CompilationDatabaseProjectManager` that opens a [compilation database](https://clang.llvm.org/docs/JSONCompilationDatabase.html) for code editing * Added experimental plugin `ClangFormat` that bases auto-indentation on Clang Format * Added experimental plugin `Cppcheck` for integration of [cppcheck](http://cppcheck.sourceforge.net) diagnostics * Added highlighting style for punctuation tokens (QTCREATORBUG-20666) * Clang Code Model * Added `Follow Symbol` for `auto` keyword (QTCREATORBUG-17191) * Added function overloads to tooltip in completion popup * Added `Build` > `Generate Compilation Database` * Fixed that braced initialization did not provide constructor completion (QTCREATORBUG-20957) * Fixed local references for operator arguments (QTCREATORBUG-20966) QML Support * Fixed indentation in object literals with ternary operator (QTCREATORBUG-7103) * Fixed that symbols from closed projects were still shown in Locator (QTCREATORBUG-13459) Debugging * Added support for multiple simultaneous debugger runs * Fixed automatic detection of debugging information for Qt from binary installer (QTCREATORBUG-20693) * GDB * Fixed startup issue with localized debugger output (QTCREATORBUG-20765) * Fixed disassembler view for newer GCC * CDB * Added option to suppress task entries for exceptions (QTCREATORBUG-20915) * LLDB * Fixed instruction-wise stepping Qt Quick Designer * Fixed wrong property propagation from parent to child Version Control Systems * Git * Added navigation pane that shows branches * Added option for copy/move detection to `git blame` (QTCREATORBUG-20462) * Improved behavior if no merge tool is configured * Fixed that `git pull` blocked Qt Creator (QTCREATORBUG-13279) * Fixed handling of `file://` remotes (QTCREATORBUG-20618) * Fixed search for `gitk` executable (QTCREATORBUG-1577) Test Integration * Google Test * Fixed that not all failure locations were shown (QTCREATORBUG-20967) * Fixed that `GTEST_*` environment variables could break test execution and output parsing (QTCREATORBUG-21012) Model Editor * Fixed that selections and text cursors where exported (QTCREATORBUG-16689) Platform Specific Linux * Added detection of Intel C compiler (QTCREATORBUG-18302) * Fixed `Open Terminal Here` for `konsole` (QTCREATORBUG-20900) macOS * Fixed light themes for macOS Mojave (10.14) Android * Added support for command line arguments * Added support for environment variables * Fixed connecting to debugger for API level 24 and later برای دریافت این نسخه کلیک کنید.
  4. همانطور که می‌دانید محیط توسعه‌ی یکپارچه‌ی نرم‌افزار Visual Studio به عنوان یکی از جامع‌ترین محیط‌های توسعه بسیار شناخته شده است. برنامه‌نویسان سی‌پلاس‌پلاس بسیاری از پروژه‌های خود را تحت این محیط علاوه بر آن کیوت کریتور توسعه می‌دهند. کتابخانه‌ی کیوت افزونه‌ای را برای یکپارچه سازی خود با محیط ویژوال استودیو ارائه داده است که در حالت عادی از کتابخانه‌ی Qt به خوبی پشتیبانی می‌کند و اجازه می‌دهد تا شما کُد‌های خود را که بر اساس کتابخانه‌ی کیوت هستند در محیط ویژوال استودیو توسعه و خروجی بگیرید. اما محدودیت‌هایی در این افزونه تا به امروز وجود دارد، یکی از آن‌ها عدم هماهنگی و پشتیبانی از زبان QML بر پایه جاوا اسکریپت است. در نسخه‌ی بعدی کیوت یعنی 5.12.0 افزونه‌ی Qt Visual Studio Tools, v2.3.0 نیز منتشر خواهد شد که با نسخه‌های جدید ویژوال استودیو هماهنگ و به شما امکان اینم را خواهد داد تا بتوانید کد‌های نوشته شده توسط QML و JavaScript را اشکال‌زدایی کنید. این امکان وجود خواهد داشت تا شما هر جایی که نقطه‌ی توقف برای اشکال زدایی ایجاد کرده اید را مورد تجزیه تحلیل قرار خواهید داد. از جمله، تغییر تحولات در ارزش‌های متغیر‌ها و دیگر موارد. نسخه‌ی جدید این افزونه به طور کامل با زیرساخت اشکال زدایی QML یکپارچه سازی شده است. که به عنوان بخشی از ماژول Qt QML خدماتی برای اشکال زدایی، بررسی و ثبت و ظبط برنامه را از طریق یک پور TCP فراهم می‌کند. به صورت پیش‌فرض ویژگی اشکال زدایی در QML برای ویژوال استودیو فعال است. شما می‌توانید آن را در بخش تنظیمات افزونه ویژوال استودیو برای Qt غیرفعال کنید. این ابزار را می‌توانید از این بخش دریافت کنید.
  5. کامبیز اسدزاده

    شما در محیط لینوکس، وقتی کیوت رو نصب می‌کنید برای استفاده از اون مخصوصاً ساخت (کامپایل، بیلد) و اجرای برنامه نیاز به یک سری ابزار‌ها و کتابخانه‌های پیش‌نیاز دارید که با دستورات زیر باید پکیج‌های مربوط به اون رو نصب کنید. sudo apt-get install build-essential sudo apt-get install mesa-common-dev حالا شما دستور منسوخ شده رو اجرا کردین که ظاهراً مشکلتون حل شده، دلیلش هم احتمالاً دو ابزار qt4-qmake (= 4:4.8.7+dfsg-17) و qt4-dev-tools در پکیج هستش که نسخه‌های به‌روز تر و بهترش در پکیج build-essential موجود هست.
  6. نسخه‌ی ۴.۷.۱ کیوت کریتور انتتشار یافت. Qt Creator version 4.7.1 contains bug fixes. The most important changes are listed in this document. For a complete list of changes, see the Git log for the Qt Creator sources that you can check out from the public Git repository. For example: git clone git://code.qt.io/qt-creator/qt-creator.git git log --cherry-pick --pretty=oneline origin/v4.7.0..v4.7.1 Editing * Fixed that generic highlighting could use unreadable colors (QTCREATORBUG-20919) All Projects * Fixed jumping text cursor when editing custom executable path Qbs Projects * Fixed C++ version passed to code model (QTCREATORBUG-20909) C++ Support * Clang Code Model * Fixed include order for Clang headers Debugging * Fixed remote debugging command line argument (QTCREATORBUG-20928) * GDB * Fixed GDB built-in pretty printer handling (QTCREATORBUG-20770) * CDB * Fixed pretty printing of enums * QML * Fixed re-enabling breakpoints (QTCREATORBUG-20795) * Fixed `Attach to QML Port` (QTCREATORBUG-20168) Platform Specific Windows * Improved resource consumption of MSVC detection, which prompted some Anti-Virus software to block Qt Creator (QTCREATORBUG-20829) * Fixed that Qt Creator forced use of ANGLE on user applications (QTCREATORBUG-20808) * Fixed MSVC toolchain detection for Windows SKD 7 (QTCREATORBUG-18328) برای دریافت از این بخش اقدام کنید.
  7. سلام، برخی از دوستان در گروه‌ برنامه‌نویسی در رابطه با نحوه‌ی بررسی وضعیت اینترنت و شبکه سوال پرسیده بودن که چطور میشه در سی++ تحت کیوت مخصوصاً همراه QML وضعیت آنلاین بودن رو در زمان واقعی بررسی کرد. من نمونه مثالی آماده کردم که در وضعیت زمان واقعی (Real-Time) هر چند ثانیه یک بار نسبت به وضعیت اینترنت واکنش نشون میده. برای دریافت این نمونه مثال از مخزن مربوطه استفاده کنید.
  8. چرا از نوع Image در QML استفاده نمی‌کنید؟ در این صورت فقط نیاز دارین آدرس تصاویر رو بهش انتقال بدین. مثال: Image { source: "pic/avatar.png" }
  9. کیوت کریتور ۴.۸ بتای اول منتشر شد. تغییرات در این نسخه شامل موارد زیر می‌باشند. Qt Creator version 4.8 contains bug fixes and new features. The most important changes are listed in this document. For a complete list of changes, see the Git log for the Qt Creator sources that you can check out from the public Git repository. For example: git clone git://code.qt.io/qt-creator/qt-creator.git git log --cherry-pick --pretty=oneline origin/4.7..v4.8.0 General * Added `HostOs:PathListSeparator` and `HostOs:ExecutableSuffix` Qt Creator variables * Added `Create Folder` to context menu of path choosers if the path does not exist * Fixed menu items shown in menu locator filter (QTCREATORBUG-20071, QTCREATORBUG-20626) Editing * Made it possible to change default editors in MIME type settings Help All Projects * Added option for parallel jobs to `make` step, which is enabled by default if `MAKEFLAGS` are not set (QTCREATORBUG-18414) * Added auto-detection of the Clang compiler shipped with Qt Creator * Improved handling of relative file paths for custom error parsers (QTCREATORBUG-20605) * Fixed that `make` step required C++ tool chain QMake Projects * Fixed that `make qmake_all` was run in top-level project directory even when building sub-project (QTCREATORBUG-20823) C++ Support * Clang Code Model * Added function overloads to tooltip in completion popup * Added `Build` > `Generate Compilation Database` * Fixed that braced initialization did not provide constructor completion (QTCREATORBUG-20957) * Fixed local references for operator arguments (QTCREATORBUG-20966) QML Support * Fixed indentation in object literals with ternary operator (QTCREATORBUG-7103) * Fixed that symbols from closed projects were still shown in Locator (QTCREATORBUG-13459) Python Support Debugging * GDB * Fixed startup issue with localized debugger output (QTCREATORBUG-20765) * Fixed disassembler view for newer GCC * CDB * Added option to suppress task entries for exceptions (QTCREATORBUG-20915) * LLDB * Fixed instruction-wise stepping Clang Static Analyzer QML Profiler Version Control Systems * Git * Improved behavior if no merge tool is configured * Fixed handling of `file://` remotes (QTCREATORBUG-20618) Image Viewer Test Integration * Google Test * Fixed that not all failure locations were shown (QTCREATORBUG-20967) Model Editor * Fixed that selections and text cursors where exported (QTCREATORBUG-16689) Platform Specific Windows Linux * Added detection of Intel C compiler (QTCREATORBUG-18302) macOS * Fixed light themes for macOS Mojave (10.14) Android * Added support for command line arguments * Added support for environment variables * Fixed connecting to debugger for API level 24 and later
  10. کامبیز اسدزاده

    اگر برای این دو استور تاکید دارین، باید برای این کار هم مشابه پیشنهاد دوم تحت api‌ هایی که ارائه دادن سمت جاوا پیاده کنید و با سی++ برای کیو ام ال هندلش کنید.
  11. کامبیز اسدزاده

    سلام، برای کیوت دو روش وجود داره. استفاده از ماژول اختصاصی این کار (Qt Purchasing) و سفارشی سازی و هماهنگ سازی اون با درگاه‌های داخلی پیاده سازی یک ماژول اختصاصی برای درگاه‌های بانکی و هماهنگ سازی اون سمت سرور (درگاه بانکی سمت وب) با کلاینت نکته: من روش دوم رو پیشنهاد می‌کنم که به طور کامل از سمت سرور با Php پیاده سازی بشه و سمت کلاینت با ++C و JavaScript هماهنگ بشه. این کار نیاز داره که صفحه‌ی پرداخت بانکی در مرورگر وب باز بشه و اطلاعاتش رد و بدل بشه. حتی می‌تونید از ماژول وب خود کیوت هم برای راحتی بیشتر استفاده کنید.
  12. سلام و درود با طعم کیوت ? همانطور که می‌دانید توسعه نرم‌افزار‌ها و اپلیکیشن‌های کاربردی در هر پلتفرمی نیازمند ابزار‌ها و کنترل‌های مهمی هستند که این امر موجب سرعت بخشیدن به زمان طراحی می‌شود. در صنایع مختلف برنامه‌نویسی مخصوصاً سمت وِب کیت‌های بسیاری جهت تولید و توسعه سریع همراه با کامپوننت‌های بسیار خوبی ارائه شده است که برخی از آن‌ها عبارتند از Bootstrap، UIkit و غیره... ما در نظر داریم کیتی را همانند کیت بوت استرپ برای کیوت کوئیک توسعه دهیم. بنابراین هر کامپوننت یا ماژولی که احساس نیاز از آن می‌شود را برای ما مطرح کنید. ابتدا ما ویژگی‌های بوت استرپ را شبیه سازی خواهیم کرد و سپس کیت‌های مورد نیاز شما را که در تاپیک‌های دیگر اعلان می‌شوند با این کیت ادغام خواهیم کرد. با توجه به اینکه من شخصاً کیتی را از قبل برای توسعه در نظر گرفته ام نام این پروژه Jupiter انتخاب شده است همان کیت را برای برنامه ریزی در این بخش عنوان می‌کنم تا برای ادامه نیز با همکاری همدیگر توسعه داده شود. کامپوننت‌ها Alerts Ads ActionButton ActivityIndicator Accordion Badges Button CircleButton Card CardInfo CardBox CircleImage CircleProgressBar Dropdown DifficultySection Forms Modal Menu MessageBox Map (Based on Google Map & OpenStreetMap) Marker Navs Navbar Notification Profile Pagination Popovers Progress ProgressCircle Space Share SocialFeed Tooltips Header Footer FontSystem Slider InputBox Rate (Vote) WinButton پیشنهادات شما می‌تواند در این لیست اضافه شود... بسیاری از کنترل‌ها در هر زمینه‌ای که نیاز باشد در این لیست اضافه خواهند شد. نکته :‌ تمامی کنترل‌ها باید واکنش گرا باشند. این کیت تحت فونت آیکونیک‌های حرفه‌ای fontawesome مجهز خواهد شد. نکته ۲‌ : تمامی کامپوننت‌ها باید تحت قالب راست به چپ و چپ به راست پشتیبانی شوند. نکته ۳ : تمامی کامپوننت‌ها باید به دو زبان فارسی و انگلیسی واکنشگرا و تحت فونت‌های ویژه پشتیبانی شوند.
  13. کامبیز اسدزاده

    خب از کد‌های سمت QML شما بی خبر هستیم و احتمال این هستش که در این بخش مشکلی وجود داشته باشه. طبق مثالی که زده شده باید رویداد‌های کلیدی (اکشن)‌ ها هم به درستی برای فیلد متن مشخص بشه جزئیات رو مطابق مثال بررسی کنید.
  14. کامبیز اسدزاده

    این مثال رو آزمایش کنید. باید رویداد‌های نمایشی صفحه کلید در سمت کیو‌ام‌ال هم به درستی تنظیم بشه، در صورتی که جواب نداد مشکل مربوط به نسخه‌ی Qt خواهد بود. چون این ویژگی صفحه کلید مجازی در نسخه‌ی تجاری فعال هست که از نسخه‌های اخیر آزاد شده.
  15. کامبیز اسدزاده

    پاسخ سوال اول شما، برای پیاده سازی صفحات رابط کاربری از کیوت کوئیک استفاده کنید. نوع UI فقط برای نمایش محتوا هست و طبق تحقیق خودتون هم که مستند کردین خیلی از ویژگی‌ها رو پشتیبانی نمی‌کنه. در کل گزینه‌ی زیاد جالبی نیست ماهم در پروژه‌هامون ازش استفاده نمی‌کنیم چون نمیشه سفارشی سازی کرد و بیشتر به درد طراحی ویزارد می‌خوره. پاسخ سوال دوم، از انواع Loader استفاده کنید یا اگه می‌خواین که با عمل کلیک شدن فرمی رو نمایش بدین می‌تونید با تابع createComponent شیء رو بسازید و نمایش بدین. پاسخ سوال آخر شما، مثال‌هایی که در همین سایت زده شده رو بررسی کنید. هرچند دیتابیسی نیستند اما در رابطه با نحوه‌ی ارتباطات و پیاده سازی انواع فرم‌ها و ارتباطش با سی++ مثال زده شده. موفق باشید.
  16. با نگاهی به الگوی جستجو تحت الگوریتم Boyer-Moore در استاندارد جدید یعنی C++17 می‌توان به کنترل بیشتر و حتی سرعت بسیار بالاتری نسبت به کتابخانهٔ Boost رسید. با استاندارد ۱۷ در سی‌پلاس‌پلاس، اکنون می‌توانید از الگوریتم‌های پیشرفته‌تر و بهتری در عین حال سریعتری برای جستجو استفاده کنید. از این پس، شما می‌توانید کنترل بیشتر و همچنین افزایش کارآیی امیدوار کننده‌ای در بسیاری از موارد داشته باشید که به صورت پیشفرض در استاندارد ۱۷ ارائه شده‌است. معرفی روش‌های ساده‌تری برای یافتن الگو در یک رشته O (nm) جایی که n طول تمام رشته است و m طول الگو است وجود دارد. این روش‌ها به عنوان روش‌های دوم و بهتری می‌توان در نظر گرفته شوند. در C++17 الگوریتم جستجو در استاندارد std::search به دو روش زیر به‌روز رسانی شده است: از این پس شما می‌توانید از قانون مجوز استفاده از نسخهٔ پیش‌فرض الگوریتم استفاده کنید، اما به صورت موازی عمل می‌کند. شما می‌توانید یک شیء جستجوگر برای مدیریت جستجو فراهم کنید. بنابراین ما سه نوع جستجوگر خواهیم داشت: default_searcher boyer_moore_searcher boyer_moore_horspool_searcher حالت پیش‌فرض از جستجو به صورت زیر خواهد بود: #include <iostream> #include <string> #include <algorithm> #include <functional> int main() { std::string in = "Hello, World from new C++ 17"; std::string needle = "C++"; auto it = std::search(in.begin(), in.end(), std::default_searcher(needle.begin(), needle.end())); if(it != in.end()) std::cout << "The string " << needle << " found at offset " << it - in.begin() << '\n'; else std::cout << "The string " << needle << " not found\n"; } پیش‌پردازش هر دو الگوریتم Boyer Moore و Boyer Moore Horspool از برخی اطلاعات در رابطه با رشته الگو استفاده می‌کنند تا بتوانند مقایسه‌های بی‌نظیری را انجام دهند. به منظور هوشمندانه‌تر شدن هر یک از الگوریتم‌ها یک عمل پیش‌پردازشی را انجام می‌دهند که الگوی ورودی را تحلیل می‌کند. پیچیدگی پیش‌پردازش معمولاً به اندازهٔ الفبای رشته بستگی دارد. در کتابخانهٔ Boost (بوست) اگر شما با کتابخانهٔ بوست کار کرده اید، ممکن است شما با الگوریتم‌های جستجو آشنا باشید. در نسخهٔ ۱.۵۰ (در تاریخ ژوئن ۲۰۱۲ میلادی) مجموعهٔ جدیدی از الگوریتم‌ها به کتابخانه اضافه شده است. در کتابخانه سه شیء جستجوگر وجود دارد: الگوریتم جستجوی Boyer-Moore الگوریتم جستجوی Boyer-Moore-Horspool الگوریتم جستجوی Knuth-Morris-Pratt نحوهٔ استفاده از این روش‌ها در استاندارد ۱۷ چگونه است؟ در سی‌پلاس‌پلاس ۱۷ سه نوع سربار اضافی بر روی ویژگی‌های std::search اضافه شده است. template<class ForwardIterator, class Searcher> ForwardIterator search( ForwardIterator first, ForwardIterator last, const Searcher& searcher ); هر جستجوگر معمولاً دو ورودی تکرار کننده را می‌گیرند. شروع و پایان الگو، و سپس یک پیشفرض باینری که معمولاً آن با عملگر برابر است. آن‌ها ممکن است از پارامتر‌های دیگر نیز استفاده کنند، برای مثال، یک تابع هَش (مخلوط) کننده. در کل، شما می‌توانید آن را به صورت زیر استفاده کنید: std::string testString = "Hello Super World"; std::string needle = "Super"; auto it = search(testString.begin(), testString.end(), boyer_moore_searcher(needle.begin(), needle.end())); if (it == testString.end()) cout << "The string " << needle << " not found\n"; برخی از آزمون‌های پایه برای آزمایش مخزنی ارائه شده است که در آن نمونه کُد آن آمده است. در این مثال نمونه‌هایی نوشته شده است که برخی از آن‌ها کارایی و سرعت بسیار خوبی را در الگوریتم‌های جدید با استفاده از MSVC نشان می‌دهد. آزمایش‌ها چطور کار می‌کنند؟ برنامه یک فایل را بارگذاری می‌کند، مانند کتابی که شامل متنی با ۵۰۰ کیلوبایت اندازه است. تمام محتوای فایل در یک رشتهٔ ورودی ذخیره می‌شود. یک الگو انتخاب شده است که N آخرین حرف از رشته ورودی است. برنامه از چندین الگوریتم استفاده می‌کند و بارها در جستجو هر یک از ITER ها را اجرا می‌کند. برای مثال نسخهٔ std::string::find به صورت زیر آمده است: RunAndMeasure("string::find", [&]() { for (size_t i = 0; i < ITERS; ++i) { std::size_t found = testString.find(needle); if (found == std::string::npos) std::cout << "The string " << needle << " not found\n"; } }); نسخهٔ boyer_moore_horspool به صورت زیر: RunAndMeasure("boyer_moore_horspool_searcher", [&]() { for (size_t i = 0; i < ITERS; ++i) { auto it = std::search(testString.begin(), testString.end(), std::boyer_moore_horspool_searcher( needle.begin(), needle.end())); if (it == testString.end()) std::cout << "The string " << needle << " not found\n"; } }); در اینحا نتیجه بر روی سخت افزار با پردازندهٔ i7 4720HQ و Win 10 همراه با MSVC 2017 15.8 ریلیز ۶۴ بیت می‌باشد. الگو از ۱۰۰۰۰ حرف انتهای متن ورودی تشکیل شده است: .\searchers.exe ..\..\SampleBooks\book-test.txt 1000 10000 string length: 547412 test iterations: 1000 pattern length: 10000 string::find: 693.449 ms default searcher: 1102.25 ms boyer_moore_searcher: 133.558 ms boyer_moore_horspool_searcher: 37.0234 ms الگو در اینجا اکنون ۱۰۰ حرف آخر از متن ورودی است: .\searchers.exe ..\..\SampleBooks\book-test.txt 1000 200 string length: 547412 test iterations: 1000 pattern length: 200 string::find: 158.612 ms default searcher: 467.518 ms boyer_moore_searcher: 58.8752 ms boyer_moore_horspool_searcher: 56.7017 ms البته توجه داشته باشید که، نتایج نمونه نیاز به تحقیق بیشتری دارند. برای مثال در الگو‌های کوتاه، استفاده از روش string::find معمولاً سریعتر است. بنابراین، الگوریتم Horspool سریعتر از الگوریتم boyer_moore در این مورد بوده است. واقعیت مهم در مورد std::search این است که آن یک الگوریتم عمومی است! بنابراین شما می‌توانید آن را فقط برای رشته‌ها استفاده کنید. در اینجا مثالی آورده شده است که برای جستجوی یک الگو از شماره‌های موجود در یک بردار از عدد‌های صحیح است. std::vector<int> testVector(1000000); std::iota(testVector.begin(), testVector.end(), 0); std::vector vecNeedle(testVector.end() - 1000, testVector.end()); auto it = std::search(testVector.begin(), testVector.end(), std::boyer_moore_horspool_searcher( vecNeedle.begin(), vecNeedle.end())); if (it == testVector.end()) std::cout << "The pattern " << needle << " not found\n"; خلاصهٔ نتیجه در این مقاله به صورت مختصر در رابطه با قابلیت‌های جدیدی را که در سی‌پلاس‌پلاس ۱۷ دریافت کرده‌ایم اشاره شده است. مهم این است که بدانید الگوریتم‌های جدید همیشه سریعتر از std::string::find (برای رشته‌ها) نیستند.
  17. کامبیز اسدزاده

    در اسناد QML هر فایلی می‌تونه به عضو‌ها و خواص فایل‌های والد خودش دسترسی پیدا کنه. اما روش پیشنهادی این هست با تعریف یک QtObject اعضای مورد نظر خودتون رو تعریف کنید تا هر جا داخل هر فایلی که هستین بتونید به اون دسترسی داشته باشید. به عنوان مثال فایل main.qml import QtQuick 2.11 import QtQuick.Window 2.11 Window { visible: true width: 640 height: 480 title: qsTr("Hello World") QtObject { id:mainObject property string name : "Kambiz" } Page1 { anchors.fill: parent; } } و فایل دیگه که با نامPage1.qml هست تنها کافیه درونش شناسه‌ی QtObject رو صدا بزنید. به صورت زیر: import QtQuick 2.0 Item { Text { anchors.centerIn: parent text: mainObject.name } } اینجا من مقدار name که به عنوان عضوی از فایل main.qml هست رو صدا زدم و برابر با مقدار نوع Text قرار دادم.
  18. مراحل ساخت برنامه‌ در زبان سی‌پلاس‌پلاس پیش نویس ۰.۶ قبل از هر چیز به اینفوگرافی زیر توجه کنید که مراحل ساخت برنامه در سی‌پلاس‌پلاس را نشان می‌دهد. مقدمه‌ای بر همگردانی (کامپایل) و اتصال (لینک کردن) این سند مرور مختصری در رابطه با مراحل را برای شما فراهم می‌کند تا به شما در درک دستورات مختلف برای تبدیل و اجرای برنامهٔ خودتان کمک کند. تبدیل مجموعه‌ای از فایل‌های منبع و هدر در سی‌پلاس‌پلاس به یک فایل خروجی و اجرایی در چندین گام (به طور معمول در چهار گام) پیش‌پردازنده (Preprocessors)، کامپایل و گرد‌آوری (Compilation)، اسمبلر (Assmbler) و پیوند دهنده (Linker) تقسیم می‌شود. قبل از هر چیز اگر در محیط توسعهٔ Qt Creator داخل فایل .pro مقدار زیر را وارد کنید، تا بتوانید فایل‌های ساخته شدهٔ موقت در زمان کامپایل را مشاهده کنید. QMAKE_CXXFLAGS += -save-temps این دستور اجازهٔ آن را خواهد داد تا فایل‌هایی با پسوند .ii و .s در شاخهٔ بیلد پروژه تولید شوند که در ادامه به آن‌ها اشاره شده است. تعریف پیش‌پردازنده پیش‌پردازنده‌ها (Preprocessors) درواقع دستوراتی هستند که اجازه می‌دهند تا کامپایلر قبل از آغاز کردن مراحل کامپایل دستوراتی را دریافت کند. پیش‌پردازنده‌ها توسط هشتگ (#) مشخص می‌شوند این نماد در سی‌++ مشخص میکند که دستور فوق از نوع پیش‌پردازنده می‌باشد که نتیجهٔ آن در قالب ماکرو (Macro) در دسترس خواهد بود. برای مثال ماکروی __DATE__ توسط پیش‌پردازنده‌ها از قبل تعریف شده است که مقدار تاریخ و زمان را بازگشت می‌دهد. بنابراین هرکجا که از آن استفاده شود کامپایلر آن را جایگزین متن خواهد کرد. در شکل زیر مرحله‌ای که از پیش‌پردازنده‌ها استفاده می‌شود آمده است: پیش‌پردازنده، کامپایل (گردآوری کردن)، لینک (پیوند کردن) و ساخت برنامه اجرایی فرایند تبدیل مجموعه‌ای از فایل‌های متنی هِدر و سورس سی‌++ را «ساخت» یا همان Building می‌گویند. از آنجایی که ممکن است کُد پروژه در بسیاری از فایل‌ها هدر و سورس سی++ توسعه و گسترش یابدمراحل ساخت در چند گام کوچک صورت می‌گیرد. یکی از رایج‌ترین موارد در مراحل گردآوری (ترجمهٔ یک کد سی‌پلاس‌پلاس به دستورالعمل‌های قابل فهم ماشین) است. اما گام‌های دیگری نیز وجود دارد، پیش‌پردازنده و لینک (پیوند‌ها) این بخش به طور خلاصه توضیح می‌دهد که چه اتفاقی در هر یک از مراحل رُخ می‌دهد. یک کامپایلر یک برنامهٔ خاص است که پردازش اظهارات (دستورات) نوشته شده در یک زبان برنامه‌نویسی خاص را به یک زبان ماشین که قابل فهم برای پردازنده می‌باشد تبدیل کند. به طور معمول یک برنامه‌نویس با استفاده از یک ویرایشگر که به محیط توسعهٔ یکپارچهٔ نرم‌افزار (IDE) مشهور است توسط زبان برنامه‌نویسی مانند ++C دستورات (اظهارات) را می‌نویسد. فایل ایجاد شده با نام (filename.cpp در زبان برنامه‌نویسی سی‌پلاس‌پلاس) شامل محتوایی است که معمولاً به عنوان دستورات برنامه‌نویسی سطح بالا نامیده می‌شود. سپس برنامه‌نویس کامپایلرِ مناسب برای زبان برنامه‌نویسی مانند سی++ را اجرا می‌کند و نام فایل‌هایی که حاوی دستورات هستند را برای کامپایل مشخص می‌کند که این انتخاب و مشخص سازی توسط IDE به راحتی قابل مدیریت است. پس از آن، کار کامپایلر این است که فایل‌های منبع .cpp را جمع آوری کرده و پیش‌پردازنده‌ها را بررسی کند تا دستورات احتمالی را اجرا نماید که نتیجهٔ این مرحله در فایلی با پسوند .ii ر قالب filename.ii تولید می‌شود که در این فرایند نیز خط به خط کُد‌های موجود در آن‌ها را بررسی می‌کند تا خطاهای احتمالی نحو (سینتکس - Syntax) بررسی می‌شود و آن‌ها را به طور ترتیبی به دستورالعمل‌های سطح ماشین تبدیل کند. توجه داشته باشید که هر نوع پردازندهٔ کامپیوتر دارای مجموعه‌ای از دستورالعمل‌هایِ ماشین خودش است. بنابراین کامپایلر تنها برای سی++ نیست، بلکه برای اهداف و مقاصد خاص هر پلتفرم است. پس کد‌هایی که توسط پیش‌پردازنده سی‌پلاس‌پلاس به زبان اسمبلی برای معماری مورد نظر در پلتفرم مقصدترجمه شده‌اند نتایج آن در فایلی با پسوند .ss در قالب filename.ss قابل نمایش هستند که در حالت عادی قابل رویت نیست. توجه داشته باشید که باید در این مرحله باید مشخص شود برنامه قرار است توسط چه نوع پردازنده‌ای تحتِ چه نوع معماری مونتاژ (اسمبل) شود. برای مثال پردازنده‌ها با انواع معماری‌های مختلف وجود دارند که برخی از آن‌ها به صورت x86-x64، x64، ARMv7، aarch64 غیره ... می‌باشند. شکل یک (کامپایل یک فایل منبع ++C) مرحلهٔ سوم را در نظر داشته باشید که عمل کامپایل فایل سی‌پلاس‌پلاس در دو مرحله قبلی یک فایل اجرایی را تولید نمی‌کند. برنامه‌ای که توصیف شده است، احتمالاً توابعی را در رابط‌های برنامه‌نویسی (API) و یا توابع ریاضی یا توابع مرتبط با I/O را فراخوانی کند که ممکن است شامل فایل‌های هدر مانند iostream یا fstream و حتی ماژول‌های دیگری که در زبان‌ تعبیه شده‌اند را داشته باشد که فایل تولید شده توسط کامپایلر در این مرحله یک فایل شیء نامیده می‌شود که با پسوند .o به صورت filename.o تولید خواهد شد که علاوه بر دستورالعمل‌های تبدیل شده به کد ماشین، شامل توابع و دستورالعمل‌های خارجی نیز می‌باشد. هرچند در این مرحله دستورات تبدیل به دستورالعمل‌های قابل فهم توسط پردازنده شده‌اند اما فعلاً قابل اجرا نیستند چرا که باید این توابع خارجی افزوده شده را به آن لینک کرد که در مرحلهٔ بعد یعنی مرحلهٔ چهارم اتفاق می‌افتد. در نهایت مرحلهٔ چهارم فایل با پسوند .o که شامل کد‌های تولید شده توسط کامپایلر به زبان ماشین است که پردازنده‌ها می‌توانند این دستورات را درک کنند که همراه با کد‌های تولید شدهٔ هر کتابخانهٔ دیگری که مورد نیاز است توسط لینکر (لینک شده) و در نهایت جهت تولید یک فایل اجرایی مورد استفاده قرار می‌گیرند که نوع آن فایل از نوع اجرایی یا در واقع Executable File خواهد بود. شرح کامل فرایند ساخت فایل اجرایی اکثر پروژه‌ها دارای مجموعه‌ای از فایل‌های هدر سی++ هستند، که امکان ماژولار شدن در آن را فراهم می‌کند و مجموعه‌ای از آن می‌تواند به عنوان بخش‌های کوچکی از برنامه محسوب شوند. برای ساخت چنین پروژه‌هایی هر فایل سی‌پلاس‌پلاس باید کامپایل شود و سپس فایل‌های ساخته شده در قالب شیء (آبجکت) باید همراه توابع و کتابخانه‌های دیگر لینک (پیوند) شوند. البته هر گام از مراحل کامپایل شامل یک مرحله پیش‌پردازنده است که دستورالعمل # عمل تغییرات و اصلاحیه‌ها را در فایل متن اعمال می‌کند. شکل زیر فرایند ساخت چند فایل به صورت همزمان را نشان می‌دهد: در ادامهٔ این مقاله، مطلبی مرتبط با تنظیمات بیشتر از کامپایلر آمده است که می‌توانید آن را مورد مطالعه قرار دهید.
  19. کامبیز اسدزاده

    خدارو شکر. خب وقتی سیستم عاملت رو تازه نصب کردی حتماً یک سری ابزار‌ها و کتابخانه‌ها روش وجود نداره. مثل کتابخانه‌های گرافیکی مورد نیاز، کامپایلر‌ و برخی از ابزار‌های دیگه که روی لینوکس باید این دو دستور رو اجرا کنی و نصبشون کنی. خطای lGL- هم مربوط به کتابخانه OpenGL هست.
  20. کامبیز اسدزاده

    با سلام، ما برای بهبود و سرعت بخشی برای توسعه محصولاتمون رو پلتفرم‌های مختلف برای جولوگیری از بازنویسی کُد‌های مشابه و یک سری ابزار‌هایی که برای تولید قابلیت‌های ویژه در پروژه‌ها و اپلیکیشن‌های موبایل و دسکتاپ نیاز داشتیم رو به صورت انحصاری در قالب یک موتور اختصاصی برای شرکت خودمون تولید کردیم که در توسعه هر چه سریعتر استارت‌آپ‌ها بسیار مفید واقع می‌شود. قابلیت‌ها و ویژگی‌ها با استفاده از پروژه‌ی سِل ما می‌توانیم بَک‌اند و ترکیبی از عملیات فرانت‌اِند پروژه‌های خود را در کمترین زمان ممکن تولید و توسعه دهیم که در نتیجه گیری سریع یک استارت‌آپ بسیار مفید است. این کار باعث می‌شود ما هر بار در پروژه‌های خودمان نیاز به باز نویسی کلاس‌ها و توابع و تولید ابزار‌هایی نباشیم که در یک محصول مورد نیاز است. عنوان: پروژه‌ی سِل انجین (Cell) توضیحات: این پروژه یک موتور برنامه‌نویسی چند‌سکویی در قالب یک چهارچوب تخصصی می‌باشد که در توسعه هرچه سریع‌تر محصولات و طراحی و همچنین مستقر سازی آن‌ها بر روی پلتفرم‌های مختلف کمک بسیاری می‌کند. زبان‌ها و فناوری‌های استفاده شده: زبان برنامه‌نویسی ++C فریم وُرک‌ و کتابخانه‌ها: کتابخانه‌ی OpenSSL‌، LibCurl، STL ابزار‌های ساخت: cmake نوع پروژه: تجاری (انحصاری شرکتِ Dotwaves LLC) نویسندگان: کامبیز اسدزاده وضعیت: در حال توسعه حق چاپ و تکثیر: شرکت دات‌ویوز برخی از محصولاتی که تحت این موتور طراحی شده اند: سیستم مدیریت محتوای جگوار
  21. کامبیز اسدزاده

    با سلام، همانطور که می‌دانید سیستم‌‌های مدیریت محتوا به عنوان سیستم پویا برای مدیریت محتوای یک وب‌سایت بسیار مفید هستند. حال آنکه یک سیستم مدیریت محتوا فراتر از یک سیستم نرم‌افزاری جهت مدیرین محتوای وب‌سایت توسعه یابد بسیار مفید خواهد بود. قابلیت‌ها و ویژگی‌ها با استفاده از سیستم مدیریت محتوای جگوار (Jaguar) ما می‌توانیم برای مشتریان خود یک سیستم مدیریت چند منظوره با قابلیت‌های کاملاً پویا ارائه دهیم که هر استارتاپی می‌تواند کسب‌و‌کار خود را تحت آن توسعه دهد. این سیستم دارای قابلیت‌های چند سکویی و چند منظوره می‌باشد که یکی از قابلیت‌های برجستهٔ آن پشتیبانی از سیستم چند زبانه می‌باشد. این سیستم در پلتفرم‌های وب، موبایل و دسکتاپ توسعه داده شده است. عنوان: پروژهٔ جگوار (Jaguar) توضیحات: سیستم مدیریت محتوای چند منظوره و پیشرفته زبان‌ها و فناوری‌های استفاده شده: زبان‌های Php7, JavaScript, CSS3, HTML5 فریم وُرک‌ و کتابخانه‌ها: کتابخانهٔ JQuery , Angular.JS, BootStrap4 نوع پروژه: تجاری (انحصاری شرکتِ Dotwaves LLC) نویسندگان: کامبیز اسدزاده وضعیت: در حال توسعه حق چاپ و تکثیر: شرکت دات‌ویوز این محصول بر پایه موتور سِل توسعه داده شده است. برخی از تصاویر مرتبط با این محصول:
  22. با سلام، با توجه به درخواست‌های مکرر از کاربران و اساتید محترم، نیاز جامعه‌‌ی برنامه‌نویسی به معرفی محصولات و قابلیت‌های یک زبان در قالب یک محصول قابل لمس و دیداری احساس می‌شد. بنابراین این بخش با هدف این که توسعه‌دهندگان بومی بتوانند محصولات و پروژه‌های خود را برای معرفی از جنبه‌های فنی و همچنین تجاری مطرح نمایند ایجاد شده است. هدف این است که شما توسعه‌دهنده‌ی محترم بتوانید برای کسب نظر از تجربیات اساتید برای توسعه هرچه بهتر پروژه‌‌ی خود و همچنین معرفی محصول نوشته شده‌ی خود اقدام کنید. در صورتی که محصول شما تحت زبان و استاندارد‌های ویژه‌ای تولید شده است می‌توانید آن را برای همگان نشان دهید تا بتوانند نمونه‌ی واقعی یک محصول را در آن حوزه مشاهده نمایند. اهداف کلی معرفی محصولات نوشته شده توسط زبان‌های مختلف (این کار باعث می‌شود توسعه‌دهندگان قابلیت‌های یک زبان را در پروژه واقعی مشاهده کنند) هر چند ممکن است پروژه‌های کوچکی معرفی شود اما اینکه با یک زبان واقعاً چه کار‌هایی می‌توان انجام داد بسیار مهم است. امکان نظر سنجی و کسب نظرات اساتید و افراد با تجربه برای بهبود هرچه بهتر پروژه شما امکان بررسی و ارسال نظر و امتیاز به پروژه شما جهت کسب امتیاز مهارتی و تجربی امکان بررسی پروژه و رزومه‌های واقعی شما توسط کارفرمایان و اساتید معتبر امکان ایجاد محیط رقابتی برای بهبود مهارت‌های تخصصی و شخصی در توسعه‌دهندگان و در نهایت بهبود مهارت‌های جامعه‌ی برنامه‌نویسی نمونه قالب معرفی پروژه به صورت زیر می‌باشد: عنوان پروژه توضیحات در رابطه با کاربرد پروژه معرفی زبان برنامه‌نویسی بَک‌اِند معرفی زبان یا فناوری‌های به کار گرفته شده در بخش فرانت‌اِند کتابخانه‌ها و فریموُرک‌های استفاده شده نوع پروژه (رایگان یا تجاری) تعداد توسعه دهندگان یا تیم حق چاپ و تکثیر (شخصی یا حقوقی) چند قطعه تصویر استاندارد از محیط محصول مثال: با سلام، عنوان: پروژه‌ی جِنسیس (Genesis) توضیحات: این پروژه یک موتور برنامه‌نویسی چند‌سکویی در قالب یک چهارچوب تخصصی می‌باشد که در توسعه هرچه سریع‌تر محصولات و طراحی و همچنین مستقر سازی آن‌ها بر روی پلتفرم‌های مختلف کمک بسیاری می‌کند. زبان‌ها و فناوری‌های استفاده شده: زبان برنامه‌نویسی ++C فریم وُرک‌ و کتابخانه‌ها: کتابخانه‌ی OpenSSL‌، LibCurl، STL ابزار‌های ساخت: qmake، qbs و cmake نوع پروژه: تجاری (انحصاری شرکتِ Dotwaves LLC) نویسندگان: کامبیز اسدزده حق چاپ و تکثیر: شرکت دات‌ویوز *دوستان می‌توانند نظرات و پیشنهادات خود را در رابطه با این پروژه اعلام کنند.
  23. کامبیز اسدزاده

    دستورات زیر را در ترمینال اجرا کنید. sudo apt-get install build-essential sudo apt-get install mesa-common-dev libglu1-mesa-dev
  24. پیشنهادات و ملاحظات در عملکرد و کارآیی همانطور که می‌دانید تولید و توسعه‌ی یک نرم‌افزار با سرعت و کارآیی بالا یکی از مزایایی مهارتی توسعه‌دهندگان است که به تنهایی می‌تواند به عنوان یک فاکتور بسیار مهم مطرح شود. بنابراین در صورتی که شما محصولی را در قالب وب، موبایل یا دسکتاپ تولید می‌کنید باید به آن توجه داشته باشید که سرعت اجرایی برنامه‌ی شما در زمان استارتاپ و بعد در مراحل پردازشی و فرایند‌های دیگر باید مورد قبول باشد. در این میان برنامه‌نویسان سی++ می‌دانند که باید در مدیریت حافظه و دیگر موارد با دقت بیشتری عمل کنند تا بتوانند به حداقل نشتی در حافظه (حتی فاقد نشتی در آن) و در نهایت رسیدن به حداکثر سرعت پردازشی توجه داشته باشند. با توجه به این موضوع که کتابخانه‌ی Qt به عنوان یکی از کتابخانه‌های این زبان بشمار می‌آید؛ بسیاری از توسعه‌دهندگان درگیر توسعه‌ی بخش فرانت‌اِند نیز می‌شوند. بنابراین باید توجه داشت در زمان توسعه رابط کاربری مبتنی بر فناوری Qt Quick مواردی را جهت افزایش کارآیی سرعت و هماهنگی کامل با سی++ را در نظر بگیرند چرا که بدون در نظر گرفتن فاکتور‌های زمانی نتیجه‌ی آن بسیار بد خواهد بود. شما به عنوان یک توسعه دهنده نرم‌افزار، باید برای رسیدن حداکثر فریم ریت ۶۰ در موتور رندرینگ تلاش کنید. این میزان بدین معنی است که بین هر فریم که در میان آن‌ها می‌تواند پردازش انجام شود، تقریباً ۱۶ میلی ثانیه وجود دارد که شامل پردازش مورد نیاز برای بارگذاری‌های اولیه به سمت سخت‌افزار گرافیکی می‌باشد. در عمل، این به این معنی است که توسعه‌دهنده نرم‌افزار باید: هر کجا که ممکن است از روش ناهمزمان (Asynchronous) در بخش برنامه‌نویسی رویدادمحور (Event-driven programming) استفاده کند. در بخش‌هایی که به میزان قابل توجهی شامل پردازش می‌شوند از وُرکر‌ترد‌ (worker threads) استفاده کند. هرگز حلقه رویداد را به صورت دستی برای چرخش و ادامه تنظیم نکند. هرگز بیش از چند میلی ثانیه برای هر فریم در بلوک توابع صرف نکند. عدم انجام این کار‌ها باعث پَرش در فریم‌ها می‌شود که تاثیر بسیار جدی در تجربه‌ کاربری دارد. نکته: الگویی که وسوسه انگیز است اما نباید هرگز از آن استفاده شود، چرا که یک‌‌ متد QEventLoop و یا صدا زدن یک متد دیگر مانند QCoreApplication::processEvent به منظور جلوگیری از مسدود شدن در یک بلوک کُد سی++ که در QML استفاده شده است به کار گرفته می‌شود. این خطرناک است، زیرا زمانی که یک حلقه رویداد در هندلر سیگنال و یا پیوند (Binding) وارد می‌شود، موتور QML همچنان برای اجرای سایر پیوندها، انیمیشنها، ترنسیشن‌ها و غیره می‌پردازد. این اتصالات می‌توانند باعث عوارض‌های جانبی شوند. پروفایلینگ (Profiling) مهمترین نکته این است که: از ابزار QML Profiler که بخشی از محیط توسعه یکپارچه‌ی نرم‌‌افزار Qt Creator است استفاده کنید. زیرا دانستن زمانی که در یک برنامه صرف می‌شود به شما امکان این را می‌دهد تا بر قسمت یا بخشی که در آن مشکل وجود درد تمرکز سریع‌تر و بهتری داشته باشید. برای نحوه‌ی استفاده از این ابزار به کتابچه‌ی راهنمای خود کیوت کریتور مراجعه کنید. تعیین کردن اینکه اغلب کدام پیوند (اتصال) در حال اجرا است، یا کدام یک از توابع شما بیشترین زمان را برای اجرا صرف می‌کنند، به شما این امکان را می‌دهد که تصمیم بگیرید که آیا شما نیاز به بهینه سازی آن بخش از کُدها را دارید یا نیاز خواهد بود آن بخش از کد خود را مجددا پیاده سازی کنید تا عملکرد آن بهتر شود یا خیر. به طور کلی تلاش برای بهینه سازی بدون استفاده از ابزار QML Profiler احتمالاً باعث بهبود‌های جزئی و غیرقابل توجه در عملکرد خواهد شد. کُد جاوا اسکریپ (JavaScript) بیشتر برنامه‌های QML مقدار زیادی از کدهای جاوا اسکریپت در درون خود خواهند داشت. که به شکل توابع پویا، مدیریت سیگنال و یا عبارت‌های مربوط به پراپرتی‌ها (مشخصه، اموال) را در اختیار دارند. به طور کلی این یک مشکل نیست. با تشکر از برخی از بهینه سازی‌های موتور QML، مانند آنهایی که به کامپایلر منتقل می‌شوند، می‌تواند (در بعضی موارد استفاده شده) حتی سریع‌تر از فراخوانی‌های سمت سی++ باشد. با این حال، باید اطمینان حاصل شود که پردازش غیر ضروری به طور تصادفی اتفاق نیفتاده باشد. اتصالات (Binding) دو نوع اتصال در QML وجود دارد: اتصالات بهینه شده و غیر بهینه شده. ایده‌ی خوبی است که عبارات مربوطه را به همان اندازه ساده‌تر حفظ کنید. زیرا موتور QML برای ارزیابی عبارات از یک ارزیابی ساده و بهینه شده استفاده می‌کند که می‌تواند مشخص کند تا نیازی به تغییر آن در محیط جاوا اسکریپت نباشد. این اتصالات بهینه سازی شده بسیار کارآمدتر از اتصالات پیچیده تر (غیر بهینه سازی شده) هستند. الزامات اساسی نیز برای این گونه اتصال‌ها این است که اطلاعات نوع هر نماد که به آن دسترسی دارد باید در زمان کامپایل شناخته شده باشد. عواملی که باعث جلوگیری از به حداکثر رساندن بهینه سازی در عبارات اتصالات می‌شود: تعریف متغیرهای واسط توسط جاوا اسکریپت دسترسی به خواص var صدا زدن توابع جاوا اسکریپت ساخت (آغاز یا خاتمه یافتن) و یا تعریف توابع در میان عبارت‌ اتصالات دسترسی به خواص (پراپرتی‌های) خارج از محدوده ارزیابی فوری نوشتن درمورد سایر عوامل به عنوان عوارض جانبی توجه داشته باشید، زمانی اتصالات سریعتر می‌شوند که نوع اشیاء و خواصی که با آنها کار می‌کنند مشخص شده باشند. این به این معنی است که، خواص غیرنهایی (non-final) ممکن است در بعضی موارد کُند‌تر باشد. (جایی که ممکن است یک خاصیت تغییر کرده باشد). محدوده‌هایی ای که برای ارزیابی فوری می‌توان در نظر گرفت قسمت زیر هستند: ارزیابی در خاصیت‌ عبارت‌های دامنه‌ی یک شیء (برای عبارت‌های اتصال، این است که شیء به کدام یک از خاصیت‌های اتصال تعلق دارد). ارزیابی در شناسه‌های هر یک از اشیاء موجود در کامپوننت (جزء) ارزیابی در خاصیت‌های ریشه‌ی آیتم در یک کامپوننت (جزء) شناسه‌های اشیاء از دیگر کامپوننت‌ها و خاصیت‌های هر یک از اشیاء، مانند نمادهای تعریف شده و یا وارد شده از طرف جاوا اسکریپت در محدوده ی ارزیابی فوری نیستند. به این ترتیب اتصالاتی که به این موارد مربوط هستند نمی‌توانند بهینه سازی شوند. نکته: توجه داشته باشید که اگر نمی‌توانید اتصالات مورد نظر خود را توسط موتور QML بهینه‌سازی کنید، در این صورت باید آن را در محیط کامل جاوا اسکریپت بهینه سازی نمایید. نوع تبدیل (Type-Conversion) یک مزیت عمده برای استفاده از جاوا‌ اسکریپت این است که در اغلب موارد، هنگامی‌‌که به یک ویژگی از نوع QML دسترسی پیدا می‌شود‌، یک شیء جاوا اسکریپت با منبع حاوی سی‌پلاس‌پلاس پایه (یا یک مرجع آن) ایجاد می‌‌گردد. در بیشتر موارد، این عمل به‌نسبت کم‌هزینه است، اما در سایر موارد می‌تواند بسیار پر‌هزینه باشد. یک مثال از پر‌هزینه بودن آن، ارجاع کردن QVariantMap و Q_PROPERTY به ویژگی نوع QML است. لیست‌ها نیز می‌توانند هزینه‌بالایی داشته‌ باشند. اگرچه دنباله‌ی انواع خاص (QList از int، qreal، bool، Qstring و QUrl) باید کم‌هزینه باشد. تبدیل انواع دیگر لیست هزینه‌ی زیادی دارد (ایجاد آرایه‌ی جدید جاوا اسکریپت و افزودن تک به تک انواع جدید، با تبدیل هر نوع از نمونه‌ی‌ نوع سی‌پلاس‌پلاس به مقدار جاوا اسکریپت). رفع سازی خواص‌ها تفکیک پذیری در خواص (پراپرتی‌ها) زمان بر است. در حالی که در بعضی از موارد نتیجه آن می‌تواند ذخیره شده و دوباره مورد استفاده قرار بگیرد. بهتر است همیشه از انجام کارهای غیر ضروری جلوگیری شود. در مثال زیر، ما یک بلوک کد داریم که اغلب اجرا می‌شود (در این مورد، آن شامل یک حلقه صریح است؛ اما برای مثال می‌توان آن را با یک عبارت پیوند و مورد ارزیابی قرار داد). در این مثال مشکل را با در نظر گرفتن شناسه "rect" و خاصیت رنگ "color" آن را چندین بار تغییر و تولید می‌کنیم. این مثال کاری که می‌خواهیم را انجام می‌دهد، اما روش بهینه شده ای نیست بنابراین مثال زیر بسیار بد خواهد بود: import QtQuick 2.3 Item { width: 400 height: 200 Rectangle { id: rect anchors.fill: parent color: "blue" } function printValue(which, value) { console.log(which + " = " + value); } Component.onCompleted: { var t0 = new Date(); for (var i = 0; i < 1000; ++i) { printValue("red", rect.color.r); printValue("green", rect.color.g); printValue("blue", rect.color.b); printValue("alpha", rect.color.a); } var t1 = new Date(); console.log("Took: " + (t1.valueOf() - t0.valueOf()) + " milliseconds for 1000 iterations"); } } برای اینکه کد فوق بهینه سازی شود بهتر است به صورت زیر باشد: import QtQuick 2.3 Item { width: 400 height: 200 Rectangle { id: rect anchors.fill: parent color: "blue" } function printValue(which, value) { console.log(which + " = " + value); } Component.onCompleted: { var t0 = new Date(); for (var i = 0; i < 1000; ++i) { var rectColor = rect.color; // resolve the common base. printValue("red", rectColor.r); printValue("green", rectColor.g); printValue("blue", rectColor.b); printValue("alpha", rectColor.a); } var t1 = new Date(); console.log("Took: " + (t1.valueOf() - t0.valueOf()) + " milliseconds for 1000 iterations"); } } فقط این تغییر ساده باعث بهبود عملکرد قابل توجهی می‌شود. بنابراین، توجه داشته باشید که کد بالا را می‌توان حتی بهبود بیشتری داد (از آنجا که ویژگی مورد نظر هرگز در طول پردازش حلقه تغییر نکرده است)، با بالا بردن دقت خارج از حلقه، به صورت زیر است: import QtQuick 2.3 Item { width: 400 height: 200 Rectangle { id: rect anchors.fill: parent color: "blue" } function printValue(which, value) { console.log(which + " = " + value); } Component.onCompleted: { var t0 = new Date(); var rectColor = rect.color; // resolve the common base outside the tight loop. for (var i = 0; i < 1000; ++i) { printValue("red", rectColor.r); printValue("green", rectColor.g); printValue("blue", rectColor.b); printValue("alpha", rectColor.a); } var t1 = new Date(); console.log("Took: " + (t1.valueOf() - t0.valueOf()) + " milliseconds for 1000 iterations"); } } پیوند خاصیت‌ها (Property Binding) در صورتی که خواص مرجع هر یک از اتصالات تغییر یابند، به آن خاصیت متصل دوباره ارزیابی خواهد شد. به همین ترتیب، عبارات خواص باید به همان اندازه ساده باشند. اگر شما یک حلقه دارید که در آن پردازشی را انجام می‌دهید، اما تنها نتیجه نهایی پردازش مهم است، اغلب بهتر است که موقتاً آن را به‌روز کرده و در صورت نیاز آن را برای به‌روز رسانی یک خاصیت مورد نیاز اختصاص دهید. این کار به منظور جلوگیری از ارزیابی‌های مجدد بسیار مفید خواهد بود. مثال ذکر شده زیر این نکته را نشان می‌دهد که بسیار بد پیاده سازی شده است: import QtQuick 2.3 Item { id: root width: 200 height: 200 property int accumulatedValue: 0 Text { anchors.fill: parent text: root.accumulatedValue.toString() onTextChanged: console.log("text binding re-evaluated") } Component.onCompleted: { var someData = [ 1, 2, 3, 4, 5, 20 ]; for (var i = 0; i < someData.length; ++i) { accumulatedValue = accumulatedValue + someData[i]; } } } حلقه ای که در رویداد onCompleted می‌باشد، موجب می‌شود تا خاصیت متن text به تعداد ۶ بار مجدداً مورد ارزیابی قرار بگیرد (که در نتیجه هر گونه پیوند مرتبط با مقدار متن متکی است) همچنین کنترلر سیگنال onTextChanged هر یک را مجدداً ارزیابی می‌کند و این موجب می‌شود متن هر بار نمایش داده شود. این امر ضروری نیست چرا که هدف ما دسترسی به ارزش نهایی آن خواهد بود. روش پیشنهادی به صورت زیر خواهد بود: import QtQuick 2.3 Item { id: root width: 200 height: 200 property int accumulatedValue: 0 Text { anchors.fill: parent text: root.accumulatedValue.toString() onTextChanged: console.log("text binding re-evaluated") } Component.onCompleted: { var someData = [ 1, 2, 3, 4, 5, 20 ]; var temp = accumulatedValue; for (var i = 0; i < someData.length; ++i) { temp = temp + someData[i]; } accumulatedValue = temp; } } بارگذاری‌ها و منابع مرتبط به تصاویر تصاویر بخش مهمی از رابط کاربری هستند. متأسفانه، به دلیل زمان بارگیری آنها، میزان حافظه ای که مصرف می‌کنند نیز قابل توجه است. بنابراین توجه داشته باشید که در صورتی که اپلیکیشن شما شامل تصاویری با اندازه بزرگتر هستند، اما شما آن را در اندازه‌ی کوچکتر از واقعی خود نشان می‌دهید. در این صورت بهتر است اندازه سورس آن را نیز مشخص کنید که در خاصیت "sourceSize" مشخص می‌شود. این کار باعث می‌شود تا مطمئن شویم عنصور تولید شده با مقیاس کوچکتری در حافظه نگهداری می‌شود. البته مراقب این نیز باشید که تغییر اندازه سورس موجب می‌شود تصویر دوباره بارگیری شود. بارگیری غیر‌همزمان (Asynchronous) معمولاً برنامه‌های زیبا و با کیفیت دارای تصاویر با کیفیت نیز هستند، بنابراین لازم است تا اطمینان حاصل شود که بارگیری یک تصویر یک رشته از UI را بلوک یا مسدود نمی‌کند. خاصیت asynchronous در نوع QML Image را با مقدار true تنظیم کنید تا بارگیری غیرهمزمان از تصاویر بر روی سیستم فایل‌های محلی بارگیری شود. این کار از وارد کردن فشار بر روی تصاویر و رابط کاربری جلوگیری خواهد کرد که نتیجه‌ی آن حفظ زیبایی رابط کاربری شما در زمان بارگذاری تصاویر خواهد شد. نکات ریز اما مهم از سایه پردازی‌ها و تصاویری که در حین زمان اجرا در ترکیب تصاویر شما ایجاد می‌شوند دوری کنید. توجه داشته باشید که در صورت عدم نیاز از خاصیت smooth استفاده نکنید. فعال سازی این خاصیت موجب تولید تصاویر صاف و با کیفیت می‌شود که در سخت افزا‌های قدرتمند توصیه می‌شود. در سخت افزار‌های ضعیف تولید تصاویر صاف زمانبر خواهد بود و در صورتی که اندازه‌ی تصویر واقعی نباشد بر روی نتیجه‌ی آن تاثیری نخواهد داشت. از نقاشی و یا رسم طرح بر روی یک ناحیه به صورت پشت سر هم اجتناب کنید. از نوع Item به عنوان عنصر ریشه به جای Rectangle استفاده کنید. عناصر موقعیت با لنگر استفاده از لنگرها (anchors) به جای اتصالات (bindings) به یک آیتم موقعیت نسبتاً تاثیر بیشتری خواهد داشت. برای مثال برای اتصال موقعیت rect2 به rect1 را توجه کنید: import QtQuick 2.3 .... Rectangle { id: rect1 x: 20 width: 200; height: 200 } Rectangle { id: rect2 x: rect1.x y: rect1.y + rect1.height width: rect1.width - 20 height: 200 } .... این کار را می‌توان توسط لنگر‌ها به طور بسیار موثری انجام داد: import QtQuick 2.3 .... Rectangle { id: rect1 x: 20 width: 200; height: 200 } Rectangle { id: rect2 height: 200 anchors.left: rect1.left anchors.top: rect1.bottom anchors.right: rect1.right anchors.rightMargin: 20 } .... تنظیم موقعیت توسط اتصالات (با اختصاص دادن عبارت‌های اتصال به محورهای x و y طول و ارتفاع به عنوان خواص یک شیء به جای استفاده از لنگر‌ها) هرچند به حداکثر انعطاف پذیری اجازه می‌دهد اما نتیجه تولیدی آن نسبتاً کُند است. در نظر داشته باشید که اگر شیء شما به صورت داینامیک (پویا) تغییر پیدا نمی‌کند، روش مناسب تغییر موقعیت استفاده از خاصیت‌های y، x‌، width و height می‌باشد که متناسب و وابسته به والد خود می‌باشد. در صورتی که می‌خواهید وابستگی ایجاد نشود بهتر است از لنگر‌ها استفاده کنید. در مثال زیر، اشیاء مستطیل (Rectangle) فرزند در یک مکان مشابهی قرار گرفته اند، اما کدهای مرتبط به لنگرها (anchors) نشان میدهد که موقعیت آن شیء به صورت ثابت مقدار دهی شده است. import QtQuick 2.3 Rectangle { width: 60 height: 60 Rectangle { id: fixedPositioning x: 20 y: 20 width: 20 height: 20 } Rectangle { id: anchorPositioning anchors.fill: parent anchors.margins: 20 } } مدلها و نمایش‌ها اکثر برنامه های کاربردی (Application) حداقل از یک مدل (Model) تغذیه داده را به نمایه (View) ارسال می‌کنند. بعضی از مواردی که توسعه دهندگان برای به حداکثر رساندن عملکرد به آنها باید توجه داشته باشند وجود دارد. مُدل‌های سفارشی سمت سی‌پلاس‌پلاس این بسیار خوب است که شما مدل‌های داده‌ای سفارشی خود را سمت ++C برای استفاده ار نمایه‌ی QML بنویسید. اما باید توجه داشته باشید این کار به شدت بستگی به کاربرد آن در موقعیت خودش را دارد که برخی از دستورالعمل های کلی به شرح زیر هستند: تا جایی که ممکن است ناهمزمان باشد. تا جای ممکن بصورت ناهمزمان، تمام پروسه‌های پردازشی را در یک نخ با (اولیت پایین) انجام دهید. عملیات بک‌اند را به صورت دسته ای انجام دهید تا (به طور بالقوه آهسته) عمل‌های I/O و IPC به حداقل برسد. از یک پنجره مجزا برای نتایج کَش که پارامترهایش به پروفایلینگ کمک می‌کنند، استفاده کنید. این مهم است که توجه داشته باشیم استفاده از یک نَخ (Thread) کارآمد با کمترین اولویت توصیه میشود تا خطر قحطی (starving) را در نخ های رابط کاربری به حداقل برساند. همچنین به یاد داشته باشید که مکانیزم هماهنگ سازی و قفل کردن می‌تواند عامل مهمی برای عملکرد آهسته باشد، بنابراین لازم است از اعمالِ قفل غیر ضروری جلوگیری (صرف نظر) شود. نوع لیست مُدل (ListModel) در QML کیوامال (QML) یک نوع ListModel ای را فراهم می‌کند که می‌تواند برای ارسال داده به یک نوع از ListView استفاده شود. این باید برای اکثر موارد مناسب باشد و تا زمانی که به درستی استفاده شود نسبتاً عملکرد درستی داشته باشد. تجمع در داخل یک نخ عناصر ListModel را می توان در یک نخِ کاری (با اولویت پایین) در JavaScript جابجا کرد. توسعه‌دهنده باید صریحاً متد sync() را که به عنوان یکی از خواص موجود در ListModel می‌باشد را داخل یک WorkerScript صدا بزند تا تغییرات همزمان با نَخ اصلی صورت بکیرد. جهت کسب اطلاعات بیشتر مستندات WorkerScript را مطالعه کنید. لطفاً توجه داشته باشید که با استفاده از یک عنصر WorkerScript یک موتور جاوا اسکریپت جداگاه ایجاد می‌شود (چرا که موتور جاوا اسکریپت در هر نَخ (Thread) می‌باشد). این باعث افزایش مصرف حافظه خواهد شد. چرا که عناصر متعدد (چندگانه) WorkerScript همه از یک نَخ استفاده خواهند کرد. بنابراین تاثیر شدیدی در حافظه‌ی استفاده شده توسط وُرکر دوم و سوم وارد خواهد کرد که در زمان اجرای برنامه و وُرکر اسکریپت اول تاثیر آن بسیار ناچیز خواهد بود. از نقش‌های (Roles) پویا استفاده نکنید عنصر ListModel در QtQuick 2 بسیار کارآمدتر از QtQuick است. بهبود عملکرد عمدتاً از پیش فرض‌های مربوط به نوع نقشها (Roles) در هر عنصر در یک مدل داده می‌شود. اگر نوع آن تغییر نکند، عملکرد ذخیره سازی به طور چشمگیری بهبود می‌یابد. اگر نوع قابلیت تغییر به صورت پویا از عنصر به عنصر دیگری را داشته باشد، بهینه سازی غیر ممکن شده و عملکرد (پرفرمنس - کارآیی) مدل به اندازه‌ی بزرگی بدتر و کُند‌تر خواهد شد. بنابراین به صورت پیشفرض حالت داینامیک غیر فعال بوده و توسعه‌دهنده خود باید خاصیت dynamicRoles را به عنوان یکی از خاصیت‌های ListModel فعال کند. البته به شدت پیشنهاد می‌شود برنامه‌ی خود را از اول طراحی کنید اما این قابلیت را فعال نکنید. نمایه‌ها (Views) توجه داشته باشید که نماینده (دلیگیتس یا delegates) باید به طور ساده حفظ شود. به اندازه‌ی کافی از انواع QML در این خاصیت‌های ضروری استفاده کنید. هرگونه قابلیت اضافه که بلافاصله مورد استفاده قرار نمی‌گیرد نیاز نیست. برای مثال اگر نیاز است اطلاعات بیشتری در موقع کلیک بر روی آیتم نمایش داده شود، نیاز نیست که همان لحظه ایجاد و بر روی آیتم نمایان شوند. نباید تا قبل از زمان نیاز ایجاد شوند. لیست زیر، خلاصه‌ی خوبی از مواردی است که باید هنگام طراحی بر روی خاصیت delegate در نظر داشته باشید: عناصری که کمتر در خاصیت delegate هستند، سریعتر می توانند ایجا شوند، و بنابراین سریعتر میتوانند در نمایه (view) مشاهده و اسکرول شوند. تعداد پیوندها (اتصالات) را در delegate به حداقل تعدادشان نگه داری کنید. از لنگرها (anchors) به جای اتصال برای موقعیتهای نسبی در یک delegate استفاده شود. از به کار گیری عناصر ShaderEffect در delegate اجتناب شود. هرگز خاصیت clip را در خاصیت delegate فعال نکنید. نکته: شما می‌توانید ویژگی cacheBuffer یک نمایه (view) را تنظیم کنید تا اجازه ایجاد و ارسال غیر مستقیم به delegate خارج از ناحیه قابل مشاهده را ایجاد کنید. استفاده از cacheBuffer برای delegate های نمایشی توصیه می شود. توجه داشته باشید که خاصیت delegate یک cacheBuffer اضافی را در حافظه نگه می‌دارد، بنابراین مقدار حاصل از استفاده cacheBuffer باید با استفاده از حافظه اضافی متعادل شود. توسعه‌دهندگان خود باید از معیارهای سنجش (بنچ مارک‌ها) برای یافتن بهترین مقدار مناسب برای استفاده را انجام دهند. چرا که افزایش حافظه ناشی از استفاده cacheBuffer می‌تواند در بعضی از موارد نادر، باعث کاهش نرخ فریم در هنگام پیمایش (اسکلرول) شود. جلوه‌های بصری فناوری کیوت کوئیک ۲ شامل چند ویژگی است که به توسعه‌دهندگان و طراحان اجازه می‌دهد تا رابط کاربری فوق العاده جذاب ایجاد کنند؛ تغییرات پویا (داینامیکی) و همچنین جلوه‌های بصری می‌توانند برای یک اثر بزرگ در برنامه‌‌ی کاربردی مورد استفاده قرار گیرد. اما هنگام استفاده از بعضی از ویژگی‌های QML، باید نکاتی را در نظر گرفت که می‌توانند دلالت بر کارآیی (پرفرمنس) را داشته باشند. انیمیشن‌ها به طور کلی، متحرک سازی (انیمیشن سازیِ) یک خاصیت (پراپرتی) می‌تواند سبب شود تا اتصالاتی که به یک خاصیت دیگر اشاره می‌کند را مجدداً مورد ارزیابی قرار گیرد. معمولاً این مورد مطلوب است، اما در برخی از موارد ممکن است بهتر باشد قبل از انجام متحرک سازی (انیمیشن سازی) اتصالات را غیر فعال کنید، و سپس آن انیمیشن را تکمیل کنید. از اجرای کدهای جاوا اسکریپت در طول یک انیمیشن اجتناب کنید. برای مثال، اجرای یک عبارت پیچیده جاوا اسکریپت برای هر فریم از انیمیشنِ یک خاصیت مانند x باید اجتناب شود. توسعه‌دهندگان باید در استفاده از انیمیشن‌های اسکریپتی دقت کنند، زیرا آنها در یک نخ اصلی اجرا می‌شوند (در نتیجه در صورتی که اجرا و تکمیل انیمیشن بیش از حد طول بکشد)، ممکن است فریم‌هایی را پرش کرده و موجب کاهش کارآیی اصلی آن‌ شود. ذَرات، پارتیکل (Particles)‌ ماژول Qt Quick Particles اجازه می‌دهد تا ذراتی را برای زیبایی هرچه بهتر رابط کاربری اضافه شود. با این حال، هر پلتفرم دارای قابلیت‌های سخت افزاری مختلفی است و ماژول Particles قادر به محدود کردن پارامترهای سخت افزاری شما نمی‌باشد. بنابراین زمانی که شما ذرات بیشتری برای تولید (رندر) می‌خواهید (هرچه بزرگتر می شوند)، سرعت بیشتری برای پردازش سخت افزار گرافیکی شما نیاز خواهد بود تا بتواند سرعت تولید آن‌ها را با نرخ ۶۰ فریم بر ثانیه اجرا کند. بنابراین ذرات بیشتر خواهان پردازنده‌های مرکزی سریعتری می‌باشند. بنابراین، این بسیار مهم است که تمام ذرات و اثرات آنها را بر روی پلتفرم‌های هدف خود با دقت آزمایش کنید، تا برای کالیبره کردن تعداد و اندازه ذرات قابل تولید با نرخ ۶۰ فریم به نتیجه قابل قبول برسید. لازم به ذکر است که برای جلوگیری از شبیه سازی غیر ضروری یک سیستم ذره را می‌توان غیر فعال کرد (به عنوان مثال عنصری را غر قابل مشاهده کنید) این کار باعث می‌شود تا شبیه سازی‌های غیر ضروری غیر فعال شوند. عملکرد سیستم ذرات با مقایس تعداد ذرات نگه داری می‌شود. پس از نمونه برداری از اثر مورد نظر، با کاهش مقدار ذرات، عملکرد آن را می‌توان بهبود داد. برعکس، اگر عملکرد آن به خوبی و در حد قابل قبول باشد، می‌توان تعداد ذرات را تا زمانی که در آن نقطه قرار می‌گیرد افزایش دهید(این کار باعث بهبود خواهد شد). همانند ShaderEffect، عملکرد سیستم ذرات تا حد زیادی وابسته به سخت افزار گرافیکی است که در حال اجرا می‌باشد. همچنین دقت کنید مقدار دهی loop در مصرف پردازنده بسیار موثر است، برای مثال اگر از SequentialAnimation استفاده می‌کنید، بهتر است مقدار loop را محدود در نظر بگیرید. در صورتی که مقدار آن برابر با Animation.Infinite باشد درصد قابل توجهی از پردازنده را درگیر خود خواهد کرد. کنترل طول عمر عنصر با تقسیم کردن یک برنامه به اجزای ساده، ماژولار، هرکدام از آنها در یک فایل QML منعکس می‌شوند، می‌توانید زمان راه اندازی برنامه را سریعتر و کنترل بیشتری از استفاده از حافظه را به دست آورده و تعداد عناصر فعال اما غیر قابل مشاهده را در برنامه خود کاهش دهید. به طور کلی سعی کنید برای هر ماژول یا بخشی از برنامه یک سند جداگانه از QML را فراهم کنید. مقدار‌دهی اولیه سریع (از روی تنبلی)! موتور QML برخی چیزها را به صورت هوشمندانه (یا زیرکانه) انجام می‌دهد تا اطمینان حاصل شود که بارگذاری و مقدار دهی اولیه اجزاء باعث نمی‌شود تا فریم‌ها از بین بروند. با این حال هیچ راهی برای کاهش زمان راه اندازی بهتر از این وجود ندارد که شما کارهایی را تا زمانی که به آن‌ها نیاز ندارید را انجام ندهید و از آن‌ها اجتناب کنید. این ممکن است با استفاده از اجزای پرکاربردی مانند نوع Loader یا ساخت کامپوننت (جزء)‌های پویا (Dynamic Object Creation) انجام شود. استفاده از بارکننده (لودر - Loader) لودر یک عنصری است که اجازه می‌دهد بارگذاری و تخلیه پویا بر روی اجزاء انجام شود. با استفاده از ویژگی "active" در Loader، مقدار دهی اولیه میتواند تا زمان لازم انجام شود. با استفاده از تابع setSource() مقدار دهی اولیه می‌تواند تامید شود. تنظیم خاصیت asynchronous بر روی مقدار true می‌تواند تاثیر بر روی بهبود عملکرد بر روی کامپوننت (جزء) در زمان نمونه سازی داشته باشد. استفاده از سازنده‌ی پویا توسعه دهندگان می‌توانند از یک تابع Qt.createComponent() برای ایجاد یک مولفه به صورت پویا در زمان اجرا از داخل جاوا اسکریپت استفاده کنند و سپس createObject() را برای نمونه سازی آن، فراخوانی کنند. نابود کردن عناصر استفاده نشده عناصری که مخفی هستند به عنوان فرزندی از عناصر غیر بصری محسوب می‌شوند. برای مثال زمانی که یک زبانه از TabBar یا TabWidget انتخاب شده است و نمایش داده می‌شود به لایلی باید سریع مقدار دهی اولیه شوند و زمانی که از آن به مدت طولانی استفاده نمی‌شود و این خود باعث بارگذاری اضافی است. بنابراین در صورت استفاده از این روش جهت جلوگیری از این هزینه مداوم در زمان اجرا ( که شامل تولید انیمیشن، اتصالات، رندرینگ و غیره...) به صورت خودکار حذف می‌شوند. نکته: یک آیتم بارگذاری شده با یک نوع عنصر Loader ممکن است توسط تنظیمات مجدد خاصیت source یا sourceComponent آزاد شود. در حالی که موارد دیگر ممکن است به صورت صریح با فراخوانی متد destroy() بر روی آنها منتشر شود. در بعضی از موارد ممکن است لازم باشد آیتم فعال را ترک کرده و یا حداقل آن را نامرئی کنید. این کار موجب می‌شود سرعت برنامه‌ی شما بهینه شود. تولید (رندرینگ) Rendering گرافیک صحنه‌ای که برای رندر در کیوت کوئیک ۲ استفاده می‌شود، رابط کاربری بسیار متحرک را به صورت فیزیکی در ۶۰ فریم بر ثانیه ارائه می‌کند. با این حال برخی چیزها به طور چشمگیری در عملکرد رندرینگ کاهش می‌یابند. توسعه دهندگان باید مراقب باشند تا از این مشکلات در هر جا که ممکن است اجتناب کنند که به برخی از آن‌ها اشاره شده است. کلیپ کردن (Clipping) کلیپ کردن به صورت پیشفرض غیرفعال است و توصیه می‌شود تنها زمانی که به آن نیاز دارید فعالش کنید. کلیپ کردن یک اثر بصری دارد، نه بهینه سازی! بنابراین این ویژگی پیچیدگی بیشتری را برای رندرینگ افزایش می‌دهد. اگر کلیپ فعال باشد، اجزای تولید شده خود و دیگر اجزای فرزندش را به محدوده خود متصل خواهد کرد. این باعث می‌شود رندرینگ در آن بخش متوقف شده و آن بخش از اشیاء مرتبط و منظم دیده شوند. نکته مهم این است که کلیپ کردن در داخل delegate بسیار نامناسب است و باید از این کار اجتناب شود. چرا که موجب کاهش کارآیی برنامه خواهد شد. نقاشی بیش از اندازه و عناصر نامرئی اگر شما عناصری دارید که توسط عناصر دیگری (مات) یا پوشانیده شده اند، بهتر است از خاصیت visible استفاده کرده و آن را به مقدار false تنظیم کنید. برای مثال در زبانه‌هایی که به صورت پیشفرض یکی از آن‌ها فعال هستند و زبانه‌های دیگر تا زمان انتخاب مخفی! در این صورت بهتر است آیتم‌های آن‌ها به از طرف والد آن‌ها مخفی شوند تا در زمان اجرا بابت نمایش مواردی که مخفی هستند هزینه‌ای نشود. شفاف در مقابل مات محتوای مبهم (مات) عموماً بسیار سریعتر از محتوای شفاف هستند. دلیل این امر این است که محتوای شفاف نیاز به ترکیب (مخلوط) کردن دارند و سیستم رندر کننده به مراتب می‌تواند نوع مات را بهتر بهینه سازی نماید. یک تصویر با یک پیکسل شفاف به طور کامل به عنوان یک نتیجه کاملاً شفاف تلقی می‌شود، حتی اگر عمدتاً مات باشد. همین امر برای نوع BorderImage با لبه های شفاف درست است. سایه‌ها نوع ShaderEffect باعث می‌شود که کد درون خطی GLSL را به صورت یکپارچه در یک برنامه Qt Quick با سربار بسیار کم قرار دهید. با این حال مهم است که بدانید، که قِطعه برنامه نیاز به اجرا برای هر یک از پیکسل‌ها در شکل تولید شده را دارد. هنگام استقرار بر روی یک سخت افزار با توان پایین، شیدر‌ها مقدار زیادی از پیکسل‌ها را پوشش می‌دهند برای جلوگیری از عملکرد ضعیف، باید یک قطعه شیدر را برای چند دستورالعمل جهت جلوگیری از پرفرمنس ضعیف نگهداری کنید. شیدرهای نوشته شده در GLSL اجازه می‌دهد تا تبدیلات و جلوه‌های پیچیده‌تری را تولید کنید. با این حال باید با دقت بسیاری از آنها استفاده کرد. استفاده از ShaderEffectSource باعث از پیش رندر شدن صحنه به FBO قبل از کشیده شدن آن می‌شود . این سربار اضافی می‌تواند بسیار پر‌هزینه باشد. تخصیص و جمع آوری حافظه مقدار حافظه‌ای که توسط یک برنامه اختصاص داده می‌شود و اینکه آن حافظه چگونه اختصاص داده می‌شود شامل ملاحظات بسیار مهمی هستند. صرف نظر از نگرانی‌های مربوط به خارج از حافظه در دستگاه‌های محدود به حافظه، تخصیص حافظه در پُشته به عنوان یک عمل محاسباتی نسبتاً گران می‌باشد. در این میان استراتژی‌های اختصاصی تخصیص حافظه می‌تواند باعث افزایش تقسیم داده‌ها در صفحات شود. خوشبختانه، جاوا اسکریپت از روش مدیریت حافظه خودکار در پُشته (Heap) در قالب GC پشتیبانی می‌کند که دارای برخی از مزیت‌ها است. اما با این حال دلالت بر مهم بودن برخی موارد دارد. یک برنامه نوشته شده در QML حافظه را از هر دو پُشته از سمت مدیریت حافظه تحت ++C و JavaScript مدیریت می‌کند. توسعه دهنده نرم‌افزار باید در رابطه با هر یک از آنها به منظور به حداکثر رساند پرفرمنس آگاه باشد. نکاتی برای توسعه‌دهندگان برنامه QML نکات و پیشنهادات موجود در این بخش تنها در قالب دستورالعمل هستند و ممکن است در همه شرایط قابل اجرا نباشند. با استفاده از معیارهای تجربی و بررسی بنچ مارک‌ها و همچنین آنالیز و همچنین با استفاده از ومعیار‌های تجربی برنامه خودتان بهترین تصمیم ممکن را بگیرید. اگر برنامه شما شامل نمایه (View) های متعدد (به عنوان مثال زبانه‌های چندگانه) می‌باشد اما در هر زمان تنها یکی از آنها مورد نیاز است در این صورت برای کم کردن حافظه مصرفی می‌توانید از روش مقدار‌دهی سریع (از روی تنبلی) استفاده کنید ? که در بالا به آن اشاره شده است. نابود سازی اشیاء ای که مورد استفاده قرار نمی‌گیرند اگر شما از روش ساده بارگیری کامپوننت‌ها و یا ساخت اشیاء به صورت پویا در طول یک عبارت جاوا اسکریپتی استفاده می‌کنید، بهتر است آنها را به صورت دستی توسط متد destroy() نابود کنید. این بهتر از آن است که منتظر باشید تا به صورت خودکار سیستم GC آن‌ها را جمع آوری و نابود کند. در زمانی که نیاز نیست به صورت دستی عمل GC (بازیافت حافظه) را انجام ندهید در اکثر موارد، دستیابی به مجموعه زباله‌ها به منظور دستیبای به آن نیست. زیرا این کار به مدت زیادی نخ‌های سمت رابط کاربری را مسدود می‌کند. این کار باعث می‌شود فریم‌ها و پرش‌هایی در انیمیشن‌های متحرک به وجود آید که باید از اینگونه هزینه ها اجتناب شود. به طور کلی باید توجه داشته باشید که به صورت مستقیم و دستی همه جا نباید اقدام به نابود سازی حافظه اخصاص یافته شده کنید. اجتناب از اتصال پیچیده گذشته از اینکه اتصالات پیچیده موجب کاهش پرفرمنس (کارایی) می‌شود استفاده از آن‌ها (برای مثال، زمانی که نیاز است ارزیابی جداگانه تحت کد‌های جاوا اسکریپت شود) به صورت پیچیده‌ای حافظه بیشتری را در هر دو پُشته ++C و JavaScript برای بهینه سازی محاسبات اختصاص می‌دهند. بنابراین نیاز نیست همیشه از اتصالات پیچیده و ارزیابی آن‌ها تحت JS استفاده کرد. اجتناب از تعریف چند نوع ضمنی یکسان اگر یک عنصر QML یک خصوصیت سفارشی تعریف شده در QML داشته باشد، آن نوع خاصی و ضمنی خود را میگیرد. این مورد در بخش بعدی بیشتر توضیح داده شده است. اگر چندین نوع ضمنی یکسان در یک جزء درون خطی تعریف شده باشند، موجب هدر‌رفتن بخشی از حافظه خواهند‌ شد. در این وضعیت معمولاً بهتر است که جزء را به‌صورت صریح تعریف کنیم که بعدا می‌تواند دوباره استفاده شود. تعریف یک اخاصیت سفارشی اغلب می تواند در بهینه سازی عملکرد سودمندی داشته باشد (برای مثال، برای کاهش تعداد پیوند‌هایی که مورد نیاز است یا دوباره ارزیابی می‌شوند)، یا می‌تواند ماژولار بودن و قابلیت نگهداری یک جزء را بهبود بخشد. در این موارد، استفاده از خواص سفارشی پیشنهاد می‌شود. با این حال، نوع جدید باید، اگر از بیش از یک بار استفاده می شود، به جزء خود (فایل .qml) به منظور حفظ حافظه، تقسیم شود. استفاده مجدد از اجزای موجود اگر شما در حال تعریف یک جزء جدید هستید، لازم است دوباره بررسی کنید که چنین جزئی در پلتفرم شما وجود دارد یا خیر. در غیر این صورت شما باید موتور QML را مجبور به ساخت و ذخیره سازی نوع داده برای یک نوع که نیاز است کنید که به عنوان یک نوع تکراری که از اجزای موجود می باشد بارگذاری می‌شود. به جای کتابخانه‌های اسکریپتی پراگما از انواع تک تک (singleton) استفاده کنید. اگر از یک اسکریپت کتابخانه pragma برلی ذخیره داده های نمونه استفاده می‌کنید، به جای استفاده از یک نوع تک تکی از QObject استفاده کنید. نتیجه آن در کارآیی بهتر تاثیر گذار خواهد بود و باعث می‌شود حافظه کوچکتری در پُشته‌ی جاوا اسکریپت مورد استفاده قرار گیرد. اختصاص دادن حافظه در یک برنامه QML استفاده از حافظه یک برنامه مبتنی بر QML ممکن است به دو بخش تقسیم شود: استفاده از پُشته سمت ++C و پشته‌ی سمت JavaScript می‌باشد. برخی از حافظه اختصاص داده شده در هر یک از اجزاء غیرقابل اجتناب خواهند بود. به عنوان آن که توسط موتور QML یا موتور جاوا اسکریپت اختصاص داده می‌شود. در حالی که بقیه آن وابسته به تصمیمات گرفته شده توسط توسعه دهنده اپلیکیشن می‌باشد. پشته در ++C شامل موارد زیر خواهد بود: سربار ثابت و اجتناب ناپذیر از موتور QML (پیاده سازی ساختارهای داده، اطلاعات زمینه و غیره). اطلاعات هر جزء کامپایل شده و نوع داده‌ها، شامل هر یک از انواع و فرا داده هایی می‌باشد، که توسط موتور QML بسته به نوع ماژول‌ها و کامپوننت‌هایی است که توسط اپلیکیشن بارگیری می‌شوند. هر شیء‌ای که در داده‌های سی++ (شامل مقادیرِ خاصیت) به همراه هر یک از عناصر متا آبجکت هستند که وابسته به کامپوننت‌ (اجزای) معرفی شده توسط اپلیکیشن می‌باشند. هر داده ای که به طور خاص توسط QML اختصاص داده می‌شود که شامل کتابخانه‌های وارد شده نیز هستند. پشته در JavaScript شامل موارد زیر خواهد بود: سربار ثابت و اجتناب ناپذیر از موتور QML (خودش انواع از قبل ساخته شده‌ی جاوا اسکریپتی را دارد). سر بار ثابت شده و اجتناب ناپذیر از ادغام جاوا اسکریپت (توابع سازنده برای انواع داده های بارگذاری شده، قالب‌های توابع، و غیره). اطلاعات مربوط به هر نوع و و دیگر انواع داخلی توسط موتور جاوا اسکریپت که در زمان اجرا تولید می‌شود. هر شیء ای که به عنوان داده جاوا اسکریپتی (خاصیت‌های نوع var ، توابع جاوا اسکریپتی و هندلرهای سیگنال و عبارات بهینه نشده). متغیرهای اختصاص داده شده در زمان ارزیابی عبارت‌ علاوه بر این، یک پشته جاوا اسکریپتی اختصاص یافته شده برای استفاده از نَخ اصلی و دیگری در پُشته جاوا اسکریپت برای استفاده در WorkerScript اختصاص یافته می‌شود. اگر یک اپلیکیشن از یک عنصر WorkerScript استفاده نکند متحمل به سربار گیری نخواهد شد. اندازه پشته در جاوا اسکریپت می‌تواند به چندین مگابایت برسد و بنابراین برنامه‌های نوشته شده برای دستگاه هایی که دارای محدودی حافظه هستند، ممکن است بهترین با اجتناب از عنصر WorkerScript باشد، با وجود سودمندی آن در مدل‌ها لیستی، که به صورت یکپارچه ذخیره می‌شوند باشد. توجه داشته باشید که هر دو موتور QML و JavaScript به طور خوکار مخازن خود را از نوع داده های ملاحظه شده تولید خواهند کرد. هر کامپوننت (جزء) توسط یک برنامه بارگذاری می‌شود که یک نوع متمایز (صریح) بوده و هر عنصر (به جای کامپوننت) ویژگی‌های سفارشی خود را در QML که به صورت ضمنی است تعریف می‌کند. مثال زیر را در نظر بگیرید: import QtQuick 2.3 Item { id: root Rectangle { id: r0 color: "red" } Rectangle { id: r1 color: "blue" width: 50 } Rectangle { id: r2 property int customProperty: 5 } Rectangle { id: r3 property string customProperty: "hello" } Rectangle { id: r4 property string customProperty: "hello" } } نمونه‌های قبلی مستطیل‌های r0 و r1 دارای ویژگی‌های اختصاصی (سفارشی) نبودند. بنابراین موتورهای جاوا اسکریپت و QML هر دو آنها را از همان نوع در نظر می‌گیرند. به عبارت دیگر هر دوی آن‌ها به عنوان یک نوع صریح از Rectangle (مستطیل) در نظر گرفته می‌شوند. مستطیل‌های r2، r3 و r4 هر یک از آنها با داشتن ویژگی‌های اختصاصی خود هر کدام با انواع مختلف ضِمنی در نظر گرفته شده‌اند. حتی اگر اطلاعات مربوط به ویژگی‌های یکسانی داشته باشند. ملاحظات اختصاصی در عُمق حافظه هرگاه تصمیماتی در خصوص تخصیص دادن حافظه یا کارآیی آن به وجود آید، این مهم است که تاثیرات شدید در عملکرد پردازنده مرکزی و مخازن مربوط به آن، صفحه بندی‌‌های سیستم‌عامل و بازیافت حافظه (GC) در جاوا اسکریپت را در نظر داشته باشید. بنابراین راه حل‌های بالقوه باید با دقت بررسی شوند تا مطمئن شوید که بهترین مورد را انتخاب کرده‌اید. هیچ مجموعه‌ای از دستور العمل‌های کلی نمی‌تواند یک درک جامع ای از اصول اساسی علوم رایانه را با یک دانش علمی از جزئیات پیاده سازی کرده و پلتفرمی که یک توسعه‌دهنده‌ی نرم‌افزار در حال توسعه آن است را جایگزین کند. تقسیم بندی تقسیم بندی به عنوان یک مسأله برای توسعه در سی‌پلاس‌پلاس است. اگر توسعه‌دهنده برنامه هیچ نوع یا پلاگینی از سی‌پلاس‌پلاس را تعریف نکند، ممکن است آنها را در این بخش با خیال راحت نادیده بگیرند. با گذشت زمان، یک برنامه بخش بزرگی از حافظه را برای خود اختصاص داده و داده‌ها را به آن حافظه ارسال می‌کند و بعضی اوقات برخی از قسمت های آن را پس از اتمام استفاده آن‌ها را آزاد می‌کند. این می‌تواند منجر به «حافظه آزاد» شده ای در تکه‌های غیر مجاور شود که نمی‌تواند برای برنامه های کاربردی دیگر توسط سیستم‌عامل مورد استفاده قرار گیرد. همچنین تاثیر شدیدی بر روی ذخیره سازی پنهان و دسترسی به ویژگی‌های یک اپلیکیشن می‌گذارد. زیرا داده‌هایی که زنده هستند (در حال استفاده) هستند، ممکن است در بسیاری از صفحات مختلف حافظه فیزیکی گسترش یابند. این به نوبه خود می‌تواند سیستم‌عامل را مجبور به (swap) یا مبادله کند که می‌تواند سبب شود تا عمل I/O ایجاد شود که به شدت عمل آهسته‌ای بشمار می‌آید. تقسیم بندی می‌تواند توسط دیگر موارد تخصیص دهنده حافظه، با کاهش میزان حافظه‌ای که در هر زمان با دقتِ مدیریتِ زمان زندگیِ اشیاء مورد بررسی قرار گیرد. با تمیز کردن و باز سازی دوره‌ای از حافظه‌ها یا با استفاده از زمان اجرا بر روی حافظه از تجزیه آن می‌توان جلوگیری کرد که توسط سیستم‌عامل بازیافت حافظه خودکار (GC) مانند جاوا اسکریپت ممکن است. بازیافت حافظه جاوا اسکریپت سیستم بازیافت حافظه به صورت خودکار را فراهم می‌کند. حافظه ای که در دسته جاوا اسکریپتی قرار دارد (بر خلاف پُشته در سی‌پلاس‌پلاس) متعلق به موتور خود جاوا اسکریپت است. این موتور به طور دوره‌ای تمامی داده‌های نا مشخص (غیر قابل استفاده) را در پُشته‌ی جاوا اسکریپت جمع آوری می‌کند. پیامد‌های بازیافت حافظه بازیافت حافظه، مزایا و معایبی دارد. این به این معنی است که مدیریت عمر مفید شیء به صورت دستی اهمیت کمتری دارد. با این حال، این بدان معنی است که یک عمل بالقوه طولانی مدت ممکن است توسط موتور جاوا اسکریپت در زمانیکه که خارج از کنترل توسعه‌دهنده نرم افزار است آغاز شود. استفاده از پُشته در جاوا اسکریپت با دقت بسیاری توسط توسعه‌دهنده برنامه مورد توجه قرار می گیرد. لذا تکرار و مدت زمان بازیابی حافظه ممکن است تاثیر منفی بر تجربه نرمافزار داشته باشد. فراخوانی بازیابی حافظه یک برنامه نوشته شده در QML (به احتمال زیاد) در یک مرحله‌ای به بازیافت حافظه (GC) نیاز دارد. در صورتی که حجم حافظه آزاد شده کم باشد سیستم بازیافت خودکار حافظه توسط موتور جاوا اسکریپت انجام می‌شود. بعضی اوقات این کار در صورتی که توسعه‌دهنده‌ی نرم‌افزار تصمیمی در مورد اینکه چه زمانی بازیافت حافظه را انجام دهند نگرفته باشد می‌تواند مناسب باشد. (اگر چه که معمولاً این مورد مطرح نمی‌شود). توسعه‌دهنده نرم‌افزار احتمالاً می‌داند که برنامه چه زمانی را به مدت قابل ملاحظه‌ای بیکار است. اگر یک برنامه QML از حافظه بسیار زیادی از پُشته جاوا اسکریپت را مصرف کند، باعث می‌شود چرخه و تکرار‌های مکرری در بازیافت حافظه صورت گیرد که در وظایف حساس بر روی کارآیی تاثیر خواهد گذاشت. مانند (لیست پیمایش، انیمیشن‌ها، و غیره). توسعه‌دهنده نرم‌افزار ممکن است به‌طور دستی به بازیافت حافظه در طول دوره صفر فعالیت کمک کند. دوره های بیکاری برای انجام بازیافت حافظه ایده آل هستند چرا‌‌که کاربر هیچ‌گونه تضعیفی را در تجربه کاربری خود (فریم‌های پرش شده، انیمیشن‌های پر‌تحرک و نا‌منظم و غیره) حس نخواهد‌کرد؛ که این تضعیف تجربه، در‌نتیجه فراخوانی بازیافت حافظه به هنگام فعالیت برنامه رخ می‌هد. توسعه‌دهنده نرم‌افزار احتمالاً می‌داند که برنامه چه زمانی را به مدت قابل ملاحظه‌ای برای بیکاری بکار می‌گیرد. اگر یک برنامه QML از حافظه بسیار زیادی از پُشته جاوا اسکریپت را مصرف کند، باعث می‌شود چرخه و تکرار‌های مکرری در بازیافت حافظه صورت گیرد که در وظایف حساس بر روی کارآیی تاثیر خواهد گذاشت. مانند (لیست پیمایش، انیمیشن‌ها، و غیره). از طرفی ممکن است توسعه‌دهنده با دستکاری بازیافت حافظه موجب تخریب آن شوند. بازیافت حافظه ممکن است به صورت دستی با فراخوانی gc() در جاوا اسکریپت اعمال شود. این باعث می‌شود یک چرخه بازیافت جامع از حافظه صورت بگیرد که ممکن است مدت زمانی بین چند صد تا بیش از هزار میلی ثانیه برای تکمیل آن سپری شود. بنابراین در صورت امکان باید از آن اجتناب شود. حافظه در مقابل کارآیی در بعضی موارد ممکن است که زمان پردازش حافظه برای سبک سنگین کردن افزایش مصرف حافظه کاهش یابد. برای مثال، ذخیره سازی نتیجه یک جستجوی نماد که در یک حلقه تنگ به یک متغیر موقت در یک عبارت جاوا اسکریپتی استفاده می‌شود که در بهبود ارزیابی این عبارت تاثیر قابل توجهی خواهد داشت. اما این شامل تخصیص یک متغیر موقت می‌باشد. در بعضی از موارد، این سبک سنگین کردن ممکن است معقول باشد (مانند موارد فوق، ک تقریباً همیشه منطقی هستند)، اما در موارد دیگر ممکن است بهتر باشد تا اجازه دهیم تا پردازش طول بکشد تا از افزایش فشار بر روی حافظه سیستم جلوگیری شود. در بعضی از موارد، تاثیر افزایش فشار بر روی حافظه می‌تواند شدید باشد. در برخی موارد، استفاده دوباره از حافظه ممکن است برای به دست آوردن عملکرد پیشنهادی منجر به افزایش ترافیک صفحات یا ترافیک بر روی حافظه نهان شود که باعث کاهش عملکرد شدید آن خواهد شد. این همیشه برای ارزیابی لازم است، تاثیر تعاملات با دقت به منظور تعیین اینکه بهترین راه حل در یک وضعیت خاص است مهم هستند.
  25. کامبیز اسدزاده

    شما می‌تونید اون QtObject رو حذف و مستقیم پراپرتی‌های عمومی تعریف کنید، باز هیچ ایرادی نداره اما در اصل QtObject به عنوان یک عنصر غیر بصری می‌تونه نام اشیاء رو بگیره و اون‌ها رو در جایی که می‌خواین در اختیارتون قرار بده. مثلاً وقتی می‌خواین یک کامپوننت یا ماژول یا هر نوع افزونه‌ای به بخشی از برنامه‌ی خودتون در QML اضافه کنید بهتره از QtObject هم استفاده کنید تا اشیاء مربوط به اون واحد رو به صورت اختصاصی تعریف و سفارشی سازی کنید که در توسعه و حتی برقراری ارتباط با سی‌++ بسیار مفید خواهد بود.
×
×
  • جدید...