首页 > 其他分享 >Unity用CPU上下翻转Texture2D的最优解

Unity用CPU上下翻转Texture2D的最优解

时间:2023-08-07 12:00:35浏览次数:41  
标签:int Color32 height width Unity originalColors Texture2D Copy CPU

将Texture2D上下翻转效率的进化史

以下数据都是基于8000x4000全景图进行对比的

1、最简单也是最先想到的,直接根据索引塞到另一个数组里,耗时:0.3061805秒

        static Color32[] FlipColors(Color32[] originalColors, int width, int height)
        {
            Color32[] flippedColors = new Color32[originalColors.Length];
            for (int y = 0; y < height; y++)
            {
                for (int x = 0; x < width; x++)
                {
                    int originalIndex = y * width + x;
                    int flippedIndex = (height - y - 1) * width + x;

                    flippedColors[flippedIndex] = originalColors[originalIndex];
                }
            }
            return flippedColors;

        }

 

2、使用Array.Copy速度更快,耗时:0.1576061秒

        static Color32[] FlipColors(Color32[] originalColors, int width, int height)
        {

            for (int y = 0; y < height / 2; y++)
            {
                int topRowIndex = y * width;
                int bottomRowIndex = (height - y - 1) * width;

                // 交换顶部和底部的像素行
                Color32[] tempRow = new Color32[width];
                Array.Copy(originalColors, topRowIndex, tempRow, 0, width);
                Array.Copy(originalColors, bottomRowIndex, originalColors, topRowIndex, width);
                Array.Copy(tempRow, 0, originalColors, bottomRowIndex, width);
            }
            return originalColors;

        }

 

3、在for循环里创建数据会产生大量垃圾,可以将new循环外面,耗时:0.0847777秒

        static Color32[] FlipColors(Color32[] originalColors, int width, int height)
        {
            Color32[] tempRow = new Color32[width];
            for (int y = 0; y < height / 2; y++)
            {
                int topRowIndex = y * width;
                int bottomRowIndex = (height - y - 1) * width;

                // 交换顶部和底部的像素行
                Array.Copy(originalColors, topRowIndex, tempRow, 0, width);
                Array.Copy(originalColors, bottomRowIndex, originalColors, topRowIndex, width);
                Array.Copy(tempRow, 0, originalColors, bottomRowIndex, width);
            }
            return originalColors;
        }

 

第3种方式理论上是通过CPU翻转Texture2D的性能极限了,没有其他逻辑比他速度更快了!!!

但是,此处转折一下,打败自己的从来不是对手,而是另一个赛道的人,在GPU面前,都是渣渣,写个Shader在GPU上处理将比上述方式更快,而且也比较简单,后面有时间再一篇文章介绍

下面我们还是根据第3种方式,把其他情况的翻转完善下:

1、上下翻转,参考上述代码

2、水平翻转,

标签:int,Color32,height,width,Unity,originalColors,Texture2D,Copy,CPU
From: https://www.cnblogs.com/Jason-c/p/17611084.html

相关文章

  • Unity的IUnityLinkerProcessor:深入解析与实用案例
    UnityIUnityLinkerProcessorUnityIUnityLinkerProcessor是Unity引擎中的一个接口,它允许开发者在Unity项目构建时对代码进行链接处理。这个接口可以用来优化项目构建大小,减少不必要的代码和资源,提高项目的性能和加载速度。接口定义IUnityLinkerProcessor接口定义如下:namespac......
  • [Unity]URP HLSL Shader自用模板
    Shader"URP/falushan"{Properties//着色器的输入{_BaseMap("Texture",2D)="white"{}}SubShader{Tags{"RenderType"="Opaque""RenderPipeL......
  • Unity___设计模式总结
    模板模式子类可以继承父类的方法单例模式饿汉式游戏一开始就加载privatestaticTinstance=newT();懒汉式策略模式可以参考Sort()函数或者说回调函数在使用sort()函数时,当系统无法自动排序时需要传递一个比较类或者比较函数给方法;观察者模式(事件中心)事件源(......
  • 开始学习unity
        作为一个在程序行业混了十几年的老兵,现在才接触unity,确实是有点无奈,但这次,我是整装待发,不仅是要学习unity,更是要学习unrealengine,不仅是学习上层的功能开发技术,更是要深入底层,去学习它的渲染,及最核心的技术,同时,也仅限于技术,不再追求太多的过程,就像考试一样,而不像上班......
  • 查看unity与Aanroid Studio中Gradle版本
    Unity:Unity使用的Gradle版本:复制红框中的链接打开版本为:6.1.1Unity使用的Gradle插件版本:路径:E:\Unity2021.3.4f1c1\Editor\Data\PlaybackEngines\AndroidPlayer\Tools\GradleTemplates记事本打开baseProjectTemplate.gradle版本为:4.0.1AanroidStudio: ......
  • Unity 编辑器选择器工具类Selection 常用函数和用法
    Unity编辑器选择器工具类Selection常用函数和用法点击封面跳转下载页面简介在Unity中,Selection类是一个非常有用的工具类,它提供了许多函数和属性,用于操作和管理编辑器中的选择对象。本文将介绍Selection类的常用函数和用法,并提供相应的示例代码。静态属性1.activeConte......
  • 【更新中】【Unity/UE】基础仿原神渲染
    前言【本文持续更新中】终于把一直想做一做的仿原神渲染做了一下。原神出来也有段时间了,各路大佬的逆向早就做完了,所以最近做的其实复刻大佬们的工程,难度并不大。废话不多说,先看效果。Unity UE (UE的边缘光老是闪就关了) 两个版本都没有加上雾效,泛光之间的后处理效果,......
  • unity如何让物体与特定物体之间不发生碰撞
    https://blog.csdn.net/Cy_coding/article/details/111048077unity中我们普遍使用的是碰撞器来实现各个物体的碰撞体积,例如Boxcollider,SphereCollider。在实现游戏的过程中,如果不想要物体与特定物体产生碰撞,或反之,只想让碰撞发生在特定物体之间时,我们就需要配置layer......
  • CPU优化方案
    应用程序优化首先,从应用程序的角度来说,降低CPU使用率的最好方法当然是,排除所有不必要的工作,只保留最核心的逻辑。比如减少循环的层次、减少递归、减少动态内存分配等等。除此之外,应用程序的性能优化也包括很多种方法,最常见的几种:编译器优化:很多编译器都会提供优化选项,适当......
  • Unity 编辑器选择器工具类Selection 常用函数和用法
    Unity编辑器选择器工具类Selection常用函数和用法点击封面跳转下载页面简介在Unity中,Selection类是一个非常有用的工具类,它提供了许多函数和属性,用于操作和管理编辑器中的选择对象。本文将介绍Selection类的常用函数和用法,并提供相应的示例代码。静态属性1.activeContex......