JerboaBurrow / Hop

Lightweight, cross-platform, 2D game engine | ECS; Lua Console; Physics; Tile based
MIT License
0 stars 1 forks source link

Vectorisation in o-w collisions #131

Open Jerboa-app opened 9 months ago

Jerboa-app commented 9 months ago

We use marching squares/ tile based collision resolution, currently via branches.

Jerboa-app commented 9 months ago
#include <vector>
#include <iostream>
#include <memory>
#include <cmath>
#include <iterator>

inline void doSomeStuff(double & y, double x, int i)
{   
    y = std::cos(x);
}

inline void doSomeOtherStuff(double & y, double x, int i)
{
    y = std::cos(x);
}

typedef void (*fptr) (double &, double, int);

void doWork(std::vector<double> & x, std::vector<double> & y)
{
        // vectorises
    for (int i = 0; i < 1024; i++)
    {
        //y[i] = std::sqrt(x[i]); nb sqrt requires -ffast-math
        doSomeStuff(y[i], x[i], i);
    }
}

void doWorkFptrs(std::vector<double> & x, std::vector<double> & y, std::vector<fptr> & fs)
{

        // missed: couldn't vectorize loop
        // missed: statement clobbers memory: _2 (_8, _3, i_22);
        //  missed: statement clobbers memory: _2 (_8, _3, i_22);
    for (int i = 0; i < 1024; i++)
    {
        fs[i](y[i], x[i], i);
    }
}

int main()
{
    std::vector<fptr> work;
    std::vector<double> x;
    std::vector<double> y(0.0, 1024);
    for (unsigned i = 0; i < 1024; i++)
    {
        if (std::cos(i) > 0.0)
        {
            x.push_back(3.14159*std::sqrt(i));
        }
        else
        {
            x.push_back(std::sqrt(i));
        }
        i % 2 == 0 ? work.push_back(&doSomeStuff) : work.push_back(&doSomeOtherStuff);
    }

    doWork(x, y);

    for (unsigned i = 0; i < 1024; i++)
    {
        std::cout << y[i] << "\n";
    }

    doWorkFptrs(x, y, work);

    for (unsigned i = 0; i < 1024; i++)
    {
        std::cout << y[i] << "\n";
    }

}
Jerboa-app commented 9 months ago