কীভাবে দ্রাবক কোন বস্তুর চলাচল মসৃণ করতে কাজ করে?


10

আমি গত 8 মাস ধরে বা তার সাথে কোনও সত্যিকারের আনন্দ নিয়ে কিছু অনুরূপ প্রশ্ন জিজ্ঞাসা করেছি, তাই আমি প্রশ্নটিকে আরও সাধারণ করে তুলছি।

আমার কাছে একটি অ্যান্ড্রয়েড গেম রয়েছে যা ওপেনজিএল ইএস ২.০। এর মধ্যে আমার নীচের গেম লুপ রয়েছে:

আমার লুপটি একটি নির্দিষ্ট সময় ধাপের নীতিতে কাজ করে (ডিটি = 1 / টিক্স পার্সেকেন্ড )

loops=0;

    while(System.currentTimeMillis() > nextGameTick && loops < maxFrameskip){

        updateLogic(dt);
        nextGameTick+=skipTicks;
        timeCorrection += (1000d/ticksPerSecond) % 1;
        nextGameTick+=timeCorrection;
        timeCorrection %=1;
        loops++;

    }

    render();   

আমার সংহতকরণ এটির মতো কাজ করে:

sprite.posX+=sprite.xVel*dt;
sprite.posXDrawAt=sprite.posX*width;

এখন, সমস্ত কিছু আমার ইচ্ছা মত কাজ করে। আমি উল্লেখ করতে পারি যে আমি কোনও বস্তু 2.5 সেকেন্ডের মধ্যে একটি নির্দিষ্ট দূরত্বের (পর্দার প্রস্থ বলে) জুড়ে যেতে চাই এবং এটি ঠিক এটি করবে। আমি আমার গেম লুপটিতে যে ফ্রেমটি ছাড়তে দিই তা ছাড়ার কারণে, আমি যেকোন ডিভাইসে এটি করতে পারি এবং এটি সর্বদা 2.5 সেকেন্ড সময় নেয়।

সমস্যা

তবে সমস্যাটি হ'ল যখন কোনও রেন্ডার ফ্রেম এড়িয়ে যায়, গ্রাফিক স্টাটার ut এটি অত্যন্ত বিরক্তিকর। যদি আমি ফ্রেমগুলি এড়িয়ে যাওয়ার ক্ষমতাটি সরিয়ে ফেলে তবে আপনার পছন্দ অনুসারে সবকিছু মসৃণ তবে বিভিন্ন ডিভাইসে বিভিন্ন গতিতে চলবে। সুতরাং এটি কোনও বিকল্প নয়।

ফ্রেমটি এড়িয়ে যায় কেন আমি এখনও নিশ্চিত নই, তবে আমি উল্লেখ করতে চাই যে এটি খারাপ কাজের সাথে কিছুই করার নয় , আমি কোডটি ঠিক 1 টি ছোট স্প্রাইটে নিয়েছি এবং কোনও যুক্তি নেই (প্রয়োজনীয় যুক্তি ব্যতীত স্প্রাইটটি সরান) এবং আমি এখনও ফ্রেমগুলি এড়িয়ে চলেছি। এবং এটি একটি গুগল নেক্সাস 10 ট্যাবলেটে রয়েছে (এবং উপরে উল্লিখিত হিসাবে, যেকোনোভাবে ডিভাইসগুলিতে গতি সামঞ্জস্য রাখতে আমার ফ্রেম স্কিপিং প্রয়োজন)।

সুতরাং, আমার কাছে কেবলমাত্র অন্য বিকল্পটি হ'ল আন্তঃবিবর্তন (বা এক্সট্রাপোলেশন) ব্যবহার করা, আমি এখানে প্রতিটি নিবন্ধ পড়েছি কিন্তু এটি কীভাবে কাজ করে তা বুঝতে কোনও সত্যই আমাকে সহায়তা করেনি এবং আমার চেষ্টা করা সমস্ত বাস্তবায়ন ব্যর্থ হয়েছে।

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

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

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

