কেন ফারশিয়ার ২.x স্ট্যাকগুলিতে সদস্য হিসাবে অস্থায়ী পদার্থ সংরক্ষণ করে? (.Net)


10

আপডেট: এই প্রশ্নটি ফার্সির ২.x বোঝায়। নতুন 3.x এটি করতে পারে বলে মনে হচ্ছে না।

আমি এই মুহুর্তে ফার্সিয়ার ফিজিক্স ইঞ্জিনটি বেশ বিস্তৃতভাবে ব্যবহার করছি, এবং আমি লক্ষ্য করেছি যে এটি ক্লাসের সদস্য হিসাবে অস্থায়ী মান ধরণের অনেকগুলি সঞ্চয় করবে বলে মনে হচ্ছে , এবং স্ট্যাকের উপর যেমন কেউ আশা করতে পারে তেমন নয়।

এখানে Bodyক্লাসের একটি উদাহরণ রয়েছে :

private Vector2 _worldPositionTemp = Vector2.Zero;

private Matrix _bodyMatrixTemp = Matrix.Identity;
private Matrix _rotationMatrixTemp = Matrix.Identity;
private Matrix _translationMatrixTemp = Matrix.Identity;

public void GetBodyMatrix(out Matrix bodyMatrix)
{
    Matrix.CreateTranslation(position.X, position.Y, 0, out _translationMatrixTemp);
    Matrix.CreateRotationZ(rotation, out _rotationMatrixTemp);
    Matrix.Multiply(ref _rotationMatrixTemp, ref _translationMatrixTemp, out bodyMatrix);
}

public Vector2 GetWorldPosition(Vector2 localPosition)
{
    GetBodyMatrix(out _bodyMatrixTemp);
    Vector2.Transform(ref localPosition, ref _bodyMatrixTemp, out _worldPositionTemp);
    return _worldPositionTemp;
}

দেখে মনে হচ্ছে এটি বাই-হ্যান্ড পারফরম্যান্স অপটিমাইজেশন। তবে আমি দেখতে পাচ্ছি না এটি কীভাবে সম্ভবত পারফরম্যান্সে সহায়তা করতে পারে? (আমি যদি কিছু মনে করি তবে এটি আরও বড় আকারের জিনিসগুলি তৈরি করে ক্ষতিগ্রস্ত হবে)।

উত্তর:


6

যদিও। নেট মান ধরণের স্ট্যাকের মধ্যে সংরক্ষণ করা হয়, যার ফলে একটি সর্বনিম্ন বরাদ্দ ব্যয় হয়, তবে এটি আরম্ভের ব্যয়টিকে সরিয়ে দেয় না।

এক্ষেত্রে আমাদের এক বা দুটি অস্থায়ী ম্যাট্রিক্স ব্যবহার করে একটি ফাংশনের একটি সেট রয়েছে, যার ফলস্বরূপ কল প্রতি 16-32 ফ্লোটের আরম্ভ হবে। যদিও এটি তুচ্ছ মনে হতে পারে, তবে যদি পদ্ধতিগুলি প্রায়শই পর্যাপ্ত পরিমাণে ব্যবহৃত হয় (বলুন, প্রতি ফ্রেমটিতে কয়েক হাজার এবং কয়েক হাজার বার), মোট ওভারহেড একটি অর্থবহ প্রভাব ফেলতে পারে। এই জাতীয় কৌশলগুলি যদি এই জাতীয় সমস্ত পদ্ধতিতে পদ্ধতিতে ব্যবহার করা হয় তবে ওভারহেড নির্মূল করা যথেষ্ট হতে পারে।

যখন এই জাতীয় প্রযুক্তি ব্যবহারের ফলে প্রতি-বস্তুর স্তরে থ্রেড সুরক্ষা প্রদানের ক্ষমতা সরিয়ে ফেলা হয়, তবে সাধারণভাবে এ জাতীয় দানাদার স্তরে সেই গ্যারান্টি সরবরাহ করা বুদ্ধিমানের কাজ নয়।


