ভেক্টর 3 কে ভেক্টর 2 তে রূপান্তর করার সবচেয়ে কার্যকর উপায়


11

কোনও ভেক্টর 3 কে ভেক্টর 2 তে রূপান্তর করার সবচেয়ে দক্ষ এবং দ্রুততম উপায় কী?

ঢালাই:

Vector2 vector2 = (Vector2)vector3;

একটি নতুন ভেক্টর 2 শুরু করা হচ্ছে:

Vector2 vector2 = new Vector2(vector3.x, vector3.y);

বা অন্য কোন পদ্ধতি আছে যা আমি জানি না?


11
এই ধরণের স্ট্রাক অপারেশনগুলি কখনই আপনার গেমের পারফরম্যান্স নির্ধারণকারী বাধা হয়ে দাঁড়াবে না, সুতরাং এই জাতীয় মাইক্রো-অপ্টিমাইজেশনে ডুবে যাওয়ার পরিবর্তে, আপনি যে প্রসঙ্গে ব্যবহার করছেন সেটি বোঝার জন্য যেটি পরিষ্কার হয় তা ব্যবহার করার পরামর্শ দেব I'd এটা। ;)
ডিএমগ্রিগরি

3
@ ডিএমজি গ্রেগরি: অবশ্যই, ওপি ইতিমধ্যে একটি পারফরম্যান্স বিশ্লেষণ করেছে এবং সম্ভবত বক্সিংয়ের কারণে, এটি কার্যনির্বাহী সমস্যা তৈরির জন্য নেস্টেড লুপে করেছে। যেমন নেস্টেড লুপ হতে পারে, উদাহরণস্বরূপ, এ-স্টার বা ডিজকস্ট্রার বাস্তবায়ন হতে পারে।
পিটার জেরকেন্স 15

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

উত্তর:


12
Vector3 v3 = Vector3.one;
Vector2 v2 = v3;

ভেক্টর 3 গুলি সুস্পষ্টভাবে ভেক্টর 2 এ রূপান্তরিত হতে পারে (z বাতিল করা হয়)।

http://docs.unity3d.com/ScriptReference/Vector2-operator_Vector3.html

আপনাকে যদি অনেকগুলি রূপান্তর করতে হয় তবে আপনার ভেক্টরগুলি ব্যবহার করার উপায়টি আপনাকে পরিবর্তন করতে হতে পারে। কোনটি আপনার পক্ষে কাজ করে তা দেখার জন্য দুটি পরীক্ষা করুন এবং তাদের সময় দিন।

পরীক্ষার সাথে আপডেট করুন: যেহেতু আপনি জিজ্ঞাসা করেছেন যে কোনটি সবচেয়ে দ্রুততম আমি ityক্যতে প্রত্যেকটির 10000000 রূপান্তর চলমান একটি পরীক্ষা তৈরি করেছি। এটি প্রদর্শিত হয় যে প্রারম্ভিক সংস্করণ এই ক্ষেত্রে দ্রুততম। কিন্তু, আপনার নিজের প্রসঙ্গে যথাযথভাবে এমনটি ব্যবহার করা উচিত, সুতরাং আমি আপনাকে আপনার গেমটিতে নিজের পরীক্ষা চালানোর পরামর্শ দিই।

টেস্টকন্ট্র্টবাইওরেশন 10000000 উদাহরণ: 0.2714049 এস

টেস্টকনভার্টবাইকাস্টিং 10000000 উদাহরণ: 0.286027 সেকেন্ড

টেস্টকনভার্টবিআইনিটাইজিং 10000000 উদাহরণ: 0.1458781 এস

using UnityEngine;

public class TestVector3Conversion : MonoBehaviour
{

    readonly int iterations = 10000000;
    Vector3 testVector = new Vector3(3f, 14f, 42f);

    void Start()
    {
        Debug.Log(string.Format("TestConvertByOperation {0} instances: {1}s", iterations, TestConvertByOperation()));
        Debug.Log(string.Format("TestConvertByCasting {0} instances: {1}s", iterations, TestConvertByCasting()));
        Debug.Log(string.Format("TestConvertByInitializing {0} instances: {1}s", iterations, TestConvertByInitializing()));
    }

    float TestConvertByOperation()
    {
        var timeStart = Time.realtimeSinceStartup;

        for (int i = 0; i < iterations; i++)
        {
            Vector2 v2 = testVector;
        }

        return Time.realtimeSinceStartup - timeStart;
    }

    float TestConvertByCasting()
    {
        var timeStart = Time.realtimeSinceStartup;

        for (int i = 0; i < iterations; i++)
        {
            Vector2 v2 = (Vector2)testVector;
        }

        return Time.realtimeSinceStartup - timeStart;
    }

    float TestConvertByInitializing()
    {
        var timeStart = Time.realtimeSinceStartup;

        for (int i = 0; i < iterations; i++)
        {
            Vector2 v2 = new Vector2(testVector.x, testVector.y);
        }

        return Time.realtimeSinceStartup - timeStart;
    }

}

1
তারা স্পষ্টতই নিক্ষিপ্ত হয়। এটি নতুন রূপান্তর অপারেটরগুলির সংজ্ঞা দিয়ে করা হয় । হাস্যকরভাবে ityক্য '... লঙ্ঘন করে যদি রূপান্তরটি ডেটা ক্ষতি না করার গ্যারান্টিযুক্ত হয়।' অংশ।
অ্যাথোস ভি কে