সম্পাদন করা

কিছু অতিরিক্ত তথ্য - গেম লুপে ব্যবহৃত ভেরিয়েবল।

private long nextGameTick = System.currentTimeMillis();
//loop counter
private int loops;
//Amount of frames that we will allow app to skip before logic is affected
private final int maxFrameskip = 5;                         
//Game updates per second
final int ticksPerSecond = 60;
//Amount of time each update should take        
private final int skipTicks = (1000 / ticksPerSecond);
float dt = 1f/ticksPerSecond;
private double timeCorrection;

এবং ডাউনভোটের কারণটি ...................?
বুঙ্গলবোনস

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

আমি আপনার ডাউনভোট ছিল না, তবে দয়া করে একটি অংশ পরিষ্কার করুন। আপনি যখন কোনও ফ্রেম এড়ানো যায় তখন গ্রাফিক্সের স্টাটার বলেছিলেন। এটিকে সুস্পষ্ট বক্তব্যের মতো মনে হচ্ছে (একটি ফ্রেম মিস হয়েছে, দেখে মনে হচ্ছে কোনও ফ্রেম মিস হয়েছে)। তাহলে আপনি কী এড়িয়ে যাওয়ার বিষয়টি আরও ভালোভাবে ব্যাখ্যা করতে পারেন? কি কিছু অঘটন ঘটে? যদি তা না হয় তবে এটি একটি অবিস্মরণীয় সমস্যা হতে পারে, কারণ ফ্রেমরেট ডুবলে আপনি মসৃণ গতি পেতে পারেন না।
শেঠ ব্যাটিন

ধন্যবাদ, নোক্রিটিন, লোকেরা যখন কোনও ব্যাখ্যা ছাড়াই নীচে নামবে তখন তা সত্যিই আমাকে তুচ্ছ করে তোলে। @ শেঠব্যাটিন, দুঃখিত, হ্যাঁ অবশ্যই, আপনি ঠিক বলেছেন, ফ্রেম এড়িয়ে চলা ঝক্কি ঘটাচ্ছে, তবে, কিছুটা ফাঁকে ফাঁকে ফাঁকে ফেলা উচিত , যেমন আমি উপরে বলেছি, আমার কিছুটা সাফল্য হয়েছে (তবে সীমাবদ্ধ)। আমি যদি ভুল হয়ে থাকি তবে আমি অনুমান করি যে প্রশ্নটি হবে, আমি কীভাবে এটি বিভিন্ন ডিভাইসগুলিতে একই গতিতে সহজেই চালাতে পারি?
বুঙ্গলবোনস

4
সাবধানে সেই নথিগুলি পুনরায় পড়ুন। রেন্ডারিং পদ্ধতিতে তারা আসলে বস্তুর অবস্থান পরিবর্তন করে না। তারা কেবল পদ্ধতির আপাত অবস্থানটি তার শেষ অবস্থানের ভিত্তিতে এবং বর্তমান সময়টি কতটা সময় পার করেছে তার ভিত্তিতে পরিবর্তিত করে।
আক্রমণ

উত্তর:


5

গতি মসৃণভাবে প্রদর্শিত হতে দুটি জিনিস গুরুত্বপূর্ণ, প্রথমটি স্পষ্টতই আপনি যখন রেন্ডারটি প্রত্যাশিত অবস্থার সাথে মিলিত হওয়া প্রয়োজন যখন ফ্রেমটি ব্যবহারকারীর সামনে উপস্থাপন করা হয়, দ্বিতীয়টি আপনাকে ব্যবহারকারীর সামনে ফ্রেম উপস্থাপন করতে হবে অপেক্ষাকৃত নির্ধারিত বিরতিতে। T + 10ms এ একটি ফ্রেম উপস্থাপন করা হবে, তারপরে অন্যটি টি + 30 মিমি, তারপরে অন্য টি + 40 মিমিতে, ব্যবহারকারীকে বিচার করবে বলে উপস্থিত হবে, এমনকি সেই সময়ের জন্য যা প্রদর্শিত হবে তা সিমুলেশন অনুসারে সঠিক হয়।

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