আপনি কি এ ব্যাপারে নিশ্চিত? আমার একটি ধারণা ছিল এটি কনস্ট্রাক্টরদের কল এড়াতে হতে পারে। তবে মান ধরণের জন্য আপনাকে কোনও কনস্ট্রাক্টর কল করতে হবে না - ডিফল্ট প্যারামিটারলেস কনস্ট্রাক্টর সহ - যদি আপনি সমস্ত সদস্য সেট করতে চলেছেন (বা এটি outপ্যারামিটার হিসাবে পাস করবেন )) আমি মোটামুটি নিশ্চিত যে এই নিয়মের পুরো পয়েন্টটি তাই সংকলক সেই মেমরিটি শূন্য করতে এড়াতে পারে - তাই না? ( স্ট্যাক পয়েন্টারটি সরানো কি আসলেই ধীর?)
অ্যান্ড্রু রাসেল

অবাক, না? দুর্ভাগ্যক্রমে, আপনি উত্পন্ন আইএল পরিদর্শন করেন, অস্থায়ী ম্যাট্রিকগুলি আরম্ভ করা হবে। কয়েকটি দ্রুত পরীক্ষাগুলি দেখায় সদস্য-টেম্পের সংস্করণটি 10-15%% দ্রুত।
জেসন কোজাক

1
আমি হতবাক । "এক্সএনএ ফ্রেমওয়ার্ক পারফরম্যান্স বোঝার" (জিডিসি ২০০৮) শন হারগ্রায়েভস স্ট্রাক্ট সম্পর্কে বলেছেন: "[জেআইটি] সাধারণত জানবে: 'পরের লাইনে তিনি তত্ক্ষণাত তিনটি ক্ষেত্র [ভেক্টর3 এর] সেট করেছেন, সুতরাং আমার এমনকি দরকারও নেই এটি শূন্যে আরম্ভ করতে "" । আমার তথ্যটি কোথা থেকে আসছে। তবে এখন আবার শুনলে তিনি কেবল "সাধারণত" বলে থাকেন says উপস্থাপনের তাত্ক্ষণিক পরবর্তী বিন্দুটি হ'ল জেআইটি সংযুক্ত ডিবাগারটির সাথে আলাদাভাবে আচরণ করে, কার্য সম্পাদনকে প্রভাবিত করে (আপনি কীভাবে পরীক্ষা করেছিলেন?)। এছাড়াও: তিনি এখানে জেআইটি সম্পর্কে কথা বলছেন, তাই সম্ভবত আইএল "সুন্দর" থাকে (যাচাইযোগ্যতা?)।
অ্যান্ড্রু রাসেল 15

আইএল রিফ্লেক্টরের মাধ্যমে পরিদর্শন করা হয়েছিল, এবং পরীক্ষাগুলি রিলিজে নির্মিত আইডিইর বাইরে চালানো হয়েছিল (উইন্ডোজে, এর বিরুদ্ধে পরীক্ষা করার জন্য আমার আর সিসির সদস্যপদ নেই)
জেসন কোজাক

1
এর উপর ভিত্তি করে - আমি ভাবছি যে এই সদস্য-টেম্পোরারিগুলি তৈরি করা static(এবং / অথবা আরও আগ্রাসীভাবে তাদের পুনরায় ব্যবহার করা) আরও ভাল (এবং কতটা ভাল হবে )। যেমনটি, যেমন উদাহরণস্বরূপ, Bodyফারসীর ক্লাসে প্রায় "73" সদস্যের মূল্যবান 73 টি ফ্লোট রয়েছে।
অ্যান্ড্রু রাসেল

-1

ভাল প্রশ্ন. আমি বেশ তীক্ষ্ণ সি # /। নেট লোক এবং কিছুটা পারফরম্যান্স বাদাম এবং এটি আমার কাছে বরং একটি বিজোড় ডিজাইনের সিদ্ধান্ত বলে মনে হচ্ছে। আমার কাছে যে প্রথম জিনিসটি ছাপিয়ে যায় তা হ'ল এই কোডটি কোনওভাবেই থ্রেড নিরাপদ নয়। আমি জানি না এটি কোনও পদার্থবিজ্ঞানের সিস্টেমে কোনও সমস্যা কিনা, তবে কোনও পদ্ধতির সুযোগের বাইরে অস্থায়ী ডেটা সংরক্ষণ করা প্রায়শই বিপর্যয়ের একটি রেসিপি।

সত্যই, আমি যদি তৃতীয় পক্ষের কাঠামোর মধ্যে নিয়মিত এই জাতীয় কোডের মুখোমুখি হই, তবে আমি সম্ভবত অন্য একটি কাঠামো সন্ধান করার চেষ্টা করব।