1
বিভিন্ন পদ্ধতির পরীক্ষা করতে একটি কোড উদাহরণ সহ আমার উত্তর আপডেট করেছে। আপনার ক্ষেত্রে কোনটি দ্রুত তা আমাকে জানান।
ম্যাটিয়াস

1
ফলাফলগুলি রিলিজ / নন-ডিবাগ বিল্ডে কিছুটা বদলে যায় বা যখন ভেক্টর 2 ডেটার আজীবন সময় লুপের বাইরে থাকে (যা সংকলককে নির্দিষ্ট ধরণের অপ্টিমাইজেশন থেকে বিরত রাখে)। আমি 110 থেকে 151 মিলি সেকেন্ডের স্প্রেড বা অ্যাসাইনমেন্টে প্রায় 4 ন্যানোসেকেন্ডের সর্বাধিক পার্থক্য পেয়েছি । সুতরাং আমরা যদি প্রতিটি ফ্রেমে কয়েক হাজার বার এই কাজটি না করি, তবে সম্ভবত এটি সিন্থেটিক উদাহরণে পরিমাপযোগ্য পার্থক্য না থাকলেও, এটি উদ্বেগ করার মতো কোনও বিষয় নয়।
ডিএমগ্রিগরি

1
@ ডিএমজি গ্রেগরি সম্মত এ কারণেই আসল উপাত্ত সহ সঠিক প্রসঙ্গে পারফরম্যান্স টেস্ট চালানো ভাল ধারণা।
ম্যাটিয়াস

1
অন্তর্নিহিত রূপান্তরটি নিয়ে সমস্যাটি yশেষ। এটিকে রূপান্তর Vector3করার সময় Vector2আপনি প্রায় সর্বদা চান xএবং zনা xএবং চান y
কেভিন ক্রামউইদে

6

ভেক্টর 2 এবং ভেক্টর 3 উভয়ই ইউনিটি ইঞ্জিনের একটি কাঠামো , সুতরাং অন্যের থেকে একটি তৈরি করা কেবল স্ট্যাকের উপর একটি স্টোরের বরাদ্দকে জড়িত করে (যদি না গন্তব্য কোনও শ্রেণি অবজেক্টের একটি বৈশিষ্ট্য , যা এই প্রথম পদক্ষেপটি এড়াতে দেয়) এবং দুটি উপাদান মানের অনুলিপি। আপনার দেওয়া দুটি প্রক্রিয়া ঠিক এই আইএল কোডটিতে সংকলন করা উচিত

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


0

আমার পরীক্ষা থেকে, এটি করার সর্বোত্তম উপায় হ'ল ম্যানুয়াল নিজেই নিজের মান নির্ধারণ করে।

Vector2 vector2;
vector2.x = vector3.x;
vector2.y = vector3.y;

এটি আমার ফলাফল যা আমি মাতিয়াস থেকে প্রসারিত করেছি।

টেস্টকন্ট্র্টবাইওরেশন 10000000 উদাহরণ: 0.3220527s

টেস্টকনভার্টবাই কাস্টিং 10000000 উদাহরণ: 0.3226218 এস

টেস্ট কনভার্টবিআই 10000000 উদাহরণস্বরূপ: 0.1916729s

টেস্টকনভার্টবাইম্যানুয়ালআসাইন 10000000 উদাহরণ: 0.09500527s

using UnityEngine;

namespace myTest
{
    public class test: MonoBehaviour 
    {
        readonly int iterations = 10000000;
        Vector3 testVector = new Vector3(3f, 14f, 42f);

        void Start()
        {
            Debug.Log(string.Format("TestConvertByOperation {0} instances: {1}s", iterations, TestConvertByOperation()));
            Debug.Log(string.Format("TestConvertByCasting {0} instances: {1}s", iterations, TestConvertByCasting()));
            Debug.Log(string.Format("TestConvertByInitializing {0} instances: {1}s", iterations, TestConvertByInitializing()));
            Debug.Log(string.Format("TestConvertByManualAssign {0} instances: {1}s", iterations, TestConvertByManualAssign()));
        }

        float TestConvertByOperation()
        {
            var timeStart = Time.realtimeSinceStartup;
            Vector2 v2;
            for (int i = 0; i < iterations; i++)
            {
                v2 = testVector;
            }

            return Time.realtimeSinceStartup - timeStart;
        }

        float TestConvertByCasting()
        {
            var timeStart = Time.realtimeSinceStartup;
            Vector2 v2;
            for (int i = 0; i < iterations; i++)
            {
                v2 = (Vector2)testVector;
            }

            return Time.realtimeSinceStartup - timeStart;
        }

        float TestConvertByInitializing()
        {
            var timeStart = Time.realtimeSinceStartup;
            Vector2 v2;
            for (int i = 0; i < iterations; i++)
            {
                v2 = new Vector2(testVector.x, testVector.y);
            }

            return Time.realtimeSinceStartup - timeStart;
        }
        float TestConvertByManualAssign()
        {
            var timeStart = Time.realtimeSinceStartup;
            Vector2 v2;
            for (int i = 0; i < iterations; i++)
            {
                v2.x = testVector.x;
                v2.y = testVector.y;
            }

            return Time.realtimeSinceStartup - timeStart;
        }
    }
}

দয়া করে নোট করুন, আমি এটি unityক্য সংস্করণ 5.6.5 দিয়ে পরীক্ষা করি

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.