আপনার সম্ভবত যা দরকার তা হ'ল আপনার রেন্ডারের ঠিক আগে অপেক্ষা, এটি নিশ্চিত করে যে আপনি কেবল রেন্ডার বিরতি শুরু করার সাথে সাথে রেন্ডারিং শুরু করে। আদর্শভাবে এটি অভিযোজিত হওয়া উচিত: যদি আপনি আপডেট / রেন্ডার করতে খুব বেশি সময় নিয়ে থাকেন এবং ইতিমধ্যে বিরতিটি শুরু হয়ে গেছে, আপনার অবিলম্বে রেন্ডার করা উচিত, তবে অন্তরালের দৈর্ঘ্যও বাড়িয়ে দেওয়া উচিত, যতক্ষণ না আপনি ধারাবাহিকভাবে রেন্ডার এবং আপডেট করতে পারবেন এবং এখনও পৌঁছাতে পারবেন না অন্তর শেষ হওয়ার আগে পরবর্তী রেন্ডার করুন। আপনার যদি অতিরিক্ত সময় দেওয়ার মতো সময় থাকে তবে আপনি আবার দ্রুত রেন্ডার করতে আস্তে আস্তে বিরতি হ্রাস করতে পারবেন (অর্থাত ফ্রেমের হার বৃদ্ধি করুন)।

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

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

সুতরাং এটি সিউডোকোড লুপে রাখতে আমার মনে হয় আপনার আরও কিছু এর মতো দরকার:

InitialiseWorldState();

previousTime = currentTime = 0.0;
renderInterval = 1.0 / 60.0; //A nice high starting interval

subFrameProportion = 1.0; //100% currentFrame, 0% previousFrame

while (true)
{
    frameStart = ActualTime();

    //Render the world state as if it was some proportion 
    // between previousTime and currentTime
    // E.g. if subFrameProportion is 0.5, previousTime is 0.1 and 
    // currentTime is 0.2, then we actually want to render the state
    // as it would be at time 0.15. We'd do that by interpolating 
    // between movingObject.previousPosition and movingObject.currentPosition
    // with a lerp parameter of 0.5
    Render(subFrameProportion); 

    //Check we've not taken too long and missed our render interval
    frameTime = ActualTime() - frameStart;
    if (frameTime > renderInterval)
    {
        renderInterval = frameTime * 1.2f; //Give us a more reasonable render interval that we actually have a chance of hitting
    }

    expectedFrameEnd = frameStart + renderInterval;

    //Loop until it's time to render the next frame
    while (ActualTime() < expectedFrameEnd)
    {
        //step the simulation forward until it has moved just beyond the frame end
        if (previousTime < expectedFrameEnd) &&
            currentTime >= expectedFrameEnd)
        {
            previousTime = currentTime;

            Update();
            currentTime += fixedTimeStep;

            //After the update, all objects will be in the position they should be for
            // currentTime, **but** they also need to remember where they were before,
            // so that the rendering can draw them somewhere between previousTime and
            //  currentTime

            //Check again we've not taken too long and missed our render interval
            frameTime = ActualTime() - frameStart;
            if (frameTime > renderInterval)
            {
                renderInterval = frameTime * 1.2f; //Give us a more reasonable render interval that we actually have a chance of hitting
                expectedFrameEnd = frameStart + renderInterval
            }
        }
        else
        {
            //We've brought the simulation to just after the next time
            // we expect to render, so we just want to wait.
            // Ideally sleep or spin in a tight loop while waiting.
            timeTillFrameEnd = expectedFrameEnd - ActualTime();
            sleep(timeTillFrameEnd);
        }
    }

    //How far between update timesteps (i.e. previousTime and currentTime)
    // will we be at the end of the frame when we start the next render?
    subFrameProportion = (expectedFrameEnd - previousTime) / (currentTime - previousTime);
}