3
সত্যই প্রশ্নের উত্তর দেয় না।
ব্রায়ান অরটিজ

হ্যাঁ, আমি সর্বোত্তম চেষ্টা করতে পারি তা নিশ্চিত হওয়া যে সে পাগল নয়, এবং এটিকে কোড করে দেওয়া কোনও আসল উপকার বলে মনে হচ্ছে না। সত্যিকারের উদ্দেশ্যটি কেবলমাত্র সেই ব্যক্তিকে জিজ্ঞাসা করা যিনি কোড লিখেছেন :)।
মাইক স্ট্রোবেল

ধন্যবাদ, মাইক আমি সন্দেহ করতে শুরু করেছি যে আসল বিকাশকারী পাগল, আমি নয়। তবে এটি সর্বদা পরীক্ষা করতে সহায়তা করে;)
অ্যান্ড্রু রাসেল

থ্রেড সুরক্ষা প্রদানের জন্য কখনও কখনও ব্যয়বহুল গ্যারান্টি হতে পারে, বিশেষত যখন প্ল্যাটফর্মের জন্য কোনও এফপি গণনা ভারী গ্রন্থাগার লেখা থাকে যা সিমডের নির্দেশাবলী ব্যবহার করে না।
জেসন কোজাক

-1

360 এর জিসি মূলত কেবল জিন 2 টি সংগ্রহ করে, যা ব্যয়বহুল, তাই অস্থায়ী ভেরিয়েবলগুলি যা প্রতিটি ফ্রেম তৈরি করে এবং মুছে ফেলা হয় (টেম্পোর অবজেক্টের মতো) পুরো সংগ্রহকে চালিত করে, যা কার্য সম্পাদনকে দ্রুত দ্রুত হারাবে।

আমার সন্দেহ হয় যে তারা এই জিনিসটি পুনরায় ব্যবহার করতে এইভাবে করেছে এবং এটি সংগ্রহ করা হয়নি।


1
এটি আমার কাছেও ঘটেছিল, তবে অস্থায়ী সদস্যরা মান ধরণের বলে মনে হয়, তাই তাদের কোনওভাবেই পরিচালিত স্তূপে বরাদ্দ দেওয়া হবে না।
মাইক স্ট্রোবেল

2
ঠিক আছে, তবে কেবল তারা ক্লাস সদস্য হলে। যদি তারা স্থানীয় হয় (পদ্ধতি-বিস্তৃত), তাদের স্ট্যাকের জন্য বরাদ্দ দেওয়া হবে। তারা কেন কেবল সেই পথে যায়নি প্রশ্নটি হল।
মাইক স্ট্রোবেল

1
@Blair - দুটিই MSDN (মতে msdn.microsoft.com/en-us/library/bb203912.aspx ) 360 .NET কম্প্যাক্ট ফ্রেমওয়ার্ক ব্যবহার করে। দেখে মনে হচ্ছে জিসির পার্থক্য তার সাথে সম্পর্কিত, তাই আমি এই বিষয়ে আরও গবেষণার জন্য তা অনুসরণ করতাম।
লোগান কিনকেড

1
@ ব্লায়ার: @ লোগান কিনকেড সঠিক। সিএফ-র আবর্জনা সংগ্রাহক নিয়মিত কাঠামোর চেয়ে আলাদা আচরণ করে। এক্সএনএ গেম স্টুডিও 3.0.০ আনলিশডে এই বিষয়ে একটি ভাল কথা রয়েছে - তবে বইটি শীঘ্রই 4.0 এর প্রকাশের সাথে পুরানো হবে।
স্টিভেন ইভার্স

1
@ ব্লেয়ার: 360 এর সীমাবদ্ধ মেমরির পরিবেশের কারণে (এবং বেশিরভাগ ডিভাইস সিএফ-এর মাধ্যমে লক্ষ্যবস্তু করা হয়েছে), একটি মার্ক অ্যান্ড সুইপ জিসি ব্যবহৃত হয়। ফলস্বরূপ, প্রচুর পরিমাণে ছোট বরাদ্দ একটি সংগ্রহকে ট্রিগার করবে এবং সংগ্রহের সময় # টি রেফারেন্সের সাথে তুলনামূলক। এখানে প্রচুর বিবরণ: download.microsoft.com/.../
গতিশীলতা/…
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.