এটির জন্য সমস্ত অবজেক্টের কাজ করার জন্য তাদের আগে কোথায় ছিল এবং এখন তারা কোথায় ছিল সে সম্পর্কে জ্ঞান সংরক্ষণ করা দরকার, যাতে রেন্ডারিংটি অবজেক্টটি কোথায় তা তার জ্ঞান ব্যবহার করতে পারে।

class MovingObject
{
    Vector velocity;
    Vector previousPosition;
    Vector currentPosition;

    Initialise(startPosition, startVelocity)
    {
        currentPosition = startPosition; // position at time 0
        velocity = startVelocity;
        //ignore previousPosition because we should never render before time 0
    }

    Update()
    {
        previousPosition = currentPosition;
        currentPosition += velocity * fixedTimeStep;
    }

    Render(subFrameProportion)
    {
        Vector actualPosition = 
            Lerp(previousPosition, currentPosition, subFrameProportion);
        RenderAt(actualPosition);
    }
}

এবং আসুন মিলসেকেন্ডে একটি টাইমলাইন রাখি, বলে যে রেন্ডারিংটি সম্পূর্ণ হতে 3 মিমি সময় নেয়, আপডেট করাতে 1 মিমি লাগে, আপনার আপডেটের সময়-পদক্ষেপটি 5 এমএসে স্থির করা হয়, এবং আপনার রেন্ডার টাইমস্টেপ শুরু হয় (এবং অবশেষে) 16 মিমি [60Hz] এ।

0   1   2   3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30  31  32  33
R0          U5  U10 U15 U20 W16                                 R16         U25 U30 U35 W32                                 R32
  1. প্রথমে আমরা 0 সময় সূচনা (তাই বর্তমান সময় = 0)
  2. আমরা 1.0 (100% কারেন্টটাইম) এর অনুপাতের সাথে রেন্ডার করি, যা 0 সময়ে বিশ্বকে আঁকবে
  3. যখন এটি শেষ হয়, আসল সময় 3 হয় এবং আমরা 16 অবধি ফ্রেমটির সমাপ্তি আশা করি না, তাই আমাদের কিছু আপডেট চালানো দরকার
  4. টি + 3: আমরা 0 থেকে 5 পর্যন্ত আপডেট করি (তারপরে কারেন্টটাইম = 5, পূর্ববর্তী সময় = 0)
  5. টি + 4: ফ্রেম শেষ হওয়ার আগে এখনও, তাই আমরা 5 থেকে 10 এ আপডেট করব
  6. টি + 5: ফ্রেম শেষ হওয়ার আগে এখনও, তাই আমরা 10 থেকে 15 পর্যন্ত আপডেট করি
  7. টি + 6: ফ্রেম শেষ হওয়ার আগে এখনও, তাই আমরা 15 থেকে 20 পর্যন্ত আপডেট করি
  8. টি + 7: ফ্রেম শেষ হওয়ার আগে এখনও, তবে কারেন্টটাইম ফ্রেমের শেষের বাইরে। আমরা আর কোনও সিমুলেট করতে চাই না কারণ এটি করার ফলে আমরা পরবর্তী সময়টি রেন্ডার করতে চাইলে ছাড়িয়ে যায়। পরিবর্তে আমরা পরবর্তী রেন্ডার ব্যবধানের জন্য চুপচাপ অপেক্ষা করি (16)
  9. টি + 16: এটি আবার রেন্ডার করার সময়। পূর্ববর্তী সময়টি 15, কারেন্টটাইম 20 হয় So তাই আমরা যদি টি + 16 রেন্ডার করতে চাই, আমরা 5 মিমি দীর্ঘ টাইমস্টেপের মধ্য দিয়ে 1 মিমি। সুতরাং আমরা ফ্রেমের মাধ্যমে 20% পথ (অনুপাত = 0.2)। যখন আমরা রেন্ডার করি, আমরা তাদের পূর্ববর্তী অবস্থান এবং তাদের বর্তমান অবস্থানের মধ্যে অবজেক্টগুলিকে 20% আঁকি।
  10. 3 এ ফিরে লুপ করুন এবং অনির্দিষ্টকালের জন্য চালিয়ে যান।

সময়ের অনেক আগেই সিমুলেট করার বিষয়ে এখানে আরও একটি উপকার রয়েছে, অর্থাত ফ্রেমটি রেন্ডার হওয়ার আগেই ঘটেছে তবুও ব্যবহারকারীর ইনপুটগুলি উপেক্ষা করা যেতে পারে, তবে লুপটি সহজেই সিমুলেট করছে না এমনটা নিশ্চিত না হওয়া পর্যন্ত এই বিষয়ে চিন্তা করবেন না।


এনবি: সিউডোকোড দুটি উপায়ে দুর্বল। প্রথমত এটি ডেথ-সর্পিল কেসটি ধরে না (আপডেটের জন্য এটি ফিক্সডটাইমস্টেপের চেয়ে বেশি সময় নেয়, যার অর্থ সিমুলেশনটি আরও পিছনে পড়ে, কার্যকরভাবে একটি অসীম লুপ), দ্বিতীয়ত রেন্ডারআইন্টারভাল আর কখনও সংক্ষিপ্ত হয় না। অনুশীলনে আপনি অবিলম্বে রেন্ডার ইনটারওয়ালটি বাড়িয়ে তুলতে চান তবে সময়ের সাথে সাথে এটি ধীরে ধীরে সংক্ষিপ্ত করে যথাসম্ভব যথাসম্ভব যথাসময়ে ফ্রেম সময়ের কিছুটা সহনীয়তার মধ্যে রাখতে পারেন। অন্যথায় একটি খারাপ / দীর্ঘ আপডেট আপনাকে চিরকালের জন্য কম ফ্রেমেটের সাথে জিন করে দেবে।
মিঃ ক্র্যাঙ্কি

এই @ মিঃ ক্র্যাঙ্কির জন্য ধন্যবাদ, প্রকৃতপক্ষে, আমি আমার লুপে "সীমাবদ্ধ" রেন্ডারিংয়ের জন্য যুগে যুগে লড়াই করে যাচ্ছি! কীভাবে এটি করা যায় তা ঠিক কাজ করতে পারিনি এবং ভাবলাম এটি যদি সমস্যাগুলির মধ্যে একটি হতে পারে। আমি এর মাধ্যমে যথাযথভাবে পড়ব এবং আপনার পরামর্শগুলিকে চেষ্টা করে দেখব, ফিরে রিপোর্ট করব! আবার ধন্যবাদ :-)
বুঙ্গলবোনস

ধন্যবাদ @ মিঃ ক্র্যাঙ্কি, ঠিক আছে, আমি আপনার উত্তরটি পড়েছি এবং পুনরায় পড়েছি কিন্তু আমি এটি বুঝতে পারি না :-( আমি এটি বাস্তবায়নের চেষ্টা করেছি তবে এটি আমাকে একটি ফাঁকা স্ক্রিন দিয়েছে ally সত্যিই এটির সাথে লড়াই করছি previous পূর্ববর্তী ফ্রেম এবং বর্তমান ফ্রেম আমি ধরে নিলাম আমার চলমান বস্তুর পূর্বের এবং বর্তমান অবস্থানের সাথে সম্পর্কিত? এছাড়াও, "কারেন্ট ফ্রেম = আপডেট ();" লাইনটি সম্পর্কে কী - আমি এই লাইনটি পাই না, এর মানে কি কল আপডেট (); কারণ আমি দেখতে পাচ্ছি না কোথায়? অন্যথায় আমি আপডেট কল করছি? বা এটির অর্থ কি বর্তমানের ফ্রেম (অবস্থান) এটির নতুন মূল্য হিসাবে সেট করা? আপনার সহায়তার জন্য আবারও ধন্যবাদ !!
বুঙ্গলবোনস

হ্যাঁ, কার্যকরভাবে। আমি পূর্ববর্তী ফ্রেম এবং কারেন্ট ফ্রেমকে আপডেট এবং ইনিশিয়াল ওয়ার্ল্ডস্টেটের রিটার্ন মান হিসাবে রাখার কারণ হ'ল দুটি বিশ্বব্যাপী আপডেটের ধাপের মধ্যে পার্ট-ওয়ে হয়ে রেন্ডারিংয়ের জন্য বিশ্বকে আঁকার অনুমতি দেওয়ার জন্য, আপনার কেবলমাত্র প্রত্যেকের বর্তমান অবস্থানই নেই আপনি আঁকতে চান اعتراض, কিন্তু তাদের পূর্ববর্তী অবস্থানগুলি। আপনি প্রতিটি বস্তু উভয় মান অভ্যন্তরীণভাবে সংরক্ষণ করতে পারেন, যা অতিরঞ্জিত হয়।
মিঃ ক্র্যাঙ্কি

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

3

সবাই আপনাকে যা বলে চলেছে তা সঠিক। আপনার রেন্ডার যুক্তিতে আপনার স্প্রাইটের সিমুলেশন অবস্থানটি কখনও আপডেট করবেন না।

এটির মতো চিন্তা করুন, আপনার স্প্রাইটের 2 অবস্থান রয়েছে; যেখানে সিমুলেশন বলে যে তিনি শেষ সিমুলেশন আপডেট হিসাবে আছেন, এবং যেখানে স্প্রাইটটি রেন্ডার করা হয়েছে। তারা দুটি সম্পূর্ণ ভিন্ন স্থানাঙ্ক।

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

তা ছাড়া আপনার মনে হয় ভাল বোঝাপড়া আছে। আশাকরি এটা সাহায্য করবে.


দুর্দান্ত @ উইলিয়ামমরিসন - এটি নিশ্চিত করার জন্য ধন্যবাদ, আমি আসলেই 100% নিশ্চিত ছিলাম না যে এটিই ছিল, এখন আমি মনে করি আমি এই কাজটি কিছুটা ডিগ্রী অর্জনের পথে যাচ্ছি - চিয়ার্স!
বুঙ্গলবোনস

কেবলমাত্র কৌতূহলী @ উইলিয়ামমরিসন, এই থ্রো-ডাউন স্থানাঙ্কগুলি ব্যবহার করে স্প্রেটসের সমস্যা কীভাবে প্রশমিত হবে যেগুলি 'এমবেডড' বা 'ঠিক উপরে' অন্যান্য বস্তুগুলি আঁকবে - এর স্পষ্ট উদাহরণ, 2 ডি গেমের শক্ত বস্তু হওয়া। আপনি কি রেন্ডার সময় আপনার সংঘর্ষের কোডটি চালাতে চান?
বুঙ্গলবোনস

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

হ্যাঁ এটি একটি জটিল সমস্যা সমাধান করা। আপনি যদি এখানে নজর রাখতে চান বা কোনও কিছু অবদান রাখতে চান তবে আমি এখানে গেমদেব.স্ট্যাকেক্সেঞ্জার / কুইকশানস / ৮৮৩৩০/২ সম্পর্কিত একটি পৃথক প্রশ্ন জিজ্ঞাসা করেছি। এখন, আপনি আপনার মন্তব্যে যা পরামর্শ দিয়েছেন, আমি কি এটি ইতিমধ্যে করছি না? (পূর্ববর্তী এবং বর্তমান ফ্রেমের মধ্যে ইন্টারপোলটিং)?
বুঙ্গলবোনস

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